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) 33314f6c23SMichael Ellerman clrrdi r12,r12,2 34e754f4d1SNicholas Piggin100: tdne r11,r12 35*fd1eaaaaSMichael Ellerman EMIT_WARN_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 39*fd1eaaaaSMichael Ellerman EMIT_WARN_ENTRY 100b,__FILE__,__LINE__,(BUGFLAG_WARNING | BUGFLAG_ONCE) 40e754f4d1SNicholas Piggin .else 41e754f4d1SNicholas Piggin mfspr r11,SPRN_HSRR0 42e754f4d1SNicholas Piggin ld r12,_NIP(r1) 43314f6c23SMichael Ellerman clrrdi r12,r12,2 44e754f4d1SNicholas Piggin100: tdne r11,r12 45*fd1eaaaaSMichael Ellerman EMIT_WARN_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 49*fd1eaaaaSMichael Ellerman EMIT_WARN_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