]>
Commit | Line | Data |
---|---|---|
6184488a | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
ff16701a TG |
2 | // |
3 | // Code shared between 32 and 64 bit | |
4 | ||
5635d999 TG |
5 | #include <asm/spec-ctrl.h> |
6 | ||
ff16701a TG |
7 | void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p); |
8 | ||
9 | /* | |
10 | * This needs to be inline to optimize for the common case where no extra | |
11 | * work needs to be done. | |
12 | */ | |
13 | static inline void switch_to_extra(struct task_struct *prev, | |
14 | struct task_struct *next) | |
15 | { | |
16 | unsigned long next_tif = task_thread_info(next)->flags; | |
17 | unsigned long prev_tif = task_thread_info(prev)->flags; | |
18 | ||
5635d999 TG |
19 | if (IS_ENABLED(CONFIG_SMP)) { |
20 | /* | |
21 | * Avoid __switch_to_xtra() invocation when conditional | |
aa77bfb3 | 22 | * STIBP is disabled and the only different bit is |
5635d999 TG |
23 | * TIF_SPEC_IB. For CONFIG_SMP=n TIF_SPEC_IB is not |
24 | * in the TIF_WORK_CTXSW masks. | |
25 | */ | |
26 | if (!static_branch_likely(&switch_to_cond_stibp)) { | |
27 | prev_tif &= ~_TIF_SPEC_IB; | |
28 | next_tif &= ~_TIF_SPEC_IB; | |
29 | } | |
30 | } | |
31 | ||
ff16701a TG |
32 | /* |
33 | * __switch_to_xtra() handles debug registers, i/o bitmaps, | |
34 | * speculation mitigations etc. | |
35 | */ | |
36 | if (unlikely(next_tif & _TIF_WORK_CTXSW_NEXT || | |
37 | prev_tif & _TIF_WORK_CTXSW_PREV)) | |
38 | __switch_to_xtra(prev, next); | |
39 | } |