1/* 2 * Copyright 2014, Paweł Dziepak, pdziepak@quarnos.org. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef ELF_TLS_H 6#define ELF_TLS_H 7 8 9#include "runtime_loader_private.h" 10#include "utility.h" 11 12 13class TLSBlock; 14 15class TLSBlockTemplate { 16public: 17 TLSBlockTemplate() { } 18 inline TLSBlockTemplate(void* address, size_t fileSize, 19 size_t memorySize); 20 21 void SetGeneration(unsigned generation) 22 { fGeneration = generation; } 23 unsigned Generation() const { return fGeneration; } 24 25 void SetBaseAddress(addr_t baseAddress); 26 27 TLSBlock CreateBlock(); 28 29private: 30 unsigned fGeneration; 31 32 void* fAddress; 33 size_t fFileSize; 34 size_t fMemorySize; 35}; 36 37class TLSBlockTemplates { 38public: 39 static TLSBlockTemplates& Get(); 40 41 unsigned Register(const TLSBlockTemplate& block); 42 void Unregister(unsigned dso); 43 44 void SetBaseAddress(unsigned dso, addr_t baseAddress); 45 46 unsigned GetGeneration(unsigned dso) const; 47 48 TLSBlock CreateBlock(unsigned dso); 49 50private: 51 inline TLSBlockTemplates(); 52 53 static TLSBlockTemplates* fInstance; 54 55 unsigned fGeneration; 56 57 utility::vector<TLSBlockTemplate> fTemplates; 58 utility::vector<unsigned> fFreeDSOs; 59}; 60 61 62TLSBlockTemplate::TLSBlockTemplate(void* address, size_t fileSize, 63 size_t memorySize) 64 : 65 fAddress(address), 66 fFileSize(fileSize), 67 fMemorySize(memorySize) 68{ 69} 70 71 72void* get_tls_address(unsigned dso, addr_t offset); 73void destroy_thread_tls(); 74 75 76#endif // ELF_TLS_H 77