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 }