From 5e1a44b6164d633899a02256ea184a6f99c567e5 Mon Sep 17 00:00:00 2001 From: Helge Deller Date: Sat, 3 Feb 2024 00:01:30 +0100 Subject: parisc: Skip HPMC during bootup We may trigger HPMCs (= trap #1) while probing various I/O addresses for devices. If suc a HPMC is reported by qemu, simply ignore it and return to the next address behind the caller. Signed-off-by: Helge Deller --- src/parisc/head.S | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/parisc/head.S b/src/parisc/head.S index c5da942..4f2b5b5 100644 --- a/src/parisc/head.S +++ b/src/parisc/head.S @@ -441,17 +441,43 @@ ENTRY(smp_ivt) .endr END(smp_ivt) +/******************************************************* + Fault detection & reporting Interrupt vector table (IVT) + *******************************************************/ + +/* fault happened at bootup. Return to instruction after fault. */ +ENTRY(fault_return_to_caller) + mfctl %cr18,TEMP + ldo 4(TEMP),TEMP + mtctl TEMP,%cr18 /* IIAOQ head */ + ldo 4(TEMP),TEMP + mtctl TEMP,%cr18 /* IIAOQ tail */ + rfi + nop +END(fault_return_to_caller) + +/* call firmware_fault_handler in parisc.c and halt. */ +ENTRY(fault_call_firmware) + load32_firmware firmware_fault_handler,TEMP + loadgp + bv,n 0(TEMP) +END(fault_call_firmware) + .align 32 ENTRY(firmware_default_ivt) /* to detect crashes */ .set loop,0 .import firmware_fault_handler,code .rept 32 - .align 32 - load32_firmware firmware_fault_handler,%arg0 - loadgp - bv 0(%arg0) - ldi loop,%arg0 + /* Make sure to use shadow registers only! */ + /* While booting up we check if various devices are available. + Allow such checks and do not raise an HPMC. */ + ldi loop,TEMP /* trap# into TEMP */ + cmpib,= 1,TEMP,fault_return_to_caller + nop + b fault_call_firmware + ldi loop,%arg0 /* trap# into arg0 */ .set loop,loop+1 + .align 32 .endr END(smp_ivt) -- cgit v1.1