Entry | |
---|---|
R2 | Reason code |
- | Other registers dependent on reason code |
Exit | |
---|---|
- | All registers preserved |
This vector is called during serious error reporting and recovery, such as an Abort. It should not be claimed, but called to notify relevant sections of the OS that a serious error has occurred and/or recovery steps have been taken.
Note that handlers of SeriousErrorV have tighter restrictions placed on them than with other vectors. Specifically, reason code 0 will be called from ABT mode, with IRQ+FIQ disabled, and for safety they must stay within that state. For example, a C module cannot use standard CMHG veneers directly, because the veneer will attempt to switch to SVC mode on entry (running the risk of a recursive abort if the SVC stack pointer is invalid). If your handler is only interested in the SVC-mode reason codes, it’s recommended to use a pre-veneer infront of the CMHG veneer which will filter out all the codes which you are not interested in. Currently reason code 0 is the only reason code with tight restrictions like these, but more reason codes might be introduced in future, so filtering out unknown codes is the safest approach.
0 | Collect. Entered in ABT mode, IRQ+FIQ disabled |
R0 = Pointer to register dump | |
R1 = Pointer to (untranslated) error block | |
1 | Recover. Entered in SVC mode, IRQ disabled |
R0 = Pointer to translated error block | |
2 | Report. Entered in SVC mode, IRQ enabled |
R0 = Pointer to translated error block | |
3 | Custom Report. Entered in SVC mode, IRQ enabled |
R0 = Pointer to translated error block | |
R1 = Flags | |
R3 = Pointer to callback function to receive the report | |
R4 = Callback R0 |
When a serious error occurs, the kernel undertakes the following procedure: