1/*
2 * Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7// we don't want to have the inline assembly included here
8#ifndef _NO_INLINE_ASM
9#	define _NO_INLINE_ASM 1
10#endif
11
12#include "support/TLS.h"
13#include "tls.h"
14
15
16static int32 gNextSlot = TLS_FIRST_FREE_SLOT;
17
18
19int32
20tls_allocate(void)
21{
22	int32 next = atomic_add(&gNextSlot, 1);
23	if (next >= TLS_MAX_KEYS)
24		return B_NO_MEMORY;
25
26	return next;
27}
28
29
30void *
31tls_get(int32 index)
32{
33	void *ret;
34	__asm__ __volatile__ (
35		"movl	%%fs:(,%%edx, 4), %%eax \n\t"
36		: "=a"(ret) : "d"(index) );
37	return ret;
38}
39
40
41void **
42tls_address(int32 index)
43{
44	void **ret;
45	__asm__ __volatile__ (
46		"movl	%%fs:0, %%eax \n\t"
47		"leal	(%%eax, %%edx, 4), %%eax \n\t"
48		: "=a"(ret) : "d"(index) );
49	return ret;
50}
51
52
53void
54tls_set(int32 index, void *value)
55{
56	__asm__ __volatile__ (
57		"movl	%%eax, %%fs:(,%%edx, 4) \n\t"
58		: : "d"(index), "a"(value) );
59}
60
61