1 module rt.sections;
2 
3 import rtoslink;
4 
5 version(LWDR_TLS):
6 
7 private {
8 	extern(C) {
9 		__gshared void* _tdata;
10 		__gshared void* _tdata_size;
11 		__gshared void* _tbss;
12 		__gshared void* _tbss_size;
13 	}
14 
15 	struct TlsLinkerParams
16 	{
17 		void* data;
18 		size_t dataSize;
19 		void* bss;
20 		size_t bssSize; 
21 		size_t fullSize;
22 	}
23 
24 	TlsLinkerParams getTlsLinkerParams() nothrow @nogc 
25 	{
26 		TlsLinkerParams param;
27 		param.data = cast(void*)&_tdata;
28 		param.dataSize = cast(size_t)&_tdata_size;
29 		param.bss = cast(void*)&_tbss;
30 		param.bssSize = cast(size_t)&_tbss_size;
31 		param.fullSize = param.dataSize + param.bssSize;
32 		return param;
33 	}
34 
35 	enum ARM_EABI_TCB_SIZE = 8;
36 }
37 
38 enum tlsPointerIndex = 1;
39 
40 void[] initTLSRanges() nothrow @nogc
41 {
42 	TlsLinkerParams tls = getTlsLinkerParams;
43 	void* memory = rtosbackend_heapalloc(tls.fullSize);
44 
45 	import core.stdc.string : memcpy, memset;
46 
47 	memcpy(memory, tls.data, tls.dataSize);
48 	memset(memory + tls.dataSize, 0, tls.bssSize);
49 
50 	rtosbackend_setTLSPointerCurrThread(memory, tlsPointerIndex);
51 
52 	return memory[0 .. tls.fullSize];
53 }
54 
55 extern(C) void* __aeabi_read_tp() nothrow @nogc
56 {
57 	return rtosbackend_getTLSPointerCurrThread(tlsPointerIndex) - ARM_EABI_TCB_SIZE;
58 }