|
18 | 18 | .endm |
19 | 19 |
|
20 | 20 | .macro switch_tls_v6, base, tp, tpuser, tmp1, tmp2 |
21 | | - ldr \tmp1, =elf_hwcap |
22 | | - ldr \tmp1, [\tmp1, #0] |
| 21 | + ldr_va \tmp1, elf_hwcap |
23 | 22 | mov \tmp2, #0xffff0fff |
24 | 23 | tst \tmp1, #HWCAP_TLS @ hardware TLS available? |
25 | 24 | streq \tp, [\tmp2, #-15] @ set TLS value at 0xffff0ff0 |
26 | 25 | mrcne p15, 0, \tmp2, c13, c0, 2 @ get the user r/w register |
| 26 | +#ifndef CONFIG_SMP |
27 | 27 | mcrne p15, 0, \tp, c13, c0, 3 @ yes, set TLS register |
| 28 | +#endif |
28 | 29 | mcrne p15, 0, \tpuser, c13, c0, 2 @ set user r/w register |
29 | 30 | strne \tmp2, [\base, #TI_TP_VALUE + 4] @ save it |
30 | 31 | .endm |
|
43 | 44 | #elif defined(CONFIG_CPU_V6) |
44 | 45 | #define tls_emu 0 |
45 | 46 | #define has_tls_reg (elf_hwcap & HWCAP_TLS) |
46 | | -#define defer_tls_reg_update 0 |
| 47 | +#define defer_tls_reg_update IS_ENABLED(CONFIG_SMP) |
47 | 48 | #define switch_tls switch_tls_v6 |
48 | 49 | #elif defined(CONFIG_CPU_32v6K) |
49 | 50 | #define tls_emu 0 |
@@ -81,11 +82,11 @@ static inline void set_tls(unsigned long val) |
81 | 82 | */ |
82 | 83 | barrier(); |
83 | 84 |
|
84 | | - if (!tls_emu && !defer_tls_reg_update) { |
85 | | - if (has_tls_reg) { |
| 85 | + if (!tls_emu) { |
| 86 | + if (has_tls_reg && !defer_tls_reg_update) { |
86 | 87 | asm("mcr p15, 0, %0, c13, c0, 3" |
87 | 88 | : : "r" (val)); |
88 | | - } else { |
| 89 | + } else if (!has_tls_reg) { |
89 | 90 | #ifdef CONFIG_KUSER_HELPERS |
90 | 91 | /* |
91 | 92 | * User space must never try to access this |
|
0 commit comments