Changeset fa23560 in mainline for uspace/lib/libc/arch/mips32


Ignore:
Timestamp:
2007-10-30T22:54:11Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4d21cf8
Parents:
b2a0f6dd
Message:

Unify implementations of TLS variant I and variant II alloc_tls() and
free_tls_arch().

Location:
uspace/lib/libc/arch/mips32
Files:
1 added
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/lib/libc/arch/mips32/Makefile.inc

    rb2a0f6dd rfa23560  
    4141ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \
    4242        arch/$(ARCH)/src/fibril.S \
    43         arch/$(ARCH)/src/thread.c
     43        arch/$(ARCH)/src/tls.c
    4444
    4545
  • uspace/lib/libc/arch/mips32/include/thread.h

    rb2a0f6dd rfa23560  
    3434 */
    3535
    36 /* TLS for MIPS is described in http://www.linux-mips.org/wiki/NPTL */
    37 
    3836#ifndef LIBC_mips32_THREAD_H_
    3937#define LIBC_mips32_THREAD_H_
    40 
    41 /* I did not find any specification (neither MIPS nor PowerPC), but
    42  * as I found it
    43  * - it uses Variant II
    44  * - TCB is at Address(First TLS Block)+0x7000.
    45  * - DTV is at Address(First TLS Block)+0x8000
    46  * - What would happen if the TLS data was larger then 0x7000?
    47  * - The linker never accesses DTV directly, has the second definition any
    48  *   sense?
    49  * We will make it this way:
    50  * - TCB is at TP-0x7000-sizeof(tcb)
    51  * - No assumption about DTV etc., but it will not have a fixed address
    52  */
    53 #define MIPS_TP_OFFSET 0x7000
    54 
    55 typedef struct {
    56         void *fibril_data;
    57 } tcb_t;
    58 
    59 static inline void __tcb_set(tcb_t *tcb)
    60 {
    61         void *tp = tcb;
    62         tp += MIPS_TP_OFFSET + sizeof(tcb_t);
    63 
    64         asm volatile ("add $27, %0, $0" : : "r"(tp)); /* Move tls to K1 */
    65 }
    66 
    67 static inline tcb_t * __tcb_get(void)
    68 {
    69         void * retval;
    70 
    71         asm volatile("add %0, $27, $0" : "=r"(retval));
    72 
    73         return (tcb_t *)(retval - MIPS_TP_OFFSET - sizeof(tcb_t));
    74 }
    7538
    7639#endif
  • uspace/lib/libc/arch/mips32/src/tls.c

    rb2a0f6dd rfa23560  
    3434 */
    3535
    36 #include <thread.h>
    37 #include <malloc.h>
     36#include <tls.h>
     37#include <sys/types.h>
    3838
    39 /** Allocate TLS & TCB for initial module threads
    40  *
    41  * @param data (out) Start of TLS section
    42  * @param size Size of tdata+tbss section
    43  * @return pointer to tcb_t structure
    44  */
    4539tcb_t * __alloc_tls(void **data, size_t size)
    4640{
    47         tcb_t *result;
    48 
    49         result = malloc(sizeof(tcb_t) + size);
    50         *data = ((void *)result) + sizeof(tcb_t);
    51         return result;
     41        return tls_alloc_variant_1(data, size);
    5242}
    5343
    5444void __free_tls_arch(tcb_t *tcb, size_t size)
    5545{
    56         free(tcb);
     46        tls_free_variant_1(tcb, size);
    5747}
    5848
Note: See TracChangeset for help on using the changeset viewer.