Commit | Line | Data |
---|---|---|
f159f4ed TL |
1 | #ifndef __ASMARM_TLS_H |
2 | #define __ASMARM_TLS_H | |
3 | ||
4 | #ifdef __ASSEMBLY__ | |
4b9e9796 S |
5 | #include <asm/asm-offsets.h> |
6 | .macro switch_tls_none, prev, next, tp, tpuser, tmp1, tmp2 | |
f159f4ed TL |
7 | .endm |
8 | ||
4b9e9796 S |
9 | .macro switch_tls_v6k, prev, next, tp, tpuser, tmp1, tmp2 |
10 | ldrd \tp, \tpuser, [\next, #TI_TP_VALUE] @ get the next TLS and user r/w register | |
11 | mrc p15, 0, \tmp2, c13, c0, 2 @ get the user r/w register | |
f159f4ed | 12 | mcr p15, 0, \tp, c13, c0, 3 @ set TLS register |
4b9e9796 S |
13 | mcr p15, 0, \tpuser, c13, c0, 2 @ and the user r/w register |
14 | str \tmp2, [\prev, #TI_TP_VALUE + 4] @ save it | |
f159f4ed TL |
15 | .endm |
16 | ||
4b9e9796 | 17 | .macro switch_tls_v6, prev, next, tp, tpuser, tmp1, tmp2 |
f159f4ed TL |
18 | ldr \tmp1, =elf_hwcap |
19 | ldr \tmp1, [\tmp1, #0] | |
20 | mov \tmp2, #0xffff0fff | |
4b9e9796 | 21 | ldr \tp, [\next, #TI_TP_VALUE] @ get the next TLS register |
f159f4ed | 22 | tst \tmp1, #HWCAP_TLS @ hardware TLS available? |
f159f4ed | 23 | streq \tp, [\tmp2, #-15] @ set TLS value at 0xffff0ff0 |
4b9e9796 S |
24 | mrcne p15, 0, \tmp2, c13, c0, 2 @ get the previous user r/w register |
25 | ldrne \tpuser, [\next, #TI_TP_VALUE + 4] @ get the next user r/w register | |
26 | mcrne p15, 0, \tp, c13, c0, 3 @ yes, set TLS register | |
27 | mcrne p15, 0, \tpuser, c13, c0, 2 @ set user r/w register | |
28 | strne \tmp2, [\prev, #TI_TP_VALUE + 4] @ save it | |
f159f4ed TL |
29 | .endm |
30 | ||
4b9e9796 | 31 | .macro switch_tls_software, prev, next, tp, tpuser, tmp1, tmp2 |
f159f4ed TL |
32 | mov \tmp1, #0xffff0fff |
33 | str \tp, [\tmp1, #-15] @ set TLS value at 0xffff0ff0 | |
34 | .endm | |
35 | #endif | |
36 | ||
37 | #ifdef CONFIG_TLS_REG_EMUL | |
38 | #define tls_emu 1 | |
39 | #define has_tls_reg 1 | |
4b9e9796 | 40 | #define switch_tls switch_tls_none |
37bc618f | 41 | #elif defined(CONFIG_CPU_V6) |
f159f4ed TL |
42 | #define tls_emu 0 |
43 | #define has_tls_reg (elf_hwcap & HWCAP_TLS) | |
4b9e9796 | 44 | #define switch_tls switch_tls_v6 |
37bc618f RK |
45 | #elif defined(CONFIG_CPU_32v6K) |
46 | #define tls_emu 0 | |
47 | #define has_tls_reg 1 | |
4b9e9796 | 48 | #define switch_tls switch_tls_v6k |
f159f4ed TL |
49 | #else |
50 | #define tls_emu 0 | |
51 | #define has_tls_reg 0 | |
4b9e9796 | 52 | #define switch_tls switch_tls_software |
f159f4ed TL |
53 | #endif |
54 | ||
4b9e9796 S |
55 | #ifndef __ASSEMBLY__ |
56 | static inline unsigned long get_tpuser(void) | |
57 | { | |
58 | unsigned long reg = 0; | |
59 | ||
60 | if (has_tls_reg && !tls_emu) | |
61 | __asm__("mrc p15, 0, %0, c13, c0, 2" : "=r" (reg)); | |
62 | ||
63 | return reg; | |
64 | } | |
65 | #endif | |
f159f4ed | 66 | #endif /* __ASMARM_TLS_H */ |