forked from includeos/IncludeOS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtls.cpp
More file actions
41 lines (35 loc) · 1.15 KB
/
Copy pathtls.cpp
File metadata and controls
41 lines (35 loc) · 1.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <cassert>
#include <cstdio>
#include <cstring>
extern char _TDATA_START_;
extern char _TDATA_END_;
extern char _TBSS_START_;
extern char _TBSS_END_;
namespace tls
{
static size_t align_value(size_t size)
{
if (size & 15) size += 16 - (size & 15);
return size;
}
size_t get_tls_size()
{
const auto TDATA_SIZE = &_TDATA_END_ - &_TDATA_START_;
const auto TBSS_SIZE = &_TBSS_END_ - &_TBSS_START_;
return align_value(TDATA_SIZE) + align_value(TBSS_SIZE);
}
void fill_tls_data(char* data)
{
const auto TDATA_SIZE = &_TDATA_END_ - &_TDATA_START_;
const auto TBSS_SIZE = &_TBSS_END_ - &_TBSS_START_;
// copy over APs .tdata
char* tdata = data;
memcpy(tdata, &_TDATA_START_, TDATA_SIZE);
// clear APs .tbss
char* tbss = data + align_value(TDATA_SIZE);
memset(tbss, 0, TBSS_SIZE);
//printf("TLS at %p is %lu -> %lu bytes\n", data, TDATA_SIZE + TBSS_SIZE, align_value(TDATA_SIZE) + align_value(TBSS_SIZE));
//printf("DATA at %p is %lu -> %lu bytes\n", tdata, TDATA_SIZE, align_value(TDATA_SIZE));
//printf("TBSS at %p is %lu -> %lu bytes\n", tbss, TBSS_SIZE, align_value(TBSS_SIZE));
}
}