Currently we only get a single line of output if a test runs in a unexpected program exception. Let's also print the general registers to give soem more context. Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> Acked-by: Pierre Morel <pmorel@xxxxxxxxxxxxx> --- lib/s390x/interrupt.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c index a59df80e..22649d04 100644 --- a/lib/s390x/interrupt.c +++ b/lib/s390x/interrupt.c @@ -115,11 +115,40 @@ static void fixup_pgm_int(struct stack_frame_int *stack) /* suppressed/terminated/completed point already at the next address */ } +static void print_int_regs(struct stack_frame_int *stack) +{ + printf("\n"); + printf("GPRS:\n"); + printf("%016lx %016lx %016lx %016lx\n", + stack->grs1[0], stack->grs1[1], stack->grs0[0], stack->grs0[1]); + printf("%016lx %016lx %016lx %016lx\n", + stack->grs0[2], stack->grs0[3], stack->grs0[4], stack->grs0[5]); + printf("%016lx %016lx %016lx %016lx\n", + stack->grs0[6], stack->grs0[7], stack->grs0[8], stack->grs0[9]); + printf("%016lx %016lx %016lx %016lx\n", + stack->grs0[10], stack->grs0[11], stack->grs0[12], stack->grs0[13]); + printf("\n"); +} + +static void print_pgm_info(struct stack_frame_int *stack) + +{ + printf("\n"); + printf("Unexpected program interrupt: %d on cpu %d at %#lx, ilen %d\n", + lc->pgm_int_code, stap(), lc->pgm_old_psw.addr, + lc->pgm_int_id); + print_int_regs(stack); + dump_stack(); + report_summary(); + abort(); +} + void handle_pgm_int(struct stack_frame_int *stack) { if (!pgm_int_expected) { /* Force sclp_busy to false, otherwise we will loop forever */ sclp_handle_ext(); + print_pgm_info(stack); report_abort("Unexpected program interrupt: %d on cpu %d at %#lx, ilen %d\n", lc->pgm_int_code, stap(), lc->pgm_old_psw.addr, lc->pgm_int_id); -- 2.25.1