Changeset c4c5de5 in mainline for libc/generic/thread.c


Ignore:
Timestamp:
2006-03-24T14:29:19Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8fe1cdb
Parents:
520492a
Message:

Completed support for TLS in GCC (modifier thread) for ia32,amd64,ia64 and mips.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libc/generic/thread.c

    r520492a rc4c5de5  
    3333#include <kernel/proc/uarg.h>
    3434#include <psthread.h>
     35#include <string.h>
    3536
    3637#include <stdio.h>
    37 void * __make_tls(void)
     38
     39extern char _tdata_start;
     40extern char _tdata_end;
     41extern char _tbss_start;
     42extern 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.
     47 *    It may be changed in the future.
     48 */
     49tcb_t * __make_tls(void)
    3850{
    39         psthread_data_t *pt;
     51        void *data;
     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);
    4059
    41         pt = malloc(sizeof(psthread_data_t));
    42         pt->self = pt;
    43 
    44         return pt;
     60        return tcb;
    4561}
    4662
    47 void __free_tls(void *tls)
     63void __free_tls(tcb_t *tcb)
    4864{
    49         free(tls);
     65        size_t tls_size = &_tbss_end - &_tdata_start;
     66        __free_tls_arch(tcb, tls_size);
    5067}
    5168
     
    6178void __thread_main(uspace_arg_t *uarg)
    6279{
     80        tcb_t *tcb;
    6381        /* 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);
    6585
    6686        uarg->uspace_thread_function(uarg->uspace_thread_arg);
     
    6888        free(uarg);
    6989
    70         __free_tls(__tls_get());
     90        psthread_teardown(tcb->pst_data);
     91        __free_tls(tcb);
    7192
    7293        thread_exit(0);
Note: See TracChangeset for help on using the changeset viewer.