Subversion Repositories HelenOS-historic

Rev

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

Rev 1217 Rev 1286
Line 27... Line 27...
27
 */
27
 */
28
 
28
 
29
#ifndef __LIBC__ppc32__THREAD_H__
29
#ifndef __LIBC__ppc32__THREAD_H__
30
#define __LIBC__ppc32__THREAD_H__
30
#define __LIBC__ppc32__THREAD_H__
31
 
31
 
-
 
32
/* I did not find any specification (neither MIPS nor PowerPC), but
-
 
33
 * as I found it
-
 
34
 * - it uses Variant II
-
 
35
 * - TCB is at Address(First TLS Block)+0x7000.
-
 
36
 * - DTV is at Address(First TLS Block)+0x8000
-
 
37
 * - What would happen if the TLS data was larger then 0x7000?
-
 
38
 * - The linker never accesses DTV directly, has the second definition any
-
 
39
 *   sense?
-
 
40
 * We will make it this way:
-
 
41
 * - TCB is at TP-0x7000-sizeof(tcb)
-
 
42
 * - No assumption about DTV etc., but it will not have a fixed address
-
 
43
 */
-
 
44
#define PPC_TP_OFFSET 0x7000
-
 
45
 
32
typedef struct {
46
typedef struct {
33
    void *pst_data;
47
    void *pst_data;
34
} tcb_t;
48
} tcb_t;
35
 
49
 
36
static inline void __tcb_set(tcb_t *tcb)
50
static inline void __tcb_set(tcb_t *tcb)
37
{
51
{
-
 
52
    void *tp = tcb;
-
 
53
    tp += PPC_TP_OFFSET + sizeof(tcb_t);
-
 
54
   
-
 
55
    asm volatile (
-
 
56
        "mr %%r2, %0\n"
-
 
57
        :
-
 
58
        : "r" (tp)
-
 
59
    );
38
}
60
}
39
 
61
 
40
static inline tcb_t * __tcb_get(void)
62
static inline tcb_t * __tcb_get(void)
41
{
63
{
-
 
64
    void * retval;
-
 
65
   
-
 
66
    asm volatile (
-
 
67
        "mr %0, %%r2\n"
-
 
68
        : "=r" (retval)
-
 
69
    );
-
 
70
 
-
 
71
    return (tcb_t *)(retval - PPC_TP_OFFSET - sizeof(tcb_t));
42
}
72
}
43
 
73
 
44
#endif
74
#endif