Re: [PATCH 2/2] powerpc: Print esr register when hitting Program Interrupt
From: Xiongwei Song
Date: Sat Apr 24 2021 - 10:22:12 EST
On Fri, Apr 23, 2021 at 12:50 AM Christophe Leroy
<christophe.leroy@xxxxxxxxxx> 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@xxxxxxxxx>
> >>
> >> The esr register has the details of Program Interrupt on BookE/4xx cpus,
> >> printing its value is helpful.
> >>
> >> Signed-off-by: Xiongwei Song <sxwjean@xxxxxxxxx>
> >> ---
> >> 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