[PATCH v1 04/11] powerpc/64s: Move and rename do_bad_slb_fault as it is not hash specific
Christophe Leroy
christophe.leroy at csgroup.eu
Tue Oct 19 04:09:37 AEDT 2021
Le 15/10/2021 à 17:46, Nicholas Piggin a écrit :
> slb.c is hash-specific SLB management, but do_bad_slb_fault deals with
> segment interrupts that occur with radix MMU as well.
> ---
> arch/powerpc/include/asm/interrupt.h | 2 +-
> arch/powerpc/kernel/exceptions-64s.S | 4 ++--
> arch/powerpc/mm/book3s64/slb.c | 16 ----------------
> arch/powerpc/mm/fault.c | 17 +++++++++++++++++
> 4 files changed, 20 insertions(+), 19 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/interrupt.h b/arch/powerpc/include/asm/interrupt.h
> index a1d238255f07..3487aab12229 100644
> --- a/arch/powerpc/include/asm/interrupt.h
> +++ b/arch/powerpc/include/asm/interrupt.h
> @@ -564,7 +564,7 @@ DECLARE_INTERRUPT_HANDLER(kernel_bad_stack);
>
> /* slb.c */
> DECLARE_INTERRUPT_HANDLER_RAW(do_slb_fault);
> -DECLARE_INTERRUPT_HANDLER(do_bad_slb_fault);
> +DECLARE_INTERRUPT_HANDLER(do_bad_segment_interrupt);
>
> /* hash_utils.c */
> DECLARE_INTERRUPT_HANDLER_RAW(do_hash_fault);
> diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
> index eaf1f72131a1..046c99e31d01 100644
> --- a/arch/powerpc/kernel/exceptions-64s.S
> +++ b/arch/powerpc/kernel/exceptions-64s.S
> @@ -1430,7 +1430,7 @@ MMU_FTR_SECTION_ELSE
> ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
> std r3,RESULT(r1)
> addi r3,r1,STACK_FRAME_OVERHEAD
> - bl do_bad_slb_fault
> + bl do_bad_segment_interrupt
> b interrupt_return_srr
>
>
> @@ -1510,7 +1510,7 @@ MMU_FTR_SECTION_ELSE
> ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
> std r3,RESULT(r1)
> addi r3,r1,STACK_FRAME_OVERHEAD
> - bl do_bad_slb_fault
> + bl do_bad_segment_interrupt
> b interrupt_return_srr
>
>
> diff --git a/arch/powerpc/mm/book3s64/slb.c b/arch/powerpc/mm/book3s64/slb.c
> index f0037bcc47a0..31f4cef3adac 100644
> --- a/arch/powerpc/mm/book3s64/slb.c
> +++ b/arch/powerpc/mm/book3s64/slb.c
> @@ -868,19 +868,3 @@ DEFINE_INTERRUPT_HANDLER_RAW(do_slb_fault)
> return err;
> }
> }
> -
> -DEFINE_INTERRUPT_HANDLER(do_bad_slb_fault)
> -{
> - int err = regs->result;
> -
> - if (err == -EFAULT) {
> - if (user_mode(regs))
> - _exception(SIGSEGV, regs, SEGV_BNDERR, regs->dar);
> - else
> - bad_page_fault(regs, SIGSEGV);
> - } else if (err == -EINVAL) {
> - unrecoverable_exception(regs);
> - } else {
> - BUG();
> - }
> -}
> diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
> index a8d0ce85d39a..53ddcae0ac9e 100644
> --- a/arch/powerpc/mm/fault.c
> +++ b/arch/powerpc/mm/fault.c
> @@ -35,6 +35,7 @@
> #include <linux/kfence.h>
> #include <linux/pkeys.h>
>
> +#include <asm/asm-prototypes.h>
> #include <asm/firmware.h>
> #include <asm/interrupt.h>
> #include <asm/page.h>
> @@ -620,4 +621,20 @@ DEFINE_INTERRUPT_HANDLER(do_bad_page_fault_segv)
> {
> bad_page_fault(regs, SIGSEGV);
> }
> +
> +DEFINE_INTERRUPT_HANDLER(do_bad_segment_interrupt)
> +{
> + int err = regs->result;
> +
> + if (err == -EFAULT) {
> + if (user_mode(regs))
> + _exception(SIGSEGV, regs, SEGV_BNDERR, regs->dar);
> + else
> + bad_page_fault(regs, SIGSEGV);
> + } else if (err == -EINVAL) {
> + unrecoverable_exception(regs);
> + } else {
> + BUG();
> + }
> +}
> #endif
>
You could do something more flat:
if (err == -EINVAL)
unrecoverable_exception(regs);
BUG_ON(err != -EFAULT);
if (user_mode(regs))
_exception(SIGSEGV, regs, SEGV_BNDERR, regs->dar);
else
bad_page_fault(regs, SIGSEGV);
I know you are just moving existing code but moving code is always an
opportunity to clean it without additional churn.
More information about the Linuxppc-dev
mailing list