xref: /openbmc/linux/arch/powerpc/kernel/interrupt_64.S (revision 314f6c23dd8d417281eb9e8a516dd98036f2e7b3)
1e754f4d1SNicholas Piggin#include <asm/asm-offsets.h>
2e754f4d1SNicholas Piggin#include <asm/bug.h>
3e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
4e754f4d1SNicholas Piggin#include <asm/exception-64s.h>
5e754f4d1SNicholas Piggin#else
6e754f4d1SNicholas Piggin#include <asm/exception-64e.h>
7e754f4d1SNicholas Piggin#endif
8e754f4d1SNicholas Piggin#include <asm/feature-fixups.h>
9e754f4d1SNicholas Piggin#include <asm/head-64.h>
10e754f4d1SNicholas Piggin#include <asm/hw_irq.h>
11e754f4d1SNicholas Piggin#include <asm/kup.h>
12e754f4d1SNicholas Piggin#include <asm/mmu.h>
13e754f4d1SNicholas Piggin#include <asm/ppc_asm.h>
14e754f4d1SNicholas Piggin#include <asm/ptrace.h>
15e754f4d1SNicholas Piggin
16e754f4d1SNicholas Piggin	.section	".toc","aw"
17e754f4d1SNicholas PigginSYS_CALL_TABLE:
18e754f4d1SNicholas Piggin	.tc sys_call_table[TC],sys_call_table
19e754f4d1SNicholas Piggin
20e754f4d1SNicholas Piggin#ifdef CONFIG_COMPAT
21e754f4d1SNicholas PigginCOMPAT_SYS_CALL_TABLE:
22e754f4d1SNicholas Piggin	.tc compat_sys_call_table[TC],compat_sys_call_table
23e754f4d1SNicholas Piggin#endif
24e754f4d1SNicholas Piggin	.previous
25e754f4d1SNicholas Piggin
26e754f4d1SNicholas Piggin	.align 7
27e754f4d1SNicholas Piggin
28e754f4d1SNicholas Piggin.macro DEBUG_SRR_VALID srr
29e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_RFI_SRR_DEBUG
30e754f4d1SNicholas Piggin	.ifc \srr,srr
31e754f4d1SNicholas Piggin	mfspr	r11,SPRN_SRR0
32e754f4d1SNicholas Piggin	ld	r12,_NIP(r1)
33*314f6c23SMichael Ellerman	clrrdi  r12,r12,2
34e754f4d1SNicholas Piggin100:	tdne	r11,r12
35e754f4d1SNicholas Piggin	EMIT_BUG_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
36e754f4d1SNicholas Piggin	mfspr	r11,SPRN_SRR1
37e754f4d1SNicholas Piggin	ld	r12,_MSR(r1)
38e754f4d1SNicholas Piggin100:	tdne	r11,r12
39e754f4d1SNicholas Piggin	EMIT_BUG_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
40e754f4d1SNicholas Piggin	.else
41e754f4d1SNicholas Piggin	mfspr	r11,SPRN_HSRR0
42e754f4d1SNicholas Piggin	ld	r12,_NIP(r1)
43*314f6c23SMichael Ellerman	clrrdi  r12,r12,2
44e754f4d1SNicholas Piggin100:	tdne	r11,r12
45e754f4d1SNicholas Piggin	EMIT_BUG_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
46e754f4d1SNicholas Piggin	mfspr	r11,SPRN_HSRR1
47e754f4d1SNicholas Piggin	ld	r12,_MSR(r1)
48e754f4d1SNicholas Piggin100:	tdne	r11,r12
49e754f4d1SNicholas Piggin	EMIT_BUG_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE)
50e754f4d1SNicholas Piggin	.endif
51e754f4d1SNicholas Piggin#endif
52e754f4d1SNicholas Piggin.endm
53e754f4d1SNicholas Piggin
54e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
55e754f4d1SNicholas Piggin.macro system_call_vectored name trapnr
56e754f4d1SNicholas Piggin	.globl system_call_vectored_\name
57e754f4d1SNicholas Pigginsystem_call_vectored_\name:
58e754f4d1SNicholas Piggin_ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
59e754f4d1SNicholas Piggin	SCV_INTERRUPT_TO_KERNEL
60e754f4d1SNicholas Piggin	mr	r10,r1
61e754f4d1SNicholas Piggin	ld	r1,PACAKSAVE(r13)
62e754f4d1SNicholas Piggin	std	r10,0(r1)
63e754f4d1SNicholas Piggin	std	r11,_NIP(r1)
64e754f4d1SNicholas Piggin	std	r12,_MSR(r1)
65e754f4d1SNicholas Piggin	std	r0,GPR0(r1)
66e754f4d1SNicholas Piggin	std	r10,GPR1(r1)
67e754f4d1SNicholas Piggin	std	r2,GPR2(r1)
68e754f4d1SNicholas Piggin	ld	r2,PACATOC(r13)
69e754f4d1SNicholas Piggin	mfcr	r12
70e754f4d1SNicholas Piggin	li	r11,0
71e754f4d1SNicholas Piggin	/* Can we avoid saving r3-r8 in common case? */
72e754f4d1SNicholas Piggin	std	r3,GPR3(r1)
73e754f4d1SNicholas Piggin	std	r4,GPR4(r1)
74e754f4d1SNicholas Piggin	std	r5,GPR5(r1)
75e754f4d1SNicholas Piggin	std	r6,GPR6(r1)
76e754f4d1SNicholas Piggin	std	r7,GPR7(r1)
77e754f4d1SNicholas Piggin	std	r8,GPR8(r1)
78e754f4d1SNicholas Piggin	/* Zero r9-r12, this should only be required when restoring all GPRs */
79e754f4d1SNicholas Piggin	std	r11,GPR9(r1)
80e754f4d1SNicholas Piggin	std	r11,GPR10(r1)
81e754f4d1SNicholas Piggin	std	r11,GPR11(r1)
82e754f4d1SNicholas Piggin	std	r11,GPR12(r1)
83e754f4d1SNicholas Piggin	std	r9,GPR13(r1)
84e754f4d1SNicholas Piggin	SAVE_NVGPRS(r1)
85e754f4d1SNicholas Piggin	std	r11,_XER(r1)
86e754f4d1SNicholas Piggin	std	r11,_LINK(r1)
87e754f4d1SNicholas Piggin	std	r11,_CTR(r1)
88e754f4d1SNicholas Piggin
89e754f4d1SNicholas Piggin	li	r11,\trapnr
90e754f4d1SNicholas Piggin	std	r11,_TRAP(r1)
91e754f4d1SNicholas Piggin	std	r12,_CCR(r1)
92e754f4d1SNicholas Piggin	addi	r10,r1,STACK_FRAME_OVERHEAD
93e754f4d1SNicholas Piggin	ld	r11,exception_marker@toc(r2)
94e754f4d1SNicholas Piggin	std	r11,-16(r10)		/* "regshere" marker */
95e754f4d1SNicholas Piggin
96e754f4d1SNicholas PigginBEGIN_FTR_SECTION
97e754f4d1SNicholas Piggin	HMT_MEDIUM
98e754f4d1SNicholas PigginEND_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
99e754f4d1SNicholas Piggin
100e754f4d1SNicholas Piggin	/*
101e754f4d1SNicholas Piggin	 * scv enters with MSR[EE]=1 and is immediately considered soft-masked.
102e754f4d1SNicholas Piggin	 * The entry vector already sets PACAIRQSOFTMASK to IRQS_ALL_DISABLED,
103e754f4d1SNicholas Piggin	 * and interrupts may be masked and pending already.
104e754f4d1SNicholas Piggin	 * system_call_exception() will call trace_hardirqs_off() which means
105e754f4d1SNicholas Piggin	 * interrupts could already have been blocked before trace_hardirqs_off,
106e754f4d1SNicholas Piggin	 * but this is the best we can do.
107e754f4d1SNicholas Piggin	 */
108e754f4d1SNicholas Piggin
109e754f4d1SNicholas Piggin	/* Calling convention has r9 = orig r0, r10 = regs */
110e754f4d1SNicholas Piggin	mr	r9,r0
111e754f4d1SNicholas Piggin	bl	system_call_exception
112e754f4d1SNicholas Piggin
113e754f4d1SNicholas Piggin.Lsyscall_vectored_\name\()_exit:
114e754f4d1SNicholas Piggin	addi	r4,r1,STACK_FRAME_OVERHEAD
115e754f4d1SNicholas Piggin	li	r5,1 /* scv */
116e754f4d1SNicholas Piggin	bl	syscall_exit_prepare
11713799748SNicholas Piggin	std	r1,PACA_EXIT_SAVE_R1(r13) /* save r1 for restart */
11813799748SNicholas Piggin.Lsyscall_vectored_\name\()_rst_start:
11913799748SNicholas Piggin	lbz	r11,PACAIRQHAPPENED(r13)
12013799748SNicholas Piggin	andi.	r11,r11,(~PACA_IRQ_HARD_DIS)@l
12113799748SNicholas Piggin	bne-	syscall_vectored_\name\()_restart
12213799748SNicholas Piggin	li	r11,IRQS_ENABLED
12313799748SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
12413799748SNicholas Piggin	li	r11,0
12513799748SNicholas Piggin	stb	r11,PACAIRQHAPPENED(r13) # clear out possible HARD_DIS
126e754f4d1SNicholas Piggin
127e754f4d1SNicholas Piggin	ld	r2,_CCR(r1)
128e754f4d1SNicholas Piggin	ld	r4,_NIP(r1)
129e754f4d1SNicholas Piggin	ld	r5,_MSR(r1)
130e754f4d1SNicholas Piggin
131e754f4d1SNicholas PigginBEGIN_FTR_SECTION
132e754f4d1SNicholas Piggin	stdcx.	r0,0,r1			/* to clear the reservation */
133e754f4d1SNicholas PigginEND_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
134e754f4d1SNicholas Piggin
135e754f4d1SNicholas PigginBEGIN_FTR_SECTION
136e754f4d1SNicholas Piggin	HMT_MEDIUM_LOW
137e754f4d1SNicholas PigginEND_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
138e754f4d1SNicholas Piggin
139e754f4d1SNicholas Piggin	cmpdi	r3,0
140e754f4d1SNicholas Piggin	bne	.Lsyscall_vectored_\name\()_restore_regs
141e754f4d1SNicholas Piggin
142e754f4d1SNicholas Piggin	/* rfscv returns with LR->NIA and CTR->MSR */
143e754f4d1SNicholas Piggin	mtlr	r4
144e754f4d1SNicholas Piggin	mtctr	r5
145e754f4d1SNicholas Piggin
146e754f4d1SNicholas Piggin	/* Could zero these as per ABI, but we may consider a stricter ABI
147e754f4d1SNicholas Piggin	 * which preserves these if libc implementations can benefit, so
148e754f4d1SNicholas Piggin	 * restore them for now until further measurement is done. */
149e754f4d1SNicholas Piggin	ld	r0,GPR0(r1)
150e754f4d1SNicholas Piggin	ld	r4,GPR4(r1)
151e754f4d1SNicholas Piggin	ld	r5,GPR5(r1)
152e754f4d1SNicholas Piggin	ld	r6,GPR6(r1)
153e754f4d1SNicholas Piggin	ld	r7,GPR7(r1)
154e754f4d1SNicholas Piggin	ld	r8,GPR8(r1)
155e754f4d1SNicholas Piggin	/* Zero volatile regs that may contain sensitive kernel data */
156e754f4d1SNicholas Piggin	li	r9,0
157e754f4d1SNicholas Piggin	li	r10,0
158e754f4d1SNicholas Piggin	li	r11,0
159e754f4d1SNicholas Piggin	li	r12,0
160e754f4d1SNicholas Piggin	mtspr	SPRN_XER,r0
161e754f4d1SNicholas Piggin
162e754f4d1SNicholas Piggin	/*
163e754f4d1SNicholas Piggin	 * We don't need to restore AMR on the way back to userspace for KUAP.
164e754f4d1SNicholas Piggin	 * The value of AMR only matters while we're in the kernel.
165e754f4d1SNicholas Piggin	 */
166e754f4d1SNicholas Piggin	mtcr	r2
167aebd1fb4SNicholas Piggin	REST_GPRS(2, 3, r1)
168aebd1fb4SNicholas Piggin	REST_GPR(13, r1)
169aebd1fb4SNicholas Piggin	REST_GPR(1, r1)
170e754f4d1SNicholas Piggin	RFSCV_TO_USER
171e754f4d1SNicholas Piggin	b	.	/* prevent speculative execution */
172e754f4d1SNicholas Piggin
173e754f4d1SNicholas Piggin.Lsyscall_vectored_\name\()_restore_regs:
174e754f4d1SNicholas Piggin	mtspr	SPRN_SRR0,r4
175e754f4d1SNicholas Piggin	mtspr	SPRN_SRR1,r5
176e754f4d1SNicholas Piggin
177e754f4d1SNicholas Piggin	ld	r3,_CTR(r1)
178e754f4d1SNicholas Piggin	ld	r4,_LINK(r1)
179e754f4d1SNicholas Piggin	ld	r5,_XER(r1)
180e754f4d1SNicholas Piggin
181e754f4d1SNicholas Piggin	REST_NVGPRS(r1)
182e754f4d1SNicholas Piggin	ld	r0,GPR0(r1)
183e754f4d1SNicholas Piggin	mtcr	r2
184e754f4d1SNicholas Piggin	mtctr	r3
185e754f4d1SNicholas Piggin	mtlr	r4
186e754f4d1SNicholas Piggin	mtspr	SPRN_XER,r5
187aebd1fb4SNicholas Piggin	REST_GPRS(2, 13, r1)
188aebd1fb4SNicholas Piggin	REST_GPR(1, r1)
189e754f4d1SNicholas Piggin	RFI_TO_USER
19013799748SNicholas Piggin.Lsyscall_vectored_\name\()_rst_end:
19113799748SNicholas Piggin
19213799748SNicholas Pigginsyscall_vectored_\name\()_restart:
19398798f33SNicholas Piggin_ASM_NOKPROBE_SYMBOL(syscall_vectored_\name\()_restart)
19413799748SNicholas Piggin	GET_PACA(r13)
19513799748SNicholas Piggin	ld	r1,PACA_EXIT_SAVE_R1(r13)
19613799748SNicholas Piggin	ld	r2,PACATOC(r13)
19713799748SNicholas Piggin	ld	r3,RESULT(r1)
19813799748SNicholas Piggin	addi	r4,r1,STACK_FRAME_OVERHEAD
19913799748SNicholas Piggin	li	r11,IRQS_ALL_DISABLED
20013799748SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
20113799748SNicholas Piggin	bl	syscall_exit_restart
20213799748SNicholas Piggin	std	r1,PACA_EXIT_SAVE_R1(r13) /* save r1 for restart */
20313799748SNicholas Piggin	b	.Lsyscall_vectored_\name\()_rst_start
204325678fdSNicholas Piggin1:
20513799748SNicholas Piggin
206325678fdSNicholas PigginSOFT_MASK_TABLE(.Lsyscall_vectored_\name\()_rst_start, 1b)
20713799748SNicholas PigginRESTART_TABLE(.Lsyscall_vectored_\name\()_rst_start, .Lsyscall_vectored_\name\()_rst_end, syscall_vectored_\name\()_restart)
20813799748SNicholas Piggin
209e754f4d1SNicholas Piggin.endm
210e754f4d1SNicholas Piggin
211e754f4d1SNicholas Pigginsystem_call_vectored common 0x3000
21213799748SNicholas Piggin
213e754f4d1SNicholas Piggin/*
214e754f4d1SNicholas Piggin * We instantiate another entry copy for the SIGILL variant, with TRAP=0x7ff0
215e754f4d1SNicholas Piggin * which is tested by system_call_exception when r0 is -1 (as set by vector
216e754f4d1SNicholas Piggin * entry code).
217e754f4d1SNicholas Piggin */
218e754f4d1SNicholas Pigginsystem_call_vectored sigill 0x7ff0
219e754f4d1SNicholas Piggin
220e754f4d1SNicholas Piggin
221e754f4d1SNicholas Piggin/*
222e754f4d1SNicholas Piggin * Entered via kernel return set up by kernel/sstep.c, must match entry regs
223e754f4d1SNicholas Piggin */
224e754f4d1SNicholas Piggin	.globl system_call_vectored_emulate
225e754f4d1SNicholas Pigginsystem_call_vectored_emulate:
226e754f4d1SNicholas Piggin_ASM_NOKPROBE_SYMBOL(system_call_vectored_emulate)
227e754f4d1SNicholas Piggin	li	r10,IRQS_ALL_DISABLED
228e754f4d1SNicholas Piggin	stb	r10,PACAIRQSOFTMASK(r13)
229e754f4d1SNicholas Piggin	b	system_call_vectored_common
2309b69d48cSNicholas Piggin#endif /* CONFIG_PPC_BOOK3S */
231e754f4d1SNicholas Piggin
232e754f4d1SNicholas Piggin	.balign IFETCH_ALIGN_BYTES
233e754f4d1SNicholas Piggin	.globl system_call_common_real
234e754f4d1SNicholas Pigginsystem_call_common_real:
23598798f33SNicholas Piggin_ASM_NOKPROBE_SYMBOL(system_call_common_real)
236e754f4d1SNicholas Piggin	ld	r10,PACAKMSR(r13)	/* get MSR value for kernel */
237e754f4d1SNicholas Piggin	mtmsrd	r10
238e754f4d1SNicholas Piggin
239e754f4d1SNicholas Piggin	.balign IFETCH_ALIGN_BYTES
240e754f4d1SNicholas Piggin	.globl system_call_common
241e754f4d1SNicholas Pigginsystem_call_common:
242e754f4d1SNicholas Piggin_ASM_NOKPROBE_SYMBOL(system_call_common)
243e754f4d1SNicholas Piggin	mr	r10,r1
244e754f4d1SNicholas Piggin	ld	r1,PACAKSAVE(r13)
245e754f4d1SNicholas Piggin	std	r10,0(r1)
246e754f4d1SNicholas Piggin	std	r11,_NIP(r1)
247e754f4d1SNicholas Piggin	std	r12,_MSR(r1)
248e754f4d1SNicholas Piggin	std	r0,GPR0(r1)
249e754f4d1SNicholas Piggin	std	r10,GPR1(r1)
250e754f4d1SNicholas Piggin	std	r2,GPR2(r1)
251e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_FSL_BOOK3E
252e754f4d1SNicholas PigginSTART_BTB_FLUSH_SECTION
253e754f4d1SNicholas Piggin	BTB_FLUSH(r10)
254e754f4d1SNicholas PigginEND_BTB_FLUSH_SECTION
255e754f4d1SNicholas Piggin#endif
256e754f4d1SNicholas Piggin	ld	r2,PACATOC(r13)
257e754f4d1SNicholas Piggin	mfcr	r12
258e754f4d1SNicholas Piggin	li	r11,0
259e754f4d1SNicholas Piggin	/* Can we avoid saving r3-r8 in common case? */
260e754f4d1SNicholas Piggin	std	r3,GPR3(r1)
261e754f4d1SNicholas Piggin	std	r4,GPR4(r1)
262e754f4d1SNicholas Piggin	std	r5,GPR5(r1)
263e754f4d1SNicholas Piggin	std	r6,GPR6(r1)
264e754f4d1SNicholas Piggin	std	r7,GPR7(r1)
265e754f4d1SNicholas Piggin	std	r8,GPR8(r1)
266e754f4d1SNicholas Piggin	/* Zero r9-r12, this should only be required when restoring all GPRs */
267e754f4d1SNicholas Piggin	std	r11,GPR9(r1)
268e754f4d1SNicholas Piggin	std	r11,GPR10(r1)
269e754f4d1SNicholas Piggin	std	r11,GPR11(r1)
270e754f4d1SNicholas Piggin	std	r11,GPR12(r1)
271e754f4d1SNicholas Piggin	std	r9,GPR13(r1)
272e754f4d1SNicholas Piggin	SAVE_NVGPRS(r1)
273e754f4d1SNicholas Piggin	std	r11,_XER(r1)
274e754f4d1SNicholas Piggin	std	r11,_CTR(r1)
275e754f4d1SNicholas Piggin	mflr	r10
276e754f4d1SNicholas Piggin
277e754f4d1SNicholas Piggin	/*
278e754f4d1SNicholas Piggin	 * This clears CR0.SO (bit 28), which is the error indication on
279e754f4d1SNicholas Piggin	 * return from this system call.
280e754f4d1SNicholas Piggin	 */
281e754f4d1SNicholas Piggin	rldimi	r12,r11,28,(63-28)
282e754f4d1SNicholas Piggin	li	r11,0xc00
283e754f4d1SNicholas Piggin	std	r10,_LINK(r1)
284e754f4d1SNicholas Piggin	std	r11,_TRAP(r1)
285e754f4d1SNicholas Piggin	std	r12,_CCR(r1)
286e754f4d1SNicholas Piggin	addi	r10,r1,STACK_FRAME_OVERHEAD
287e754f4d1SNicholas Piggin	ld	r11,exception_marker@toc(r2)
288e754f4d1SNicholas Piggin	std	r11,-16(r10)		/* "regshere" marker */
289e754f4d1SNicholas Piggin
290e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
291e754f4d1SNicholas Piggin	li	r11,1
292e754f4d1SNicholas Piggin	stb	r11,PACASRR_VALID(r13)
293e754f4d1SNicholas Piggin#endif
294e754f4d1SNicholas Piggin
295e754f4d1SNicholas Piggin	/*
296e754f4d1SNicholas Piggin	 * We always enter kernel from userspace with irq soft-mask enabled and
297e754f4d1SNicholas Piggin	 * nothing pending. system_call_exception() will call
298e754f4d1SNicholas Piggin	 * trace_hardirqs_off().
299e754f4d1SNicholas Piggin	 */
300e754f4d1SNicholas Piggin	li	r11,IRQS_ALL_DISABLED
301e754f4d1SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
3021df3af6dSNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
3031df3af6dSNicholas Piggin	li	r12,-1 /* Set MSR_EE and MSR_RI */
304dd152f70SNicholas Piggin	mtmsrd	r12,1
3051df3af6dSNicholas Piggin#else
3061df3af6dSNicholas Piggin	wrteei	1
3071df3af6dSNicholas Piggin#endif
308e754f4d1SNicholas Piggin
309e754f4d1SNicholas Piggin	/* Calling convention has r9 = orig r0, r10 = regs */
310e754f4d1SNicholas Piggin	mr	r9,r0
311e754f4d1SNicholas Piggin	bl	system_call_exception
312e754f4d1SNicholas Piggin
313e754f4d1SNicholas Piggin.Lsyscall_exit:
314e754f4d1SNicholas Piggin	addi	r4,r1,STACK_FRAME_OVERHEAD
315e754f4d1SNicholas Piggin	li	r5,0 /* !scv */
316e754f4d1SNicholas Piggin	bl	syscall_exit_prepare
31713799748SNicholas Piggin	std	r1,PACA_EXIT_SAVE_R1(r13) /* save r1 for restart */
3189b69d48cSNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
31913799748SNicholas Piggin.Lsyscall_rst_start:
32013799748SNicholas Piggin	lbz	r11,PACAIRQHAPPENED(r13)
32113799748SNicholas Piggin	andi.	r11,r11,(~PACA_IRQ_HARD_DIS)@l
32213799748SNicholas Piggin	bne-	syscall_restart
3239b69d48cSNicholas Piggin#endif
32413799748SNicholas Piggin	li	r11,IRQS_ENABLED
32513799748SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
32613799748SNicholas Piggin	li	r11,0
32713799748SNicholas Piggin	stb	r11,PACAIRQHAPPENED(r13) # clear out possible HARD_DIS
328e754f4d1SNicholas Piggin
329e754f4d1SNicholas Piggin	ld	r2,_CCR(r1)
330e754f4d1SNicholas Piggin	ld	r6,_LINK(r1)
331e754f4d1SNicholas Piggin	mtlr	r6
332e754f4d1SNicholas Piggin
333e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
334e754f4d1SNicholas Piggin	lbz	r4,PACASRR_VALID(r13)
335e754f4d1SNicholas Piggin	cmpdi	r4,0
336e754f4d1SNicholas Piggin	bne	1f
337e754f4d1SNicholas Piggin	li	r4,0
338e754f4d1SNicholas Piggin	stb	r4,PACASRR_VALID(r13)
339e754f4d1SNicholas Piggin#endif
340e754f4d1SNicholas Piggin	ld	r4,_NIP(r1)
341e754f4d1SNicholas Piggin	ld	r5,_MSR(r1)
342e754f4d1SNicholas Piggin	mtspr	SPRN_SRR0,r4
343e754f4d1SNicholas Piggin	mtspr	SPRN_SRR1,r5
344e754f4d1SNicholas Piggin1:
345e754f4d1SNicholas Piggin	DEBUG_SRR_VALID srr
346e754f4d1SNicholas Piggin
347e754f4d1SNicholas PigginBEGIN_FTR_SECTION
348e754f4d1SNicholas Piggin	stdcx.	r0,0,r1			/* to clear the reservation */
349e754f4d1SNicholas PigginEND_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
350e754f4d1SNicholas Piggin
351e754f4d1SNicholas Piggin	cmpdi	r3,0
352e754f4d1SNicholas Piggin	bne	.Lsyscall_restore_regs
353e754f4d1SNicholas Piggin	/* Zero volatile regs that may contain sensitive kernel data */
354e754f4d1SNicholas Piggin	li	r0,0
355e754f4d1SNicholas Piggin	li	r4,0
356e754f4d1SNicholas Piggin	li	r5,0
357e754f4d1SNicholas Piggin	li	r6,0
358e754f4d1SNicholas Piggin	li	r7,0
359e754f4d1SNicholas Piggin	li	r8,0
360e754f4d1SNicholas Piggin	li	r9,0
361e754f4d1SNicholas Piggin	li	r10,0
362e754f4d1SNicholas Piggin	li	r11,0
363e754f4d1SNicholas Piggin	li	r12,0
364e754f4d1SNicholas Piggin	mtctr	r0
365e754f4d1SNicholas Piggin	mtspr	SPRN_XER,r0
366e754f4d1SNicholas Piggin.Lsyscall_restore_regs_cont:
367e754f4d1SNicholas Piggin
368e754f4d1SNicholas PigginBEGIN_FTR_SECTION
369e754f4d1SNicholas Piggin	HMT_MEDIUM_LOW
370e754f4d1SNicholas PigginEND_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
371e754f4d1SNicholas Piggin
372e754f4d1SNicholas Piggin	/*
373e754f4d1SNicholas Piggin	 * We don't need to restore AMR on the way back to userspace for KUAP.
374e754f4d1SNicholas Piggin	 * The value of AMR only matters while we're in the kernel.
375e754f4d1SNicholas Piggin	 */
376e754f4d1SNicholas Piggin	mtcr	r2
377aebd1fb4SNicholas Piggin	REST_GPRS(2, 3, r1)
378aebd1fb4SNicholas Piggin	REST_GPR(13, r1)
379aebd1fb4SNicholas Piggin	REST_GPR(1, r1)
380e754f4d1SNicholas Piggin	RFI_TO_USER
381e754f4d1SNicholas Piggin	b	.	/* prevent speculative execution */
382e754f4d1SNicholas Piggin
383e754f4d1SNicholas Piggin.Lsyscall_restore_regs:
384e754f4d1SNicholas Piggin	ld	r3,_CTR(r1)
385e754f4d1SNicholas Piggin	ld	r4,_XER(r1)
386e754f4d1SNicholas Piggin	REST_NVGPRS(r1)
387e754f4d1SNicholas Piggin	mtctr	r3
388e754f4d1SNicholas Piggin	mtspr	SPRN_XER,r4
389e754f4d1SNicholas Piggin	ld	r0,GPR0(r1)
390aebd1fb4SNicholas Piggin	REST_GPRS(4, 12, r1)
391e754f4d1SNicholas Piggin	b	.Lsyscall_restore_regs_cont
39213799748SNicholas Piggin.Lsyscall_rst_end:
39313799748SNicholas Piggin
3949b69d48cSNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
39513799748SNicholas Pigginsyscall_restart:
39698798f33SNicholas Piggin_ASM_NOKPROBE_SYMBOL(syscall_restart)
39713799748SNicholas Piggin	GET_PACA(r13)
39813799748SNicholas Piggin	ld	r1,PACA_EXIT_SAVE_R1(r13)
39913799748SNicholas Piggin	ld	r2,PACATOC(r13)
40013799748SNicholas Piggin	ld	r3,RESULT(r1)
40113799748SNicholas Piggin	addi	r4,r1,STACK_FRAME_OVERHEAD
40213799748SNicholas Piggin	li	r11,IRQS_ALL_DISABLED
40313799748SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
40413799748SNicholas Piggin	bl	syscall_exit_restart
40513799748SNicholas Piggin	std	r1,PACA_EXIT_SAVE_R1(r13) /* save r1 for restart */
40613799748SNicholas Piggin	b	.Lsyscall_rst_start
407325678fdSNicholas Piggin1:
40813799748SNicholas Piggin
409325678fdSNicholas PigginSOFT_MASK_TABLE(.Lsyscall_rst_start, 1b)
41013799748SNicholas PigginRESTART_TABLE(.Lsyscall_rst_start, .Lsyscall_rst_end, syscall_restart)
4119b69d48cSNicholas Piggin#endif
412e754f4d1SNicholas Piggin
413e754f4d1SNicholas Piggin	/*
414e754f4d1SNicholas Piggin	 * If MSR EE/RI was never enabled, IRQs not reconciled, NVGPRs not
415e754f4d1SNicholas Piggin	 * touched, no exit work created, then this can be used.
416e754f4d1SNicholas Piggin	 */
417e754f4d1SNicholas Piggin	.balign IFETCH_ALIGN_BYTES
418e754f4d1SNicholas Piggin	.globl fast_interrupt_return_srr
419e754f4d1SNicholas Pigginfast_interrupt_return_srr:
420e754f4d1SNicholas Piggin_ASM_NOKPROBE_SYMBOL(fast_interrupt_return_srr)
421e754f4d1SNicholas Piggin	kuap_check_amr r3, r4
422e754f4d1SNicholas Piggin	ld	r5,_MSR(r1)
423e754f4d1SNicholas Piggin	andi.	r0,r5,MSR_PR
424e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
42513799748SNicholas Piggin	beq	1f
42613799748SNicholas Piggin	kuap_user_restore r3, r4
42713799748SNicholas Piggin	b	.Lfast_user_interrupt_return_srr
42813799748SNicholas Piggin1:	kuap_kernel_restore r3, r4
429e754f4d1SNicholas Piggin	andi.	r0,r5,MSR_RI
430e754f4d1SNicholas Piggin	li	r3,0 /* 0 return value, no EMULATE_STACK_STORE */
431e754f4d1SNicholas Piggin	bne+	.Lfast_kernel_interrupt_return_srr
432e754f4d1SNicholas Piggin	addi	r3,r1,STACK_FRAME_OVERHEAD
433e754f4d1SNicholas Piggin	bl	unrecoverable_exception
434e754f4d1SNicholas Piggin	b	. /* should not get here */
435e754f4d1SNicholas Piggin#else
436e754f4d1SNicholas Piggin	bne	.Lfast_user_interrupt_return_srr
437e754f4d1SNicholas Piggin	b	.Lfast_kernel_interrupt_return_srr
438e754f4d1SNicholas Piggin#endif
439e754f4d1SNicholas Piggin
440e754f4d1SNicholas Piggin.macro interrupt_return_macro srr
441e754f4d1SNicholas Piggin	.balign IFETCH_ALIGN_BYTES
442e754f4d1SNicholas Piggin	.globl interrupt_return_\srr
443e754f4d1SNicholas Piggininterrupt_return_\srr\():
444e754f4d1SNicholas Piggin_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\())
445e754f4d1SNicholas Piggin	ld	r4,_MSR(r1)
446e754f4d1SNicholas Piggin	andi.	r0,r4,MSR_PR
447c59458b0SNicholas Piggin	beq	interrupt_return_\srr\()_kernel
448c59458b0SNicholas Piggininterrupt_return_\srr\()_user: /* make backtraces match the _kernel variant */
449c59458b0SNicholas Piggin_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_user)
450e754f4d1SNicholas Piggin	addi	r3,r1,STACK_FRAME_OVERHEAD
451e754f4d1SNicholas Piggin	bl	interrupt_exit_user_prepare
452e754f4d1SNicholas Piggin	cmpdi	r3,0
453e754f4d1SNicholas Piggin	bne-	.Lrestore_nvgprs_\srr
45413799748SNicholas Piggin.Lrestore_nvgprs_\srr\()_cont:
45513799748SNicholas Piggin	std	r1,PACA_EXIT_SAVE_R1(r13) /* save r1 for restart */
4569b69d48cSNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
45713799748SNicholas Piggin.Linterrupt_return_\srr\()_user_rst_start:
45813799748SNicholas Piggin	lbz	r11,PACAIRQHAPPENED(r13)
45913799748SNicholas Piggin	andi.	r11,r11,(~PACA_IRQ_HARD_DIS)@l
46013799748SNicholas Piggin	bne-	interrupt_return_\srr\()_user_restart
4619b69d48cSNicholas Piggin#endif
46213799748SNicholas Piggin	li	r11,IRQS_ENABLED
46313799748SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
46413799748SNicholas Piggin	li	r11,0
46513799748SNicholas Piggin	stb	r11,PACAIRQHAPPENED(r13) # clear out possible HARD_DIS
466e754f4d1SNicholas Piggin
467e754f4d1SNicholas Piggin.Lfast_user_interrupt_return_\srr\():
468e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
469e754f4d1SNicholas Piggin	.ifc \srr,srr
470e754f4d1SNicholas Piggin	lbz	r4,PACASRR_VALID(r13)
471e754f4d1SNicholas Piggin	.else
472e754f4d1SNicholas Piggin	lbz	r4,PACAHSRR_VALID(r13)
473e754f4d1SNicholas Piggin	.endif
474e754f4d1SNicholas Piggin	cmpdi	r4,0
475e754f4d1SNicholas Piggin	li	r4,0
476e754f4d1SNicholas Piggin	bne	1f
477e754f4d1SNicholas Piggin#endif
478e754f4d1SNicholas Piggin	ld	r11,_NIP(r1)
479e754f4d1SNicholas Piggin	ld	r12,_MSR(r1)
480e754f4d1SNicholas Piggin	.ifc \srr,srr
481e754f4d1SNicholas Piggin	mtspr	SPRN_SRR0,r11
482e754f4d1SNicholas Piggin	mtspr	SPRN_SRR1,r12
483e754f4d1SNicholas Piggin1:
484e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
485e754f4d1SNicholas Piggin	stb	r4,PACASRR_VALID(r13)
486e754f4d1SNicholas Piggin#endif
487e754f4d1SNicholas Piggin	.else
488e754f4d1SNicholas Piggin	mtspr	SPRN_HSRR0,r11
489e754f4d1SNicholas Piggin	mtspr	SPRN_HSRR1,r12
490e754f4d1SNicholas Piggin1:
491e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
492e754f4d1SNicholas Piggin	stb	r4,PACAHSRR_VALID(r13)
493e754f4d1SNicholas Piggin#endif
494e754f4d1SNicholas Piggin	.endif
495e754f4d1SNicholas Piggin	DEBUG_SRR_VALID \srr
496e754f4d1SNicholas Piggin
49713799748SNicholas Piggin#ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG
49813799748SNicholas Piggin	lbz	r4,PACAIRQSOFTMASK(r13)
49913799748SNicholas Piggin	tdnei	r4,IRQS_ENABLED
50013799748SNicholas Piggin#endif
50113799748SNicholas Piggin
50213799748SNicholas PigginBEGIN_FTR_SECTION
50313799748SNicholas Piggin	ld	r10,_PPR(r1)
50413799748SNicholas Piggin	mtspr	SPRN_PPR,r10
50513799748SNicholas PigginEND_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
50613799748SNicholas Piggin
507e754f4d1SNicholas PigginBEGIN_FTR_SECTION
508e754f4d1SNicholas Piggin	stdcx.	r0,0,r1		/* to clear the reservation */
509e754f4d1SNicholas PigginFTR_SECTION_ELSE
510e754f4d1SNicholas Piggin	ldarx	r0,0,r1
511e754f4d1SNicholas PigginALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
512e754f4d1SNicholas Piggin
513e754f4d1SNicholas Piggin	ld	r3,_CCR(r1)
514e754f4d1SNicholas Piggin	ld	r4,_LINK(r1)
515e754f4d1SNicholas Piggin	ld	r5,_CTR(r1)
516e754f4d1SNicholas Piggin	ld	r6,_XER(r1)
517e754f4d1SNicholas Piggin	li	r0,0
518e754f4d1SNicholas Piggin
519aebd1fb4SNicholas Piggin	REST_GPRS(7, 13, r1)
520e754f4d1SNicholas Piggin
521e754f4d1SNicholas Piggin	mtcr	r3
522e754f4d1SNicholas Piggin	mtlr	r4
523e754f4d1SNicholas Piggin	mtctr	r5
524e754f4d1SNicholas Piggin	mtspr	SPRN_XER,r6
525e754f4d1SNicholas Piggin
526aebd1fb4SNicholas Piggin	REST_GPRS(2, 6, r1)
527e754f4d1SNicholas Piggin	REST_GPR(0, r1)
528e754f4d1SNicholas Piggin	REST_GPR(1, r1)
529e754f4d1SNicholas Piggin	.ifc \srr,srr
530e754f4d1SNicholas Piggin	RFI_TO_USER
531e754f4d1SNicholas Piggin	.else
532e754f4d1SNicholas Piggin	HRFI_TO_USER
533e754f4d1SNicholas Piggin	.endif
534e754f4d1SNicholas Piggin	b	.	/* prevent speculative execution */
53513799748SNicholas Piggin.Linterrupt_return_\srr\()_user_rst_end:
536e754f4d1SNicholas Piggin
537e754f4d1SNicholas Piggin.Lrestore_nvgprs_\srr\():
538e754f4d1SNicholas Piggin	REST_NVGPRS(r1)
53913799748SNicholas Piggin	b	.Lrestore_nvgprs_\srr\()_cont
54013799748SNicholas Piggin
5419b69d48cSNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
54213799748SNicholas Piggininterrupt_return_\srr\()_user_restart:
54398798f33SNicholas Piggin_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_user_restart)
54413799748SNicholas Piggin	GET_PACA(r13)
54513799748SNicholas Piggin	ld	r1,PACA_EXIT_SAVE_R1(r13)
54613799748SNicholas Piggin	ld	r2,PACATOC(r13)
54713799748SNicholas Piggin	addi	r3,r1,STACK_FRAME_OVERHEAD
54813799748SNicholas Piggin	li	r11,IRQS_ALL_DISABLED
54913799748SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
55013799748SNicholas Piggin	bl	interrupt_exit_user_restart
55113799748SNicholas Piggin	std	r1,PACA_EXIT_SAVE_R1(r13) /* save r1 for restart */
55213799748SNicholas Piggin	b	.Linterrupt_return_\srr\()_user_rst_start
553325678fdSNicholas Piggin1:
55413799748SNicholas Piggin
555325678fdSNicholas PigginSOFT_MASK_TABLE(.Linterrupt_return_\srr\()_user_rst_start, 1b)
55613799748SNicholas PigginRESTART_TABLE(.Linterrupt_return_\srr\()_user_rst_start, .Linterrupt_return_\srr\()_user_rst_end, interrupt_return_\srr\()_user_restart)
5579b69d48cSNicholas Piggin#endif
558e754f4d1SNicholas Piggin
559e754f4d1SNicholas Piggin	.balign IFETCH_ALIGN_BYTES
560c59458b0SNicholas Piggininterrupt_return_\srr\()_kernel:
561c59458b0SNicholas Piggin_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_kernel)
562e754f4d1SNicholas Piggin	addi	r3,r1,STACK_FRAME_OVERHEAD
563e754f4d1SNicholas Piggin	bl	interrupt_exit_kernel_prepare
564e754f4d1SNicholas Piggin
56513799748SNicholas Piggin	std	r1,PACA_EXIT_SAVE_R1(r13) /* save r1 for restart */
56613799748SNicholas Piggin.Linterrupt_return_\srr\()_kernel_rst_start:
56713799748SNicholas Piggin	ld	r11,SOFTE(r1)
56813799748SNicholas Piggin	cmpwi	r11,IRQS_ENABLED
56913799748SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
57013799748SNicholas Piggin	bne	1f
5719b69d48cSNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
57213799748SNicholas Piggin	lbz	r11,PACAIRQHAPPENED(r13)
57313799748SNicholas Piggin	andi.	r11,r11,(~PACA_IRQ_HARD_DIS)@l
57413799748SNicholas Piggin	bne-	interrupt_return_\srr\()_kernel_restart
5759b69d48cSNicholas Piggin#endif
57613799748SNicholas Piggin	li	r11,0
57713799748SNicholas Piggin	stb	r11,PACAIRQHAPPENED(r13) # clear out possible HARD_DIS
57813799748SNicholas Piggin1:
57913799748SNicholas Piggin
580e754f4d1SNicholas Piggin.Lfast_kernel_interrupt_return_\srr\():
581e754f4d1SNicholas Piggin	cmpdi	cr1,r3,0
582e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
583e754f4d1SNicholas Piggin	.ifc \srr,srr
584e754f4d1SNicholas Piggin	lbz	r4,PACASRR_VALID(r13)
585e754f4d1SNicholas Piggin	.else
586e754f4d1SNicholas Piggin	lbz	r4,PACAHSRR_VALID(r13)
587e754f4d1SNicholas Piggin	.endif
588e754f4d1SNicholas Piggin	cmpdi	r4,0
589e754f4d1SNicholas Piggin	li	r4,0
590e754f4d1SNicholas Piggin	bne	1f
591e754f4d1SNicholas Piggin#endif
592e754f4d1SNicholas Piggin	ld	r11,_NIP(r1)
593e754f4d1SNicholas Piggin	ld	r12,_MSR(r1)
594e754f4d1SNicholas Piggin	.ifc \srr,srr
595e754f4d1SNicholas Piggin	mtspr	SPRN_SRR0,r11
596e754f4d1SNicholas Piggin	mtspr	SPRN_SRR1,r12
597e754f4d1SNicholas Piggin1:
598e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
599e754f4d1SNicholas Piggin	stb	r4,PACASRR_VALID(r13)
600e754f4d1SNicholas Piggin#endif
601e754f4d1SNicholas Piggin	.else
602e754f4d1SNicholas Piggin	mtspr	SPRN_HSRR0,r11
603e754f4d1SNicholas Piggin	mtspr	SPRN_HSRR1,r12
604e754f4d1SNicholas Piggin1:
605e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
606e754f4d1SNicholas Piggin	stb	r4,PACAHSRR_VALID(r13)
607e754f4d1SNicholas Piggin#endif
608e754f4d1SNicholas Piggin	.endif
609e754f4d1SNicholas Piggin	DEBUG_SRR_VALID \srr
610e754f4d1SNicholas Piggin
611e754f4d1SNicholas PigginBEGIN_FTR_SECTION
612e754f4d1SNicholas Piggin	stdcx.	r0,0,r1		/* to clear the reservation */
613e754f4d1SNicholas PigginFTR_SECTION_ELSE
614e754f4d1SNicholas Piggin	ldarx	r0,0,r1
615e754f4d1SNicholas PigginALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
616e754f4d1SNicholas Piggin
617e754f4d1SNicholas Piggin	ld	r3,_LINK(r1)
618e754f4d1SNicholas Piggin	ld	r4,_CTR(r1)
619e754f4d1SNicholas Piggin	ld	r5,_XER(r1)
620e754f4d1SNicholas Piggin	ld	r6,_CCR(r1)
621e754f4d1SNicholas Piggin	li	r0,0
622e754f4d1SNicholas Piggin
623aebd1fb4SNicholas Piggin	REST_GPRS(7, 12, r1)
624e754f4d1SNicholas Piggin
625e754f4d1SNicholas Piggin	mtlr	r3
626e754f4d1SNicholas Piggin	mtctr	r4
627e754f4d1SNicholas Piggin	mtspr	SPRN_XER,r5
628e754f4d1SNicholas Piggin
629e754f4d1SNicholas Piggin	/*
630e754f4d1SNicholas Piggin	 * Leaving a stale exception_marker on the stack can confuse
631e754f4d1SNicholas Piggin	 * the reliable stack unwinder later on. Clear it.
632e754f4d1SNicholas Piggin	 */
633e754f4d1SNicholas Piggin	std	r0,STACK_FRAME_OVERHEAD-16(r1)
634e754f4d1SNicholas Piggin
635aebd1fb4SNicholas Piggin	REST_GPRS(2, 5, r1)
636e754f4d1SNicholas Piggin
637e754f4d1SNicholas Piggin	bne-	cr1,1f /* emulate stack store */
638e754f4d1SNicholas Piggin	mtcr	r6
639e754f4d1SNicholas Piggin	REST_GPR(6, r1)
640e754f4d1SNicholas Piggin	REST_GPR(0, r1)
641e754f4d1SNicholas Piggin	REST_GPR(1, r1)
642e754f4d1SNicholas Piggin	.ifc \srr,srr
643e754f4d1SNicholas Piggin	RFI_TO_KERNEL
644e754f4d1SNicholas Piggin	.else
645e754f4d1SNicholas Piggin	HRFI_TO_KERNEL
646e754f4d1SNicholas Piggin	.endif
647e754f4d1SNicholas Piggin	b	.	/* prevent speculative execution */
648e754f4d1SNicholas Piggin
649e754f4d1SNicholas Piggin1:	/*
650e754f4d1SNicholas Piggin	 * Emulate stack store with update. New r1 value was already calculated
651e754f4d1SNicholas Piggin	 * and updated in our interrupt regs by emulate_loadstore, but we can't
652e754f4d1SNicholas Piggin	 * store the previous value of r1 to the stack before re-loading our
653e754f4d1SNicholas Piggin	 * registers from it, otherwise they could be clobbered.  Use
654e754f4d1SNicholas Piggin	 * PACA_EXGEN as temporary storage to hold the store data, as
655e754f4d1SNicholas Piggin	 * interrupts are disabled here so it won't be clobbered.
656e754f4d1SNicholas Piggin	 */
657e754f4d1SNicholas Piggin	mtcr	r6
658e754f4d1SNicholas Piggin	std	r9,PACA_EXGEN+0(r13)
659e754f4d1SNicholas Piggin	addi	r9,r1,INT_FRAME_SIZE /* get original r1 */
660e754f4d1SNicholas Piggin	REST_GPR(6, r1)
661e754f4d1SNicholas Piggin	REST_GPR(0, r1)
662e754f4d1SNicholas Piggin	REST_GPR(1, r1)
663e754f4d1SNicholas Piggin	std	r9,0(r1) /* perform store component of stdu */
664e754f4d1SNicholas Piggin	ld	r9,PACA_EXGEN+0(r13)
665e754f4d1SNicholas Piggin
666e754f4d1SNicholas Piggin	.ifc \srr,srr
667e754f4d1SNicholas Piggin	RFI_TO_KERNEL
668e754f4d1SNicholas Piggin	.else
669e754f4d1SNicholas Piggin	HRFI_TO_KERNEL
670e754f4d1SNicholas Piggin	.endif
671e754f4d1SNicholas Piggin	b	.	/* prevent speculative execution */
67213799748SNicholas Piggin.Linterrupt_return_\srr\()_kernel_rst_end:
67313799748SNicholas Piggin
6749b69d48cSNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
67513799748SNicholas Piggininterrupt_return_\srr\()_kernel_restart:
67698798f33SNicholas Piggin_ASM_NOKPROBE_SYMBOL(interrupt_return_\srr\()_kernel_restart)
67713799748SNicholas Piggin	GET_PACA(r13)
67813799748SNicholas Piggin	ld	r1,PACA_EXIT_SAVE_R1(r13)
67913799748SNicholas Piggin	ld	r2,PACATOC(r13)
68013799748SNicholas Piggin	addi	r3,r1,STACK_FRAME_OVERHEAD
68113799748SNicholas Piggin	li	r11,IRQS_ALL_DISABLED
68213799748SNicholas Piggin	stb	r11,PACAIRQSOFTMASK(r13)
68313799748SNicholas Piggin	bl	interrupt_exit_kernel_restart
68413799748SNicholas Piggin	std	r1,PACA_EXIT_SAVE_R1(r13) /* save r1 for restart */
68513799748SNicholas Piggin	b	.Linterrupt_return_\srr\()_kernel_rst_start
686325678fdSNicholas Piggin1:
68713799748SNicholas Piggin
688325678fdSNicholas PigginSOFT_MASK_TABLE(.Linterrupt_return_\srr\()_kernel_rst_start, 1b)
68913799748SNicholas PigginRESTART_TABLE(.Linterrupt_return_\srr\()_kernel_rst_start, .Linterrupt_return_\srr\()_kernel_rst_end, interrupt_return_\srr\()_kernel_restart)
6909b69d48cSNicholas Piggin#endif
69113799748SNicholas Piggin
692e754f4d1SNicholas Piggin.endm
693e754f4d1SNicholas Piggin
694e754f4d1SNicholas Piggininterrupt_return_macro srr
695e754f4d1SNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
696e754f4d1SNicholas Piggininterrupt_return_macro hsrr
6979d1988caSNicholas Piggin
6989d1988caSNicholas Piggin	.globl __end_soft_masked
6999d1988caSNicholas Piggin__end_soft_masked:
700d72c4a36SDaniel AxtensDEFINE_FIXED_SYMBOL(__end_soft_masked, text)
7019b69d48cSNicholas Piggin#endif /* CONFIG_PPC_BOOK3S */
70291fc46ecSNicholas Piggin
70391fc46ecSNicholas Piggin#ifdef CONFIG_PPC_BOOK3S
70491fc46ecSNicholas Piggin_GLOBAL(ret_from_fork_scv)
70591fc46ecSNicholas Piggin	bl	schedule_tail
70691fc46ecSNicholas Piggin	REST_NVGPRS(r1)
70791fc46ecSNicholas Piggin	li	r3,0	/* fork() return value */
70891fc46ecSNicholas Piggin	b	.Lsyscall_vectored_common_exit
70991fc46ecSNicholas Piggin#endif
71091fc46ecSNicholas Piggin
71191fc46ecSNicholas Piggin_GLOBAL(ret_from_fork)
71291fc46ecSNicholas Piggin	bl	schedule_tail
71391fc46ecSNicholas Piggin	REST_NVGPRS(r1)
71491fc46ecSNicholas Piggin	li	r3,0	/* fork() return value */
71591fc46ecSNicholas Piggin	b	.Lsyscall_exit
71691fc46ecSNicholas Piggin
71791fc46ecSNicholas Piggin_GLOBAL(ret_from_kernel_thread)
71891fc46ecSNicholas Piggin	bl	schedule_tail
71991fc46ecSNicholas Piggin	REST_NVGPRS(r1)
72091fc46ecSNicholas Piggin	mtctr	r14
72191fc46ecSNicholas Piggin	mr	r3,r15
72291fc46ecSNicholas Piggin#ifdef PPC64_ELF_ABI_v2
72391fc46ecSNicholas Piggin	mr	r12,r14
72491fc46ecSNicholas Piggin#endif
72591fc46ecSNicholas Piggin	bctrl
72691fc46ecSNicholas Piggin	li	r3,0
72791fc46ecSNicholas Piggin	b	.Lsyscall_exit
728