On Fri, Apr 23, 2021 at 12:50 AM Christophe Leroy <christophe.le...@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 <sxwj...@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 <sxwj...@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