Subversion Repositories HelenOS

Rev

Rev 1866 | 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) {