ErrDisp

From 3dbrew
Revision as of 23:55, 17 February 2015 by Guiand (talk | contribs)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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) == 0 or 1

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?
ADR 0x%08X *(u32*)(errinfo + 8) Address where the error was thrown from?
RSL 0x%08X *(u32*)(errinfo + 4) Error code
Level %d *(u32*)(errinfo + 4) & 0x80000000 ? (*(u32*)(errinfo + 4) >> 27) - 0x20 : *(u32*)(errinfo + 4) >> 27 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) & 0x3FF Error code description
Datetime %04d/%02d/%02d %02d:%02d:%02d ? ?

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) >> 27) - 0x20 : *(u32*)(errinfo + 4) >> 27 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) & 0x3FF Error code description
? %.*s 0x2E, for (int i = 0; i < 2; i++) errinfo + (i * 46) + 0x20 ?
Datetime %04d/%02d/%02d %02d:%02d:%02d ? ?