]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - arch/powerpc/kernel/head_32.h
powerpc/32: On syscall entry, enable instruction translation at the same time as...
[mirror_ubuntu-jammy-kernel.git] / arch / powerpc / kernel / head_32.h
index 7c767765071dac3ae9efa33162bce1a0d5c47207..97d8465eb12a3b9abfe7fc9a7331649466f938d7 100644 (file)
 
 .macro EXCEPTION_PROLOG_1 for_rtas=0
 #ifdef CONFIG_VMAP_STACK
-       mr      r11, r1
+       mtspr   SPRN_SPRG_SCRATCH2,r1
        subi    r1, r1, INT_FRAME_SIZE          /* use r1 if kernel */
        beq     1f
        mfspr   r1,SPRN_SPRG_THREAD
        lwz     r1,TASK_STACK-THREAD(r1)
        addi    r1, r1, THREAD_SIZE - INT_FRAME_SIZE
+1:
+       mtcrf   0x3f, r1
+       bt      32 - THREAD_ALIGN_SHIFT, stack_overflow
 #else
        subi    r11, r1, INT_FRAME_SIZE         /* use r1 if kernel */
        beq     1f
        mfspr   r11,SPRN_SPRG_THREAD
        lwz     r11,TASK_STACK-THREAD(r11)
        addi    r11, r11, THREAD_SIZE - INT_FRAME_SIZE
-#endif
-1:
-       tophys_novmstack r11, r11
-#ifdef CONFIG_VMAP_STACK
-       mtcrf   0x7f, r1
-       bt      32 - THREAD_ALIGN_SHIFT, stack_overflow
+1:     tophys(r11, r11)
 #endif
 .endm
 
 .macro EXCEPTION_PROLOG_2 handle_dar_dsisr=0
 #ifdef CONFIG_VMAP_STACK
-       mtcr    r10
-       li      r10, MSR_KERNEL & ~(MSR_IR | MSR_RI) /* can take DTLB miss */
-       mtmsr   r10
+       li      r11, MSR_KERNEL & ~(MSR_IR | MSR_RI) /* can take DTLB miss */
+       mtmsr   r11
        isync
-#else
-       stw     r10,_CCR(r11)           /* save registers */
-#endif
-       mfspr   r10, SPRN_SPRG_SCRATCH0
-#ifdef CONFIG_VMAP_STACK
+       mfspr   r11, SPRN_SPRG_SCRATCH2
        stw     r11,GPR1(r1)
        stw     r11,0(r1)
        mr      r11, r1
        stw     r1,0(r11)
        tovirt(r1, r11)         /* set new kernel sp */
 #endif
+       stw     r10,_CCR(r11)           /* save registers */
        stw     r12,GPR12(r11)
        stw     r9,GPR9(r11)
-       stw     r10,GPR10(r11)
-#ifdef CONFIG_VMAP_STACK
-       mfcr    r10
-       stw     r10, _CCR(r11)
-#endif
+       mfspr   r10,SPRN_SPRG_SCRATCH0
        mfspr   r12,SPRN_SPRG_SCRATCH1
+       stw     r10,GPR10(r11)
        stw     r12,GPR11(r11)
        mflr    r10
        stw     r10,_LINK(r11)
        stw     r10, _DSISR(r11)
        .endif
        lwz     r9, SRR1(r12)
-       andi.   r10, r9, MSR_PR
        lwz     r12, SRR0(r12)
 #else
        mfspr   r12,SPRN_SRR0
 .macro SYSCALL_ENTRY trapno
        mfspr   r12,SPRN_SPRG_THREAD
        mfspr   r9, SPRN_SRR1
-#ifdef CONFIG_VMAP_STACK
        mfspr   r11, SPRN_SRR0
        mtctr   r11
-#endif
        andi.   r11, r9, MSR_PR
-       lwz     r11,TASK_STACK-THREAD(r12)
+       mr      r11, r1
+       lwz     r1,TASK_STACK-THREAD(r12)
        beq-    99f
-       addi    r11, r11, THREAD_SIZE - INT_FRAME_SIZE
-#ifdef CONFIG_VMAP_STACK
-       li      r10, MSR_KERNEL & ~(MSR_IR | MSR_RI) /* can take DTLB miss */
-       mtmsr   r10
-       isync
-#endif
-       tovirt_vmstack r12, r12
-       tophys_novmstack r11, r11
+       addi    r1, r1, THREAD_SIZE - INT_FRAME_SIZE
+       LOAD_REG_IMMEDIATE(r10, MSR_KERNEL)             /* can take exceptions */
+       mtspr   SPRN_SRR1, r10
+       lis     r10, 1f@h
+       ori     r10, r10, 1f@l
+       mtspr   SPRN_SRR0, r10
+       rfi
+1:
+       tovirt(r12, r12)
+       stw     r11,GPR1(r1)
+       stw     r11,0(r1)
+       mr      r11, r1
        mflr    r10
        stw     r10, _LINK(r11)
-#ifdef CONFIG_VMAP_STACK
        mfctr   r10
-#else
-       mfspr   r10,SPRN_SRR0
-#endif
-       stw     r1,GPR1(r11)
-       stw     r1,0(r11)
-       tovirt_novmstack r1, r11        /* set new kernel sp */
        stw     r10,_NIP(r11)
        mfcr    r10
        rlwinm  r10,r10,0,4,2   /* Clear SO bit in CR */
        stw     r10,_CCR(r11)           /* save registers */
 #ifdef CONFIG_40x
        rlwinm  r9,r9,0,14,12           /* clear MSR_WE (necessary?) */
-#else
-#ifdef CONFIG_VMAP_STACK
-       LOAD_REG_IMMEDIATE(r10, MSR_KERNEL & ~MSR_IR) /* can take exceptions */
-#else
-       LOAD_REG_IMMEDIATE(r10, MSR_KERNEL & ~(MSR_IR|MSR_DR)) /* can take exceptions */
-#endif
-       mtmsr   r10                     /* (except for mach check in rtas) */
 #endif
        lis     r10,STACK_FRAME_REGS_MARKER@ha /* exception frame marker */
        stw     r2,GPR2(r11)
        li      r12,-1                  /* clear all pending debug events */
        mtspr   SPRN_DBSR,r12
        lis     r11,global_dbcr0@ha
-       tophys(r11,r11)
        addi    r11,r11,global_dbcr0@l
        lwz     r12,0(r11)
        mtspr   SPRN_DBCR0,r12
 #endif
 
 3:
-       tovirt_novmstack r2, r2         /* set r2 to current */
-       lis     r11, transfer_to_syscall@h
-       ori     r11, r11, transfer_to_syscall@l
 #ifdef CONFIG_TRACE_IRQFLAGS
        /*
         * If MSR is changing we need to keep interrupts disabled at this point
 #else
        LOAD_REG_IMMEDIATE(r10, MSR_KERNEL | MSR_EE)
 #endif
-#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PERF_EVENTS)
-       mtspr   SPRN_NRI, r0
-#endif
-       mtspr   SPRN_SRR1,r10
-       mtspr   SPRN_SRR0,r11
-       RFI                             /* jump to handler, enable MMU */
+       mtmsr   r10
+       b       transfer_to_syscall             /* jump to handler */
 99:    b       ret_from_kernel_syscall
 .endm