Subversion Repositories HelenOS

Rev

Rev 1866 | Go to most recent revision | Show entire file | Regard 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