Hacking Misc Others new sega genesis mini find in firmware, related to the errors!

lucarioperf

New Member
Newbie
Joined
Apr 17, 2026
Messages
4
Reaction score
0
Trophies
0
XP
15
Country
United States
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!

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,
could this lead to a bigger flash chip install? i rather use a usb for wifi and a controller not for game storage
maybe! since this post, ive been working with it way more. so far, ive been able to trigger (ALMOST) every error on the screen! (cant get E1, it shows in the logs but wont display on the screen. ill use badengage (the exploit im making!) to see if i can get it later.. im taking the title as "first person to trigger e5" :) (/j)
i also found factory testing binaries (they work somehow!) a mode changer, and i made a little "exploit" to trigger the errors! im also working on a decomp of M2engage (the actual emulator and menu you see on a regular unit!). hopefully this will open more doors to modding and exploring the system :D
 
could this lead to a bigger flash chip install? i rather use a usb for wifi and a controller not for game storage
ive been thinking about this question for a while now... perhaps it IS possible! normally i would think error E5 would be triggered, as a new flash chip would be hardware not normally on the system. however, i noticed only a binary by the name of "cpuinfo" is checked. but if the storage is also checked, E5 would def trigger, and since the research isnt quite solid, i usually assume something like that WOULD happen. the thing is, there is most likely a way to pass this error code instead of shutting off m2 and handing it to shutdown-detection. perhaps the errors come in if theres a size check or expected storage. i would suspect E4 for that, but you can also patch that error as well. only thing i would be worried about then is unexpected, unhandled errors deep within the console. it is a possibility though, would love to see someone try! :D
 

Site & Scene News

Popular threads in this forum