diff options
| author | Christophe Leroy <christophe.leroy@c-s.fr> | 2019-04-30 08:38:58 -0400 |
|---|---|---|
| committer | Michael Ellerman <mpe@ellerman.id.au> | 2019-05-02 11:20:27 -0400 |
| commit | f97dec21a306967edbc49ce46f3ecefa3cd16907 (patch) | |
| tree | 71926e433d43add06480dcdd7acbd4f1e4bc6473 | |
| parent | ef4291243f51d0a69899ee2025de09578c0fcba8 (diff) | |
powerpc/32: enter syscall with MSR_EE inconditionaly set
syscalls are expected to be entered with MSR_EE set. Lets
make it inconditional by forcing MSR_EE on syscalls.
This patch adds EXC_XFER_SYS for that.
Suggested-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[splited out from benh RFC patch]
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
| -rw-r--r-- | arch/powerpc/kernel/head_32.S | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_32.h | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_40x.S | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_44x.S | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_8xx.S | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_booke.h | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_fsl_booke.S | 2 |
7 files changed, 13 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index f98e6b461238..c5fd76d0caf6 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
| @@ -375,7 +375,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_FPU_UNAVAILABLE) | |||
| 375 | DO_KVM 0xc00 | 375 | DO_KVM 0xc00 |
| 376 | SystemCall: | 376 | SystemCall: |
| 377 | EXCEPTION_PROLOG | 377 | EXCEPTION_PROLOG |
| 378 | EXC_XFER_EE_LITE(0xc00, DoSyscall) | 378 | EXC_XFER_SYS(0xc00, DoSyscall) |
| 379 | 379 | ||
| 380 | /* Single step - not used on 601 */ | 380 | /* Single step - not used on 601 */ |
| 381 | EXCEPTION(0xd00, SingleStep, single_step_exception, EXC_XFER_STD) | 381 | EXCEPTION(0xd00, SingleStep, single_step_exception, EXC_XFER_STD) |
diff --git a/arch/powerpc/kernel/head_32.h b/arch/powerpc/kernel/head_32.h index aa0131bb09b5..7221418a883f 100644 --- a/arch/powerpc/kernel/head_32.h +++ b/arch/powerpc/kernel/head_32.h | |||
| @@ -123,6 +123,10 @@ label: | |||
| 123 | EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, NOCOPY, transfer_to_handler, \ | 123 | EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, NOCOPY, transfer_to_handler, \ |
| 124 | ret_from_except) | 124 | ret_from_except) |
| 125 | 125 | ||
| 126 | #define EXC_XFER_SYS(n, hdlr) \ | ||
| 127 | EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL | MSR_EE, NOCOPY, transfer_to_handler, \ | ||
| 128 | ret_from_except) | ||
| 129 | |||
| 126 | #define EXC_XFER_EE(n, hdlr) \ | 130 | #define EXC_XFER_EE(n, hdlr) \ |
| 127 | EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \ | 131 | EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \ |
| 128 | ret_from_except_full) | 132 | ret_from_except_full) |
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S index b3a2e55e1c15..3e1b8a85cc0d 100644 --- a/arch/powerpc/kernel/head_40x.S +++ b/arch/powerpc/kernel/head_40x.S | |||
| @@ -350,7 +350,7 @@ _ENTRY(saved_ksp_limit) | |||
| 350 | /* 0x0C00 - System Call Exception */ | 350 | /* 0x0C00 - System Call Exception */ |
| 351 | START_EXCEPTION(0x0C00, SystemCall) | 351 | START_EXCEPTION(0x0C00, SystemCall) |
| 352 | EXCEPTION_PROLOG | 352 | EXCEPTION_PROLOG |
| 353 | EXC_XFER_EE_LITE(0xc00, DoSyscall) | 353 | EXC_XFER_SYS(0xc00, DoSyscall) |
| 354 | 354 | ||
| 355 | EXCEPTION(0x0D00, Trap_0D, unknown_exception, EXC_XFER_EE) | 355 | EXCEPTION(0x0D00, Trap_0D, unknown_exception, EXC_XFER_EE) |
| 356 | EXCEPTION(0x0E00, Trap_0E, unknown_exception, EXC_XFER_EE) | 356 | EXCEPTION(0x0E00, Trap_0E, unknown_exception, EXC_XFER_EE) |
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index 34a5df827b38..19268713b692 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S | |||
| @@ -286,7 +286,7 @@ interrupt_base: | |||
| 286 | /* System Call Interrupt */ | 286 | /* System Call Interrupt */ |
| 287 | START_EXCEPTION(SystemCall) | 287 | START_EXCEPTION(SystemCall) |
| 288 | NORMAL_EXCEPTION_PROLOG(BOOKE_INTERRUPT_SYSCALL) | 288 | NORMAL_EXCEPTION_PROLOG(BOOKE_INTERRUPT_SYSCALL) |
| 289 | EXC_XFER_EE_LITE(0x0c00, DoSyscall) | 289 | EXC_XFER_SYS(0x0c00, DoSyscall) |
| 290 | 290 | ||
| 291 | /* Auxiliary Processor Unavailable Interrupt */ | 291 | /* Auxiliary Processor Unavailable Interrupt */ |
| 292 | EXCEPTION(0x2020, BOOKE_INTERRUPT_AP_UNAVAIL, \ | 292 | EXCEPTION(0x2020, BOOKE_INTERRUPT_AP_UNAVAIL, \ |
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 14c3eb3267b8..aa8e629f7725 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S | |||
| @@ -186,7 +186,7 @@ Alignment: | |||
| 186 | . = 0xc00 | 186 | . = 0xc00 |
| 187 | SystemCall: | 187 | SystemCall: |
| 188 | EXCEPTION_PROLOG | 188 | EXCEPTION_PROLOG |
| 189 | EXC_XFER_EE_LITE(0xc00, DoSyscall) | 189 | EXC_XFER_SYS(0xc00, DoSyscall) |
| 190 | 190 | ||
| 191 | /* Single step - not used on 601 */ | 191 | /* Single step - not used on 601 */ |
| 192 | EXCEPTION(0xd00, SingleStep, single_step_exception, EXC_XFER_STD) | 192 | EXCEPTION(0xd00, SingleStep, single_step_exception, EXC_XFER_STD) |
diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h index 1b22a8dea399..612f54ba1125 100644 --- a/arch/powerpc/kernel/head_booke.h +++ b/arch/powerpc/kernel/head_booke.h | |||
| @@ -251,6 +251,10 @@ label: | |||
| 251 | EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, NOCOPY, transfer_to_handler, \ | 251 | EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, NOCOPY, transfer_to_handler, \ |
| 252 | ret_from_except) | 252 | ret_from_except) |
| 253 | 253 | ||
| 254 | #define EXC_XFER_SYS(n, hdlr) \ | ||
| 255 | EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL | MSR_EE, NOCOPY, transfer_to_handler, \ | ||
| 256 | ret_from_except) | ||
| 257 | |||
| 254 | #define EXC_XFER_EE(n, hdlr) \ | 258 | #define EXC_XFER_EE(n, hdlr) \ |
| 255 | EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \ | 259 | EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \ |
| 256 | ret_from_except_full) | 260 | ret_from_except_full) |
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index 567e0ed45ca8..a7bebb996393 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S | |||
| @@ -414,7 +414,7 @@ interrupt_base: | |||
| 414 | /* System Call Interrupt */ | 414 | /* System Call Interrupt */ |
| 415 | START_EXCEPTION(SystemCall) | 415 | START_EXCEPTION(SystemCall) |
| 416 | NORMAL_EXCEPTION_PROLOG(SYSCALL) | 416 | NORMAL_EXCEPTION_PROLOG(SYSCALL) |
| 417 | EXC_XFER_EE_LITE(0x0c00, DoSyscall) | 417 | EXC_XFER_SYS(0x0c00, DoSyscall) |
| 418 | 418 | ||
| 419 | /* Auxiliary Processor Unavailable Interrupt */ | 419 | /* Auxiliary Processor Unavailable Interrupt */ |
| 420 | EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \ | 420 | EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \ |
