.. | .. |
---|
10 | 10 | #define _ASM_POWERPC_THREAD_INFO_H |
---|
11 | 11 | |
---|
12 | 12 | #include <asm/asm-const.h> |
---|
| 13 | +#include <asm/page.h> |
---|
13 | 14 | |
---|
14 | 15 | #ifdef __KERNEL__ |
---|
15 | 16 | |
---|
16 | | -#define THREAD_SHIFT CONFIG_THREAD_SHIFT |
---|
| 17 | +#ifdef CONFIG_KASAN |
---|
| 18 | +#define MIN_THREAD_SHIFT (CONFIG_THREAD_SHIFT + 1) |
---|
| 19 | +#else |
---|
| 20 | +#define MIN_THREAD_SHIFT CONFIG_THREAD_SHIFT |
---|
| 21 | +#endif |
---|
| 22 | + |
---|
| 23 | +#if defined(CONFIG_VMAP_STACK) && MIN_THREAD_SHIFT < PAGE_SHIFT |
---|
| 24 | +#define THREAD_SHIFT PAGE_SHIFT |
---|
| 25 | +#else |
---|
| 26 | +#define THREAD_SHIFT MIN_THREAD_SHIFT |
---|
| 27 | +#endif |
---|
17 | 28 | |
---|
18 | 29 | #define THREAD_SIZE (1 << THREAD_SHIFT) |
---|
19 | 30 | |
---|
20 | | -#ifdef CONFIG_PPC64 |
---|
21 | | -#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(clrrdi dest, sp, THREAD_SHIFT) |
---|
| 31 | +/* |
---|
| 32 | + * By aligning VMAP'd stacks to 2 * THREAD_SIZE, we can detect overflow by |
---|
| 33 | + * checking sp & (1 << THREAD_SHIFT), which we can do cheaply in the entry |
---|
| 34 | + * assembly. |
---|
| 35 | + */ |
---|
| 36 | +#ifdef CONFIG_VMAP_STACK |
---|
| 37 | +#define THREAD_ALIGN_SHIFT (THREAD_SHIFT + 1) |
---|
22 | 38 | #else |
---|
23 | | -#define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(rlwinm dest, sp, 0, 0, 31-THREAD_SHIFT) |
---|
| 39 | +#define THREAD_ALIGN_SHIFT THREAD_SHIFT |
---|
24 | 40 | #endif |
---|
| 41 | + |
---|
| 42 | +#define THREAD_ALIGN (1 << THREAD_ALIGN_SHIFT) |
---|
25 | 43 | |
---|
26 | 44 | #ifndef __ASSEMBLY__ |
---|
27 | 45 | #include <linux/cache.h> |
---|
.. | .. |
---|
29 | 47 | #include <asm/page.h> |
---|
30 | 48 | #include <asm/accounting.h> |
---|
31 | 49 | |
---|
| 50 | +#define SLB_PRELOAD_NR 16U |
---|
32 | 51 | /* |
---|
33 | 52 | * low level task data. |
---|
34 | 53 | */ |
---|
35 | 54 | struct thread_info { |
---|
36 | | - struct task_struct *task; /* main task structure */ |
---|
37 | | - int cpu; /* cpu we're on */ |
---|
38 | 55 | int preempt_count; /* 0 => preemptable, |
---|
39 | 56 | <0 => BUG */ |
---|
40 | 57 | unsigned long local_flags; /* private flags for thread */ |
---|
.. | .. |
---|
44 | 61 | #if defined(CONFIG_VIRT_CPU_ACCOUNTING_NATIVE) && defined(CONFIG_PPC32) |
---|
45 | 62 | struct cpu_accounting_data accounting; |
---|
46 | 63 | #endif |
---|
| 64 | + unsigned char slb_preload_nr; |
---|
| 65 | + unsigned char slb_preload_tail; |
---|
| 66 | + u32 slb_preload_esid[SLB_PRELOAD_NR]; |
---|
| 67 | + |
---|
47 | 68 | /* low level flags - has atomic operations done on it */ |
---|
48 | 69 | unsigned long flags ____cacheline_aligned_in_smp; |
---|
49 | 70 | }; |
---|
.. | .. |
---|
53 | 74 | */ |
---|
54 | 75 | #define INIT_THREAD_INFO(tsk) \ |
---|
55 | 76 | { \ |
---|
56 | | - .task = &tsk, \ |
---|
57 | | - .cpu = 0, \ |
---|
58 | 77 | .preempt_count = INIT_PREEMPT_COUNT, \ |
---|
59 | 78 | .flags = 0, \ |
---|
60 | 79 | } |
---|
.. | .. |
---|
62 | 81 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) |
---|
63 | 82 | |
---|
64 | 83 | /* how to get the thread information struct from C */ |
---|
65 | | -static inline struct thread_info *current_thread_info(void) |
---|
66 | | -{ |
---|
67 | | - unsigned long val; |
---|
68 | | - |
---|
69 | | - asm (CURRENT_THREAD_INFO(%0,1) : "=r" (val)); |
---|
70 | | - |
---|
71 | | - return (struct thread_info *)val; |
---|
72 | | -} |
---|
73 | | - |
---|
74 | 84 | extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); |
---|
| 85 | + |
---|
| 86 | +#ifdef CONFIG_PPC_BOOK3S_64 |
---|
| 87 | +void arch_setup_new_exec(void); |
---|
| 88 | +#define arch_setup_new_exec arch_setup_new_exec |
---|
| 89 | +#endif |
---|
| 90 | + |
---|
75 | 91 | #endif /* __ASSEMBLY__ */ |
---|
76 | 92 | |
---|
77 | 93 | /* |
---|
.. | .. |
---|
80 | 96 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ |
---|
81 | 97 | #define TIF_SIGPENDING 1 /* signal pending */ |
---|
82 | 98 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ |
---|
83 | | -#define TIF_FSCHECK 3 /* Check FS is USER_DS on return */ |
---|
84 | | -#define TIF_32BIT 4 /* 32 bit binary */ |
---|
| 99 | +#define TIF_NOTIFY_SIGNAL 3 /* signal notifications exist */ |
---|
| 100 | +#define TIF_SYSCALL_EMU 4 /* syscall emulation active */ |
---|
85 | 101 | #define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */ |
---|
86 | 102 | #define TIF_PATCH_PENDING 6 /* pending live patching update */ |
---|
87 | 103 | #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ |
---|
.. | .. |
---|
100 | 116 | #define TIF_ELF2ABI 18 /* function descriptors must die! */ |
---|
101 | 117 | #endif |
---|
102 | 118 | #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
---|
| 119 | +#define TIF_32BIT 20 /* 32 bit binary */ |
---|
103 | 120 | |
---|
104 | 121 | /* as above, but as bit values */ |
---|
105 | 122 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
---|
106 | 123 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) |
---|
107 | 124 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
---|
| 125 | +#define _TIF_NOTIFY_SIGNAL (1<<TIF_NOTIFY_SIGNAL) |
---|
108 | 126 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
---|
109 | 127 | #define _TIF_32BIT (1<<TIF_32BIT) |
---|
110 | 128 | #define _TIF_RESTORE_TM (1<<TIF_RESTORE_TM) |
---|
.. | .. |
---|
119 | 137 | #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) |
---|
120 | 138 | #define _TIF_EMULATE_STACK_STORE (1<<TIF_EMULATE_STACK_STORE) |
---|
121 | 139 | #define _TIF_NOHZ (1<<TIF_NOHZ) |
---|
122 | | -#define _TIF_FSCHECK (1<<TIF_FSCHECK) |
---|
| 140 | +#define _TIF_SYSCALL_EMU (1<<TIF_SYSCALL_EMU) |
---|
123 | 141 | #define _TIF_SYSCALL_DOTRACE (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ |
---|
124 | 142 | _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \ |
---|
125 | | - _TIF_NOHZ) |
---|
| 143 | + _TIF_NOHZ | _TIF_SYSCALL_EMU) |
---|
126 | 144 | |
---|
127 | 145 | #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ |
---|
128 | 146 | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ |
---|
129 | 147 | _TIF_RESTORE_TM | _TIF_PATCH_PENDING | \ |
---|
130 | | - _TIF_FSCHECK) |
---|
| 148 | + _TIF_NOTIFY_SIGNAL) |
---|
131 | 149 | #define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR) |
---|
132 | 150 | |
---|
133 | 151 | /* Bits in local_flags */ |
---|
.. | .. |
---|
150 | 168 | return (ti->local_flags & flags) != 0; |
---|
151 | 169 | } |
---|
152 | 170 | |
---|
153 | | -#ifdef CONFIG_PPC64 |
---|
| 171 | +#ifdef CONFIG_COMPAT |
---|
154 | 172 | #define is_32bit_task() (test_thread_flag(TIF_32BIT)) |
---|
155 | 173 | #else |
---|
156 | | -#define is_32bit_task() (1) |
---|
| 174 | +#define is_32bit_task() (IS_ENABLED(CONFIG_PPC32)) |
---|
157 | 175 | #endif |
---|
158 | 176 | |
---|
159 | 177 | #if defined(CONFIG_PPC64) |
---|