Subversion Repositories HelenOS-historic

Rev

Rev 1113 | Rev 1167 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1113 Rev 1129
Line 30... Line 30...
30
#include <libc.h>
30
#include <libc.h>
31
#include <stdlib.h>
31
#include <stdlib.h>
32
#include <arch/faddr.h>
32
#include <arch/faddr.h>
33
#include <kernel/proc/uarg.h>
33
#include <kernel/proc/uarg.h>
34
#include <psthread.h>
34
#include <psthread.h>
-
 
35
#include <string.h>
35
 
36
 
36
#include <stdio.h>
37
#include <stdio.h>
37
void * __make_tls(void)
-
 
38
{
-
 
39
    psthread_data_t *pt;
-
 
40
 
38
 
-
 
39
extern char _tdata_start;
-
 
40
extern char _tdata_end;
-
 
41
extern char _tbss_start;
-
 
42
extern char _tbss_end;
-
 
43
 
-
 
44
/** Create Thread Local storage area, return pointer to TCB(ThreadControlBlock)
-
 
45
 *
-
 
46
 * !! The code requires, that sections .tdata and .tbss are adjacent.
41
    pt = malloc(sizeof(psthread_data_t));
47
 *    It may be changed in the future.
-
 
48
 */
-
 
49
tcb_t * __make_tls(void)
-
 
50
{
-
 
51
    void *data;
42
    pt->self = pt;
52
    tcb_t *tcb;
-
 
53
    size_t tls_size = &_tbss_end - &_tdata_start;
-
 
54
   
-
 
55
    tcb = __alloc_tls(&data, tls_size);
-
 
56
   
-
 
57
    memcpy(data, &_tdata_start, &_tdata_end - &_tdata_start);
-
 
58
    memset(data + (&_tbss_start-&_tdata_start), &_tbss_end-&_tbss_start, 0);
43
 
59
 
44
    return pt;
60
    return tcb;
45
}
61
}
46
 
62
 
47
void __free_tls(void *tls)
63
void __free_tls(tcb_t *tcb)
48
{
64
{
-
 
65
    size_t tls_size = &_tbss_end - &_tdata_start;
49
    free(tls);
66
    __free_tls_arch(tcb, tls_size);
50
}
67
}
51
 
68
 
52
/** Main thread function.
69
/** Main thread function.
53
 *
70
 *
54
 * This function is called from __thread_entry() and is used
71
 * This function is called from __thread_entry() and is used
Line 58... Line 75...
58
 *
75
 *
59
 * @param uarg Pointer to userspace argument structure.
76
 * @param uarg Pointer to userspace argument structure.
60
 */
77
 */
61
void __thread_main(uspace_arg_t *uarg)
78
void __thread_main(uspace_arg_t *uarg)
62
{
79
{
-
 
80
    tcb_t *tcb;
63
    /* This should initialize the area according to TLS specicification */
81
    /* This should initialize the area according to TLS specicification */
64
    __tls_set(__make_tls());
82
    tcb = __make_tls();
-
 
83
    __tcb_set(tcb);
-
 
84
    psthread_setup(tcb);
65
 
85
 
66
    uarg->uspace_thread_function(uarg->uspace_thread_arg);
86
    uarg->uspace_thread_function(uarg->uspace_thread_arg);
67
    free(uarg->uspace_stack);
87
    free(uarg->uspace_stack);
68
    free(uarg);
88
    free(uarg);
69
 
89
 
-
 
90
    psthread_teardown(tcb->pst_data);
70
    __free_tls(__tls_get());
91
    __free_tls(tcb);
71
 
92
 
72
    thread_exit(0);
93
    thread_exit(0);
73
}
94
}
74
 
95
 
75
/** Create userspace thread.
96
/** Create userspace thread.