On my G5s it is impossible to "c[ontinue]" execution after breaking into ddb(4). Doing so always result in a:
panic: trap 9300 at 101000 (ddb_trap+0x40) lr 0x1b Note that 0x9300 == 0x8000 | 0x1300, so it seems that EXC_BPT that is set to enter ddb(8) has not been cleared (or better say the previous value has not been properly restored). I tracked down the problem to the "stmw" instruction in ddb_trap as adding an "isync" right after this instruction "fixes" the problem: @@ -1264,6 +1264,7 @@ _C_LABEL(ddb_trap): isync GET_CPUINFO(%r3) stmw %r28,CI_DDBSAVE(%r3) + isync I'm far from being a PowerPC expert so I'm really interested in hearing what others think of this issue. Nonetheless the 970FX user manual says about lmw/stmw: "The architecture allows these instructions to be interrupted by certain types of asynchronous interrupts (external interrupts, decrementer interrupts, machine check interrupts, and system reset interrupts). In these cases, for the load multiple instructions, all of the registers that were to be updated will have an undefined value, and the instruction must be completely restarted to achieve the full effect (that is, no partial restart capability is supported). For the store multiple instructions, some of the storage locations referenced by the instruction may have been updated. However, to guarantee full completion of the store multiple instruction, they must also be completely restarted." But given the fact that these are microcoded instructions, apparently slower and obviously non-safe, I'd head towards replacing them with multiple stw/lwz. Diff below also fixes the issue for me. If this is a sensible approach I'll try to get rid of all lmw/stmw. I'll obviously keep the socppc version in sync. Comments? Ok? Index: macppc/locore.S =================================================================== RCS file: /cvs/src/sys/arch/macppc/macppc/locore.S,v retrieving revision 1.50 diff -u -p -r1.50 locore.S --- macppc/locore.S 29 Jul 2015 18:52:44 -0000 1.50 +++ macppc/locore.S 9 Oct 2015 16:41:16 -0000 @@ -692,7 +692,10 @@ nop32_7s: mtmsrd %r1 nop32_7e: GET_CPUINFO(%r1) - stmw %r28,CI_DDBSAVE(%r1) /* free r28-r31 */ + stw %r28,(CI_DDBSAVE+0)(%r1) /* free r28 */ + stw %r29,(CI_DDBSAVE+4)(%r1) /* free r29 */ + stw %r30,(CI_DDBSAVE+8)(%r1) /* free r30 */ + stw %r31,(CI_DDBSAVE+12)(%r1) /* free r31 */ mflr %r28 /* save LR */ mfcr %r29 /* save CR */ GET_CPUINFO(%r30) @@ -1263,7 +1266,10 @@ _C_LABEL(ddb_trap): mtmsr %r3 /* disable interrupts */ isync GET_CPUINFO(%r3) - stmw %r28,CI_DDBSAVE(%r3) + stw %r28,(CI_DDBSAVE+0)(%r3) /* save r28 */ + stw %r29,(CI_DDBSAVE+4)(%r3) /* save r29 */ + stw %r30,(CI_DDBSAVE+8)(%r3) /* save r30 */ + stw %r31,(CI_DDBSAVE+12)(%r3) /* save r31 */ /* * If we are already running in interrupt context, the CPU