hello fellow sega genesis mini modders! this is my first post here, so hello all!
anyway, i was recently messing with my sega genesis mini, and got a very common and documented error, known as "E4: Please Shutdown".
i did some research and saw many other people have seen it for different reasons! the most common being that they left the console on for too long, overheating(?), bad ROMS, something to do with modding, or running out of space.
now, i've always been curious about these messages! i used to get E4 after running the console on idle for way too long....
i have never seen any other error messages online, but i knew there must be more, considering the fact that it says E4!
i'm not a pro at anything, but i was able to dump the firmware using hakchi! once there, i poked around in system folders and found init.d, (if you dont know, the sega genesis mini actually runs a whole entire linux system! so just look in the places where linux scripts are stored and youll find what i found.) where i followed a crumb trail if you will, starting with a watchdog, heartbeat, and more, leading to the actual file where all errors are stored! (known as shutdown-detection, located in "/system_software/usr/bin")
heres the E[NUM] errors i saw in the file!
(the numbering may seem wrong in the binary compared to this post, but i used ghidra to list it out. the ghidra output will also be after the raw binary chunk! i had to edit it lol, i had it wrong the first time.)
!!and thats not all!! there seemed to be other errors that dont start with E[NUM], and i dont think you will see them on screen! under this text is the raw binary chunk where everything is! take a look for extra errors, + the actual source of the E[NUM] errors.
also, heres the ghidra output for the correct listing of the errors!
anyway, thx 4 reading! let me know if you have any clue as to whats going on, theories on the errors, or are interested in more! i'd love to work with this neat little system some more, and i'll take any help!
bye!
-lulu
anyway, i was recently messing with my sega genesis mini, and got a very common and documented error, known as "E4: Please Shutdown".
i did some research and saw many other people have seen it for different reasons! the most common being that they left the console on for too long, overheating(?), bad ROMS, something to do with modding, or running out of space.
now, i've always been curious about these messages! i used to get E4 after running the console on idle for way too long....
i have never seen any other error messages online, but i knew there must be more, considering the fact that it says E4!
i'm not a pro at anything, but i was able to dump the firmware using hakchi! once there, i poked around in system folders and found init.d, (if you dont know, the sega genesis mini actually runs a whole entire linux system! so just look in the places where linux scripts are stored and youll find what i found.) where i followed a crumb trail if you will, starting with a watchdog, heartbeat, and more, leading to the actual file where all errors are stored! (known as shutdown-detection, located in "/system_software/usr/bin")
heres the E[NUM] errors i saw in the file!
Code:
E1: Please Shutdown[ERROR] Segmentation fault. (i think this one is related to reading from a bad section of memory! im honestly not sure though, ideas from u guys would be nice for any of these errors, especially this one!)
E2: Please Shutdown[ERROR] Arithmetic exception. (this is a math related hard crash i think. maybe dividing by zero or something.)
E3: Please Shutdown[ERROR] Watchdog triggered. (this is probably related to game hangups! considering the fact watchdog is related to the heartbeat, updated by a game every 5 seconds in tmp.)
E4: Please Shutdown[ERROR] Unknown error: %d. (this one seems to be a catchall! perhaps why it is so common. i assume the others would be very hard to trigger, and im sure nobody has seen them before!)
E5: Please Shutdown[ERROR] Chip ID mismatch. (now THIS is where it gets interesting! i think the mini might have some sort of chip security? perhaps it was to prevent people from running the firmware on other hardware. either way this is super interesting, and i think has a bigger trail to follow as well! i might do more digging there. :D)
(the numbering may seem wrong in the binary compared to this post, but i used ghidra to list it out. the ghidra output will also be after the raw binary chunk! i had to edit it lol, i had it wrong the first time.)
!!and thats not all!! there seemed to be other errors that dont start with E[NUM], and i dont think you will see them on screen! under this text is the raw binary chunk where everything is! take a look for extra errors, + the actual source of the E[NUM] errors.
Code:
sdl_initshow_infoxsinfo.cxsinfo[ERROR] SDL_Init().
[ERROR] SDL_GetError=%s.
Running on %dx%d
[ERROR] Connot find display.
[ERROR] TTF_Init().
[ERROR] TTF_GetError=%s.
[ERROR] SDL_CreateWindowAndRenderer().
SDL_RENDER_SCALE_QUALITYlinear[ERROR] sdl_printf_open().
SHUTTING DOWN/tmp/.game_hangup[ERROR] Watchdog triggered.
E3: Please Shutdown[ERROR] Segmentation fault.
E1: Please Shutdown[ERROR] Arithmetic exception.
E2: Please Shutdown[ERROR] Chip ID mismatch.
E5: Please Shutdown[ERROR] Unknown error: %d.
E4: Please Shutdown/sbin/poweroffsdl_printf_opensdl_printf_close/usr/local/res/fonts/NotoSansMonoCJKsc-Regular.otfmodules/xsprintf.cXSPRINTF[TRACE] TTF_OpenFont().
[ERROR] Font file does not exist.
[ERROR] TTF_OpenFont().
[TRACE] TTF_CloseFont().
also, heres the ghidra output for the correct listing of the errors!
Code:
undefined4 FUN_00010f30(int param_1)
{
int iVar1;
undefined4 uVar2;
undefined4 uVar3;
char *pcVar4;
undefined1 auStack_50 [8];
undefined4 local_48;
undefined4 local_44;
iVar1 = SDL_Init(0x20);
if (iVar1 == 0) {
iVar1 = SDL_GetNumVideoDisplays();
if (iVar1 < 1) {
uVar2 = 0x80;
pcVar4 = "[ERROR] Connot find display.\n";
LAB_00011118:
xs_log("xsinfo.c","sdl_init",uVar2,"xsinfo",3,pcVar4);
goto LAB_00011120;
}
SDL_memset(auStack_50,0,0x10);
SDL_GetDisplayBounds(0,auStack_50);
uVar2 = local_48;
uVar3 = local_44;
xs_log("xsinfo.c","sdl_init",0x7c,"xsinfo",1,"Running on %dx%d\n",local_48,local_44);
iVar1 = TTF_Init();
if (iVar1 == 0) {
iVar1 = SDL_CreateWindowAndRenderer(local_48,local_44,0x24,&DAT_00021cd0,&DAT_00021cd4);
if (iVar1 == 0) {
SDL_SetHint("SDL_RENDER_SCALE_QUALITY","linear");
DAT_00021cd8 = FUN_000113dc(0x30);
if (DAT_00021cd8 != 0) goto LAB_00011120;
uVar2 = 0x9a;
pcVar4 = "[ERROR] sdl_printf_open().\n";
goto LAB_00011118;
}
xs_log("xsinfo.c","sdl_init",0x90,"xsinfo",3,"[ERROR] SDL_CreateWindowAndRenderer().\n",uVar2,
uVar3);
uVar2 = SDL_GetError();
uVar3 = 0x91;
pcVar4 = "[ERROR] SDL_GetError=%s.\n";
}
else {
xs_log("xsinfo.c","sdl_init",0x87,"xsinfo",3,"[ERROR] TTF_Init().\n",uVar2,uVar3);
uVar2 = SDL_GetError();
uVar3 = 0x88;
pcVar4 = "[ERROR] TTF_GetError=%s.\n";
}
}
else {
xs_log("xsinfo.c","sdl_init",0x73,"xsinfo",3,"[ERROR] SDL_Init().\n");
uVar2 = SDL_GetError();
uVar3 = 0x74;
pcVar4 = "[ERROR] SDL_GetError=%s.\n";
}
xs_log("xsinfo.c","sdl_init",uVar3,"xsinfo",3,pcVar4,uVar2);
LAB_00011120:
iVar1 = SDL_GetKeyboardState(0);
SDL_RenderClear(DAT_00021cd4);
if (*(char *)(iVar1 + 0x66) != '\0') {
iVar1 = access("/tmp/.game_hangup",0);
if (iVar1 == -1) {
if (param_1 == 0x8b) {
xs_log("xsinfo.c","show_info",0x39,"xsinfo",3,"[ERROR] Segmentation fault.\n");
pcVar4 = "E1: Please Shutdown";
}
else if (param_1 == 0x88) {
xs_log("xsinfo.c","show_info",0x3f,"xsinfo",3,"[ERROR] Arithmetic exception.\n");
pcVar4 = "E2: Please Shutdown";
}
else if (param_1 == 99) {
xs_log("xsinfo.c","show_info",0x45,"xsinfo",3,"[ERROR] Chip ID mismatch.\n");
pcVar4 = "E5: Please Shutdown";
}
else {
xs_log("xsinfo.c","show_info",0x4b,"xsinfo",3,"[ERROR] Unknown error: %d.\n",param_1);
pcVar4 = "E4: Please Shutdown";
}
}
else {
xs_log("xsinfo.c","show_info",0x33,"xsinfo",3,"[ERROR] Watchdog triggered.\n");
pcVar4 = "E3: Please Shutdown";
}
FUN_00011524(DAT_00021cd4,DAT_00021cd8,&DAT_00021cc8,pcVar4);
SDL_SetRenderDrawColor(DAT_00021cd4,0,0,0,0);
SDL_RenderPresent(DAT_00021cd4);
do {
SDL_Delay(100);
do {
iVar1 = SDL_PollEvent(auStack_50);
} while (iVar1 != 0);
iVar1 = SDL_GetKeyboardState();
} while (*(char *)(iVar1 + 0x66) != '\0');
}
SDL_RenderClear(DAT_00021cd4);
FUN_00011524(DAT_00021cd4,DAT_00021cd8,&DAT_00021cc8,"SHUTTING DOWN");
SDL_SetRenderDrawColor(DAT_00021cd4,0,0,0,0);
SDL_RenderPresent(DAT_00021cd4);
SDL_FlushEvents(0,0xffff);
if (DAT_00021cd8 != 0) {
FUN_000114c8();
DAT_00021cd8 = 0;
}
if (DAT_00021cd4 != 0) {
SDL_DestroyRenderer();
DAT_00021cd4 = 0;
}
if (DAT_00021cd0 != 0) {
SDL_DestroyWindow();
DAT_00021cd0 = 0;
}
SDL_Quit();
TTF_Quit();
SDL_Delay(100);
execl("/sbin/poweroff","poweroff");
return 0;
anyway, thx 4 reading! let me know if you have any clue as to whats going on, theories on the errors, or are interested in more! i'd love to work with this neat little system some more, and i'll take any help!
bye!
-lulu
Last edited by lucarioperf,






