Advertisement
Guest User

Bootloader Xiaomi AX6S (RB03)

a guest
Sep 14th, 2022
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.82 KB | Source Code | 0 0
  1. // Bootloader Xiaomi AX6S (RB03)
  2.  
  3. int sub_41E01F68()
  4. {
  5.   char *_autostart; // r0
  6.   char *autostart; // r7
  7.   unsigned __int8 *_flag_try_sys1_failed; // r0
  8.   unsigned int flag_try_sys1_failed; // r6
  9.   unsigned __int8 *_flag_try_sys2_failed; // r0
  10.   unsigned int flag_try_sys2_failed; // r8
  11.   unsigned __int8 *v6; // r0
  12.   unsigned int flag_ota_reboot; // r10
  13.   unsigned __int8 *v8; // r0
  14.   unsigned int flag_last_success; // r5
  15.   bool v10; // cc
  16.   int boot_fw_num; // r4
  17.   bool v12; // cc
  18.   unsigned __int8 *v13; // r0
  19.   _BYTE *kernel_cmd; // r5
  20.   _BYTE *v15; // r5
  21.   char *_uart_en; // r0
  22.   const char *uart_en; // r8
  23.   char boot_cmd[160]; // [sp+0h] [bp-A0h] BYREF
  24.  
  25.   _autostart = getenv("autostart");
  26.   autostart = _autostart;
  27.   if ( _autostart )
  28.     autostart = (char *)sub_41E30468((int)_autostart);
  29.   setenv("autostart", "yes");
  30.   if ( check_factory_mode() == 1 )
  31.   {
  32.     setenv("uart_en", "1");
  33.     setenv("boot_wait", "on");
  34.   }
  35.   _flag_try_sys1_failed = (unsigned __int8 *)getenv("flag_try_sys1_failed");
  36.   flag_try_sys1_failed = (unsigned int)_flag_try_sys1_failed;
  37.   if ( _flag_try_sys1_failed )
  38.     flag_try_sys1_failed = strtol(_flag_try_sys1_failed, 0, 0xAu);
  39.   _flag_try_sys2_failed = (unsigned __int8 *)getenv("flag_try_sys2_failed");
  40.   flag_try_sys2_failed = (unsigned int)_flag_try_sys2_failed;
  41.   if ( _flag_try_sys2_failed )
  42.     flag_try_sys2_failed = strtol(_flag_try_sys2_failed, 0, 0xAu);
  43.   v6 = (unsigned __int8 *)getenv("flag_ota_reboot");
  44.   flag_ota_reboot = (unsigned int)v6;
  45.   if ( v6 )
  46.     flag_ota_reboot = strtol(v6, 0, 10u);
  47.   v8 = (unsigned __int8 *)getenv("flag_last_success");
  48.   flag_last_success = (unsigned int)v8;
  49.   if ( v8 )
  50.     flag_last_success = strtol(v8, 0, 10u);
  51.   v10 = flag_try_sys2_failed > 1;
  52.   if ( flag_try_sys2_failed <= 1 )
  53.     v10 = flag_try_sys1_failed > 1;
  54.   boot_fw_num = v10;
  55.   if ( v10 )
  56.   {
  57.     boot_fw_num = 0;
  58.   }
  59.   else
  60.   {
  61.     v12 = flag_last_success > 1;
  62.     if ( flag_last_success <= 1 )
  63.       v12 = flag_ota_reboot > 1;
  64.     if ( !v12 )
  65.     {
  66.       if ( (flag_try_sys2_failed & flag_try_sys1_failed) != 0 )
  67.         printf("Boot failure detected on both systems\n");
  68.       if ( flag_ota_reboot )
  69.       {
  70.         boot_fw_num = 1 - flag_last_success;
  71.         v13 = (unsigned __int8 *)getenv("flag_boot_success");
  72.         if ( v13 && !strtol(v13, 0, 0xAu) )
  73.         {
  74.           boot_fw_num = flag_last_success;
  75.           printf(" INFO: ota reboot failed, swap to old firmware! \n");
  76.           setenv("flag_ota_reboot", 0);
  77.           setenv("flag_upgrade_push", 0);
  78.         }
  79.       }
  80.       else
  81.       {
  82.         if ( flag_last_success )
  83.           flag_try_sys1_failed = flag_try_sys2_failed;
  84.         if ( flag_try_sys1_failed )
  85.           boot_fw_num = 1 - flag_last_success;
  86.         else
  87.           boot_fw_num = flag_last_success;
  88.       }
  89.     }
  90.   }
  91.   kernel_cmd = sprintf("$", "%s", "console=ttyS0,115200n1 loglevel=8 swiotlb=512 rootfstype=squashfs");
  92.   v15 = &kernel_cmd[(_DWORD)sprintf(&asc_41E4FCC8[(_DWORD)kernel_cmd], " firmware=%d", boot_fw_num)];
  93.   _uart_en = getenv("uart_en");
  94.   uart_en = _uart_en;
  95.   if ( _uart_en && strcmp(_uart_en, "0") )
  96.     v15 = &sprintf(&asc_41E4FCC8[(_DWORD)v15], " uart_en=%s", uart_en)[(_DWORD)v15];
  97.   if ( check_factory_mode() )
  98.   {
  99.     sprintf(&asc_41E4FCC8[(_DWORD)v15], " factory_mode=%s", "1");
  100.     setenv("uart_en", "1");
  101.     setenv("boot_wait", "on");
  102.   }
  103.   setenv(byte_41E3B956, "$");
  104.   if ( boot_fw_num )
  105.   {
  106.     setenv("flag_boot_rootfs", "1");
  107.     sprintf(boot_cmd, "%s", "run boot_fw1");
  108.   }
  109.   else
  110.   {
  111.     setenv("flag_boot_rootfs", "0");
  112.     sprintf(boot_cmd, "%s", "run boot_fw0");
  113.   }
  114.   save_env();
  115.   printf("Booting System %d\n", boot_fw_num);
  116.   sub_41E03BAC((int)boot_cmd);
  117.   if ( autostart )
  118.   {
  119.     setenv("autostart", autostart);
  120.     sub_41E12954(autostart);
  121.   }
  122.   return 0;
  123. }
Tags: Xiaomi RB03
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement