ErrDisp

From 3dbrew
Jump to navigation Jump to search

This system process handles displaying the error screens, such as "an error has occurred, the system needs shutdown". This can also display a register dump for exceptions, and info for fatal errors. (Normally the black-screen errors are displayed on retail, while the latter is displayed on development units.)

The register dump/fatal error info can also be written to nandrw/sys/native.log. On retail consoles, the system does not notify ErrDisp that any user-land exceptions occurred, ErrDisp is only notified for this on dev/debug units. Therefore, on retail consoles native.log only contains info from fatal errors. Starting with 5.0.0-11 ErrDisp no longer writes logs to native.log, except when the error-type is value 5 and when other checks with the errorinfo structure are successful (normally processes using this port never use error-type 5).

The bottom screen displays the error screen like "error has occurred", even with a development 3DS. The top screen can display the development error info, this is only displayed when UNITINFO bit0 is clear, for a development 3DS.

ErrDisp handles "returning" to Home Menu via NSS:RebootSystem, which triggers a hardware system reboot.

ErrDisp error port "err:f"

Command Header Description
0x00010800 ThrowFatalError(0x80-byte errorinfo)
0x00020042 (size, (size<<14) | 2, errorinfoptr) This is similar to cmd1, except with this the input buffer is copied to final output errorinfo+0x80 instead of +0x0, via the ARM11 kernel. Max size is 0x100. ErrDisp doesn't do anything in the cmd-handler for this command at all, besides checking the command header and buffer header.

output, where *((u8*)errinfo) == 4

Entry Format string Format args Description
PID 0x%08X_0x%08X *(u32*)(errinfo + 0x10), *(u32*)(errinfo + 0x14) Process ID
REV %d *(u16*)(errinfo + 2) | (*(u8*)(errinfo + 1) << 16) ?
AID 0x%08X_0x%08X *(u32*)(errinfo + 0x18), *(u32*)(errinfo + 0x1C) Application ID?
RSL 0x%08X *(u32*)(errinfo + 4) Error code
Level %d *(u32*)(errinfo + 4) & 0x80000000 ? (*(u32*)(errinfo + 4) >> 0x27) - 0x20 : *(u32*)(errinfo + 4) >> 0x27 Error code level
Summary %d (*(u32*)(errinfo + 4) & 0x7E00000) >> 21 Error code summary
Module %d (*(u32*)(errinfo + 4) & 0x3FC00) >> 10 Error code module
Desc %d (*(u32*)(errinfo + 4) << 22) >> 22 Error code description
? %0.*s 0x2E, for (int i = 0; i < 2; i++) (errinfo + (((i << 3) - i) + (i << 4)) << 1) + 0x20 ?
Datetime %04d/%02d/%02d %02d:%02d:%02d ? ?