Rev 1866 | Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1866 | Rev 2061 | ||
---|---|---|---|
Line 53... | Line 53... | ||
53 | extern char _tdata_start; |
53 | extern char _tdata_start; |
54 | extern char _tdata_end; |
54 | extern char _tdata_end; |
55 | extern char _tbss_start; |
55 | extern char _tbss_start; |
56 | extern char _tbss_end; |
56 | extern char _tbss_end; |
57 | 57 | ||
58 | /** Create Thread Local storage area, return pointer to TCB(ThreadControlBlock) |
58 | /** Create TLS (Thread Local Storage) data structures. |
59 | * |
59 | * |
60 | * !! The code requires, that sections .tdata and .tbss are adjacent. |
60 | * The code requires, that sections .tdata and .tbss are adjacent. It may be |
61 | * It may be changed in the future. |
61 | * changed in the future. |
- | 62 | * |
|
- | 63 | * @return Pointer to TCB. |
|
62 | */ |
64 | */ |
63 | tcb_t * __make_tls(void) |
65 | tcb_t *__make_tls(void) |
64 | { |
66 | { |
65 | void *data; |
67 | void *data; |
66 | tcb_t *tcb; |
68 | tcb_t *tcb; |
67 | size_t tls_size = &_tbss_end - &_tdata_start; |
69 | size_t tls_size = &_tbss_end - &_tdata_start; |
68 | 70 | ||
69 | tcb = __alloc_tls(&data, tls_size); |
71 | tcb = __alloc_tls(&data, tls_size); |
70 | 72 | ||
- | 73 | /* |
|
- | 74 | * Copy thread local data from the initialization image. |
|
- | 75 | */ |
|
71 | memcpy(data, &_tdata_start, &_tdata_end - &_tdata_start); |
76 | memcpy(data, &_tdata_start, &_tdata_end - &_tdata_start); |
- | 77 | /* |
|
- | 78 | * Zero out the thread local uninitialized data. |
|
- | 79 | */ |
|
72 | memset(data + (&_tbss_start-&_tdata_start), 0, &_tbss_end-&_tbss_start); |
80 | memset(data + (&_tbss_start - &_tdata_start), 0, &_tbss_end - |
- | 81 | &_tbss_start); |
|
- | 82 | ||
73 | return tcb; |
83 | return tcb; |
74 | } |
84 | } |
75 | 85 | ||
76 | void __free_tls(tcb_t *tcb) |
86 | void __free_tls(tcb_t *tcb) |
77 | { |
87 | { |
Line 85... | Line 95... | ||
85 | * to call the thread's implementing function and perform cleanup |
95 | * to call the thread's implementing function and perform cleanup |
86 | * and exit when thread returns back. Do not call this function |
96 | * and exit when thread returns back. Do not call this function |
87 | * directly. |
97 | * directly. |
88 | * |
98 | * |
89 | * @param uarg Pointer to userspace argument structure. |
99 | * @param uarg Pointer to userspace argument structure. |
90 | * |
- | |
91 | * TODO: Thread stack pages memory leak |
- | |
92 | */ |
100 | */ |
93 | void __thread_main(uspace_arg_t *uarg) |
101 | void __thread_main(uspace_arg_t *uarg) |
94 | { |
102 | { |
95 | psthread_data_t *pt; |
103 | psthread_data_t *pt; |
96 | 104 | ||
Line 122... | Line 130... | ||
122 | int thread_create(void (* function)(void *), void *arg, char *name) |
130 | int thread_create(void (* function)(void *), void *arg, char *name) |
123 | { |
131 | { |
124 | char *stack; |
132 | char *stack; |
125 | uspace_arg_t *uarg; |
133 | uspace_arg_t *uarg; |
126 | 134 | ||
127 | stack = (char *) malloc(getpagesize()*THREAD_INITIAL_STACK_PAGES_NO); |
135 | stack = (char *) malloc(getpagesize() * THREAD_INITIAL_STACK_PAGES_NO); |
128 | if (!stack) |
136 | if (!stack) |
129 | return -1; |
137 | return -1; |
130 | 138 | ||
131 | uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t)); |
139 | uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t)); |
132 | if (!uarg) { |
140 | if (!uarg) { |