[PATCH 2/2] powerpc: Print esr register when hitting Program Interrupt

Xiongwei Song sxwjean at gmail.com
Sun Apr 25 00:21:29 AEST 2021


On Fri, Apr 23, 2021 at 12:50 AM Christophe Leroy
<christophe.leroy at csgroup.eu> wrote:
>
>
>
> Le 22/04/2021 à 17:29, Christophe Leroy a écrit :
> >
> >
> > Le 22/04/2021 à 17:10, Xiongwei Song a écrit :
> >> From: Xiongwei Song <sxwjean at gmail.com>
> >>
> >> The esr register has the details of Program Interrupt on BookE/4xx cpus,
> >> printing its value is helpful.
> >>
> >> Signed-off-by: Xiongwei Song <sxwjean at gmail.com>
> >> ---
> >>   arch/powerpc/kernel/process.c | 1 +
> >>   1 file changed, 1 insertion(+)
> >>
> >> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> >> index 5c3830837f3a..664aecf8ee2e 100644
> >> --- a/arch/powerpc/kernel/process.c
> >> +++ b/arch/powerpc/kernel/process.c
> >> @@ -1459,6 +1459,7 @@ static bool interrupt_detail_printable(int trap)
> >>       case INTERRUPT_MACHINE_CHECK:
> >>       case INTERRUPT_DATA_STORAGE:
> >>       case INTERRUPT_ALIGNMENT:
> >> +    case INTERRUPT_PROGRAM:
> >
> > With this, it will also print the DSISR on 8xx/6xx so it will print garbage.
> >
> > 8xx/6xx provide the information in SRR1. If you want to proceed, you have to do the same as in ISI:
> > Copy the content of SRR1 into regs->dsisr in the assembly handler in head_book3s_32.S and in the
> > instruction TLB error handler in head_8xx.S
>
> In fact, we already have get_reason() called by do_program_check() to retrieve the reason of the
> program check exception. Maybe it could be used to print usefull information instead of starting
> doing almost the same is another way.

Yes, there is the get_reason() function. But if the program interrupt
is triggered in kernel mode,
the reason can be lost , see the code below:

335 static bool exception_common(int signr, struct pt_regs *regs, int code,
 336                               unsigned long addr)
 337 {
 338         if (!user_mode(regs)) {
 339                 die("Exception in kernel mode", regs, signr);
 340                 return false;
 341         }

The third parameter(int code) of exception_common is to pass the
reason, when in kernel
mode, the "code" parameter is lost, hence I append INTERRUPT_PROGRAM here.

This is for __show_regs(), so just printing the content of the
register is fine I think.

>
> Or we do as I suggested above, and we remove that get_reason() stuff. But get_reason() is also used
> by the alignment exception. So that doesn't look easy.
>
> I don't know what the best approach is.

Is it acceptable to print the interrupt reason before invoking die()
in exception_common()?

Regards,
Xiongwei


More information about the Linuxppc-dev mailing list