Once nnMain finishes running, it calls a func which handles ADSP Aborts. This waits on an event, calls a func, then Aborts with Result 0xC0899.
+
+
That func just calls another func, which:
+
* Calls various AGIC funcs for this IRQ, etc.
+
* Copies data from devicemem+0x608C (the 0x7000-byte devicemem "shared memory segment") to a stack struct.
+
* A funcptr is called if set with the above struct, then this returns.
+
+
That funcptr, besides other func-calls, will log an [[Error_Report_services|erpt]] using the input struct when set with the "AdspException*" fields.
+
+
This is triggered by AGIC IRQ adsp_wdresetreq, "ADSP Watchdog Timer Reset Request". The ADSP updates the watchdog from a thread, so normally the watchdog only expires when the ADSP configures it to trigger immediately.
+
+
When handling an assert/exception, the ADSP:
+
* Logs exception info in text form into devicemem.
+
* Logs the binary form of the exception into devicemem (offset above).
+
* Eventually configures the watchdog to trigger immediately, prints "HALT: spinning forever...\n", then enters a loop using instruction "wfe".