Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
ae3a197e DH |
2 | /* |
3 | * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu> | |
4 | */ | |
5 | #ifndef _ASM_POWERPC_SWITCH_TO_H | |
6 | #define _ASM_POWERPC_SWITCH_TO_H | |
7 | ||
68b34588 | 8 | #include <linux/sched.h> |
3eb5d588 AB |
9 | #include <asm/reg.h> |
10 | ||
ae3a197e DH |
11 | struct thread_struct; |
12 | struct task_struct; | |
13 | struct pt_regs; | |
14 | ||
15 | extern struct task_struct *__switch_to(struct task_struct *, | |
16 | struct task_struct *); | |
17 | #define switch_to(prev, next, last) ((last) = __switch_to((prev), (next))) | |
18 | ||
ae3a197e DH |
19 | extern struct task_struct *_switch(struct thread_struct *prev, |
20 | struct thread_struct *next); | |
21 | ||
d1e1cf2e AB |
22 | extern void switch_booke_debug_regs(struct debug_reg *new_debug); |
23 | ||
ae3a197e | 24 | extern int emulate_altivec(struct pt_regs *); |
d1e1cf2e | 25 | |
6cc0c16d | 26 | #ifdef CONFIG_PPC_BOOK3S_64 |
68b34588 | 27 | void restore_math(struct pt_regs *regs); |
6cc0c16d NP |
28 | #else |
29 | static inline void restore_math(struct pt_regs *regs) | |
30 | { | |
31 | } | |
32 | #endif | |
68b34588 NP |
33 | |
34 | void restore_tm_state(struct pt_regs *regs); | |
35 | ||
579e633e | 36 | extern void flush_all_to_thread(struct task_struct *); |
d1e1cf2e | 37 | extern void giveup_all(struct task_struct *); |
ae3a197e | 38 | |
037f0eed | 39 | #ifdef CONFIG_PPC_FPU |
d1e1cf2e | 40 | extern void enable_kernel_fp(void); |
037f0eed | 41 | extern void flush_fp_to_thread(struct task_struct *); |
5f20be44 | 42 | extern void giveup_fpu(struct task_struct *); |
8792468d | 43 | extern void save_fpu(struct task_struct *); |
3eb5d588 AB |
44 | static inline void disable_kernel_fp(void) |
45 | { | |
46 | msr_check_and_clear(MSR_FP); | |
47 | } | |
037f0eed | 48 | #else |
8792468d | 49 | static inline void save_fpu(struct task_struct *t) { } |
037f0eed KH |
50 | static inline void flush_fp_to_thread(struct task_struct *t) { } |
51 | #endif | |
52 | ||
ae3a197e | 53 | #ifdef CONFIG_ALTIVEC |
d1e1cf2e | 54 | extern void enable_kernel_altivec(void); |
ae3a197e | 55 | extern void flush_altivec_to_thread(struct task_struct *); |
8cd3c23d | 56 | extern void giveup_altivec(struct task_struct *); |
6f515d84 | 57 | extern void save_altivec(struct task_struct *); |
3eb5d588 AB |
58 | static inline void disable_kernel_altivec(void) |
59 | { | |
60 | msr_check_and_clear(MSR_VEC); | |
61 | } | |
de2a20aa | 62 | #else |
6f515d84 | 63 | static inline void save_altivec(struct task_struct *t) { } |
de2a20aa | 64 | static inline void __giveup_altivec(struct task_struct *t) { } |
ae3a197e DH |
65 | #endif |
66 | ||
67 | #ifdef CONFIG_VSX | |
d1e1cf2e | 68 | extern void enable_kernel_vsx(void); |
ae3a197e | 69 | extern void flush_vsx_to_thread(struct task_struct *); |
3eb5d588 AB |
70 | static inline void disable_kernel_vsx(void) |
71 | { | |
72 | msr_check_and_clear(MSR_FP|MSR_VEC|MSR_VSX); | |
73 | } | |
bd737588 CL |
74 | #else |
75 | static inline void enable_kernel_vsx(void) | |
76 | { | |
77 | BUILD_BUG(); | |
78 | } | |
79 | ||
80 | static inline void disable_kernel_vsx(void) | |
81 | { | |
82 | BUILD_BUG(); | |
83 | } | |
ae3a197e DH |
84 | #endif |
85 | ||
86 | #ifdef CONFIG_SPE | |
d1e1cf2e | 87 | extern void enable_kernel_spe(void); |
ae3a197e | 88 | extern void flush_spe_to_thread(struct task_struct *); |
98da581e AB |
89 | extern void giveup_spe(struct task_struct *); |
90 | extern void __giveup_spe(struct task_struct *); | |
3eb5d588 AB |
91 | static inline void disable_kernel_spe(void) |
92 | { | |
93 | msr_check_and_clear(MSR_SPE); | |
94 | } | |
de2a20aa CB |
95 | #else |
96 | static inline void __giveup_spe(struct task_struct *t) { } | |
ae3a197e DH |
97 | #endif |
98 | ||
330a1eb7 ME |
99 | static inline void clear_task_ebb(struct task_struct *t) |
100 | { | |
101 | #ifdef CONFIG_PPC_BOOK3S_64 | |
102 | /* EBB perf events are not inherited, so clear all EBB state. */ | |
3df48c98 ME |
103 | t->thread.ebbrr = 0; |
104 | t->thread.ebbhr = 0; | |
330a1eb7 ME |
105 | t->thread.bescr = 0; |
106 | t->thread.mmcr2 = 0; | |
107 | t->thread.mmcr0 = 0; | |
108 | t->thread.siar = 0; | |
109 | t->thread.sdar = 0; | |
110 | t->thread.sier = 0; | |
111 | t->thread.used_ebb = 0; | |
112 | #endif | |
113 | } | |
114 | ||
34e119c9 NP |
115 | void kvmppc_save_user_regs(void); |
116 | ||
ec233ede | 117 | extern int set_thread_tidr(struct task_struct *t); |
ec233ede | 118 | |
ae3a197e | 119 | #endif /* _ASM_POWERPC_SWITCH_TO_H */ |