R0 -> error, R1-R9 as returned from SWI, R10-R12, SWI addr on stack, R14=SPSR On entry to error handler, for SWI errors: User mode - IRQs on R0 -> error handler's buffer (containing PC error occured at (address of instr after SWI), and a copy of the error) R1-R9 as returned from the SWI R10-R12 recovered from stack (may be wrong if SWI wasn't top level - bad person) User R13,R14 as it was when SWI called Default abort handler: Register block filled in with registers for current mode at time of abort. Stacks flattened R10-R12, PC from dump placed in SVC stack OS_Generate error called. End result: R0-> error R1-R9 corrupt R10-R12 = registers at instant of abort (from mode in which abort happened) R13,R14 = USR registers at instant of abort Register block contains registers for current mode at time of abort. C abort handler should note USR mode registers (only) then pass it on. C error handler should note that it is an abort, and not touch the register dump. Error numbers: &800000XX - machine exceptions: 00=Undef, 01=PAbort, 02=DAbort, 03=AddrEx, 04=Unknown IRQ? 05=BThru0 &800002XX - FP exceptions: 00=IVO, 01=OFL, 02=DVZ, 03=UFL, 04=INX, 05=Faulty FP exceptions: User mode registers go into integer register dump. FP registers go into FP register dump OS_GenerateError from inside FPEm - error handler called with all except R1 intact.