Guest User

a_small_sample_wiiu

a guest
Mar 26th, 2016
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 49.74 KB | None | 0 0
  1. //----- (08120364) --------------------------------------------------------
  2. // int read_otp(u32 wordindex, void *out_buf, u32 size)
  3. // Read data from the OTP, this can only be used from the IOS-CRYPTO process.
  4. // -> 0 on success, -1 when IOUS PID isn't 3.
  5. //
  6. int __fastcall SysCall_0x22(u32 wordindex, void *out_buf, u32 size)
  7. {
  8. void *v3; // r5@1
  9. u32 v4; // r4@1
  10. int v5; // r6@1
  11. int v6; // lr@1
  12. int result; // r0@2
  13.  
  14. v3 = out_buf;
  15. v4 = size;
  16. v5 = wordindex;
  17. v6 = -1;
  18. if ( *(_DWORD *)(current_thread_ctx_addr + 84) != 3 || (v6 = sub_8124AD8((unsigned int)out_buf, size, 4, 3, 3)) != 0 )
  19. result = v6;
  20. else
  21. result = Kernel_Read_From_OTP(v5, v3, v4);
  22. return result;
  23. }
  24. // 8173BA0: using guessed type int current_thread_ctx_addr;
  25.  
  26. //----- (081203D8) --------------------------------------------------------
  27. int __fastcall sub_81203D8(int a1)
  28. {
  29. char v1; // zf@2
  30. int v2; // r3@6
  31. int v3; // r3@5
  32. int result; // r0@5
  33.  
  34. if ( (unsigned __int8)off_8143000 == 32 )
  35. goto LABEL_9;
  36. v1 = (unsigned __int8)off_8143000 == 16;
  37. if ( (unsigned __int8)off_8143000 != 16 )
  38. v1 = (unsigned __int8)off_8143000 == 0;
  39. if ( v1 )
  40. {
  41. LABEL_9:
  42. dword_D800038 = a1;
  43. v2 = a1 | dword_D80003C;
  44. result = 0;
  45. dword_D80003C = v2;
  46. }
  47. else
  48. {
  49. dword_D800470 = a1;
  50. v3 = a1 | dword_D800478;
  51. result = 0;
  52. dword_D800478 = v3;
  53. }
  54. return result;
  55. }
  56. //----- (08120434) --------------------------------------------------------
  57. signed int __fastcall sub_8120434(int a1)
  58. {
  59. int v1; // r1@1
  60. signed int result; // r0@1
  61. char v3; // zf@2
  62.  
  63. v1 = a1;
  64. result = -4;
  65. if ( (unsigned __int8)off_8143000 != 32 )
  66. {
  67. v3 = (unsigned __int8)off_8143000 == 16;
  68. if ( (unsigned __int8)off_8143000 != 16 )
  69. v3 = (unsigned __int8)off_8143000 == 0;
  70. if ( !v3 )
  71. {
  72. dword_D800474 = v1;
  73. result = 0;
  74. dword_D80047C |= v1;
  75. }
  76. }
  77. return result;
  78. }
  79. //----- (08120488) --------------------------------------------------------
  80. // write access to const memory has been detected, the output may be wrong!
  81. signed int sub_8120488()
  82. {
  83. signed int result; // r0@1
  84. char v1; // zf@2
  85.  
  86. result = 226492416;
  87. if ( (unsigned __int8)off_8143000 == 32 )
  88. goto LABEL_9;
  89. v1 = (unsigned __int8)off_8143000 == 16;
  90. if ( (unsigned __int8)off_8143000 != 16 )
  91. v1 = (unsigned __int8)off_8143000 == 0;
  92. if ( v1 )
  93. {
  94. LABEL_9:
  95. starlet_gpio2_INTENABLE = 0;
  96. dword_D80003C = (int)byte_20801;
  97. off_FFFF0038 = sub_812DF60;
  98. dword_D800180 |= 6u;
  99. }
  100. else
  101. {
  102. off_FFFF0038 = sub_812E1BC;
  103. starlet_gpio2_INTENABLE = 0;
  104. dword_D800478 = (int)byte_20801;
  105. dword_D80047C = 0;
  106. }
  107. return result;
  108. }
  109. //----- (08120510) --------------------------------------------------------
  110. int sub_8120510()
  111. {
  112. int result; // r0@1
  113. char v1; // zf@2
  114. signed int v2; // r2@5
  115.  
  116. result = 0;
  117. dword_D800014 = 0;
  118. if ( (unsigned __int8)off_8143000 == 32 )
  119. goto LABEL_12;
  120. v1 = (unsigned __int8)off_8143000 == 16;
  121. if ( (unsigned __int8)off_8143000 != 16 )
  122. v1 = (unsigned __int8)off_8143000 == 0;
  123. v2 = v1 ? 1 : 0;
  124. if ( v1 )
  125. {
  126. LABEL_12:
  127. starlet_gpio2_INTFLAG = -1;
  128. dword_D800038 = -16897;
  129. starlet_gpio2_INTENABLE = 0;
  130. dword_D80003C = 0;
  131. dword_D800040[0] = 0;
  132. }
  133. else
  134. {
  135. starlet_gpio2_INTFLAG = -1;
  136. dword_D800470 = -16897;
  137. dword_D800474 = -1;
  138. starlet_gpio2_INTENABLE = v2;
  139. dword_D800478 = v2;
  140. dword_D800480 = v2;
  141. dword_D80047C = v2;
  142. dword_D800484 = v2;
  143. }
  144. return result;
  145. }
  146. //----- (08120590) --------------------------------------------------------
  147. // int IOS_ClearandEnable(int id)
  148. // Enables hardware interrupts (IRQs) for the specified device
  149. // -> 0 on success
  150. int __fastcall SysCall_0x50(int id)
  151. {
  152. int v1; // r4@1
  153. int v2; // r0@1
  154. int v3; // r5@1
  155. signed int v4; // r4@2
  156. int result; // r0@3
  157.  
  158. v1 = id;
  159. v2 = disable_interrupts();
  160. v3 = v2;
  161. switch ( v1 )
  162. {
  163. case 1:
  164. v4 = sub_81203D8(2);
  165. goto LABEL_3;
  166. case 2:
  167. if ( *(_DWORD *)(current_thread_ctx_addr + 84) != 3 )
  168. goto LABEL_5;
  169. v4 = sub_81203D8(4);
  170. goto LABEL_3;
  171. case 3:
  172. if ( *(_DWORD *)(current_thread_ctx_addr + 84) != 3 )
  173. goto LABEL_5;
  174. v4 = sub_81203D8(8);
  175. goto LABEL_3;
  176. case 4:
  177. v4 = sub_81203D8(16);
  178. goto LABEL_3;
  179. case 5:
  180. v4 = sub_81203D8(32);
  181. goto LABEL_3;
  182. case 6:
  183. v4 = sub_81203D8(64);
  184. goto LABEL_3;
  185. case 7:
  186. v4 = sub_81203D8(128);
  187. goto LABEL_3;
  188. case 8:
  189. v4 = sub_81203D8(256);
  190. goto LABEL_3;
  191. case 9:
  192. starlet_gpio2_INTFLAG = 1;
  193. v4 = 0;
  194. starlet_gpio2_INTENABLE |= 1u;
  195. goto LABEL_3;
  196. case 10:
  197. if ( *(_DWORD *)(current_thread_ctx_addr + 84) )
  198. goto LABEL_5;
  199. v4 = sub_81203D8(4096);
  200. goto LABEL_3;
  201. default:
  202. v4 = -4;
  203. goto LABEL_3;
  204. case 15:
  205. v4 = sub_81203D8(0x20000);
  206. goto LABEL_3;
  207. case 16:
  208. v4 = sub_81203D8(0x40000);
  209. goto LABEL_3;
  210. case 18:
  211. v4 = sub_81203D8(0x100000);
  212. goto LABEL_3;
  213. case 26:
  214. v4 = sub_81203D8(0x10000000);
  215. goto LABEL_3;
  216. case 29:
  217. if ( *(_DWORD *)(current_thread_ctx_addr + 84) )
  218. goto LABEL_5;
  219. v4 = sub_81203D8(2147483648);
  220. goto LABEL_3;
  221. case 30:
  222. v4 = sub_8120434(1);
  223. goto LABEL_3;
  224. case 31:
  225. v4 = sub_8120434(2);
  226. goto LABEL_3;
  227. case 32:
  228. v4 = sub_8120434(4);
  229. goto LABEL_3;
  230. case 33:
  231. v4 = sub_8120434(8);
  232. goto LABEL_3;
  233. case 34:
  234. v4 = sub_8120434(16);
  235. goto LABEL_3;
  236. case 35:
  237. v4 = sub_8120434(32);
  238. goto LABEL_3;
  239. case 36:
  240. v4 = sub_8120434(64);
  241. goto LABEL_3;
  242. case 37:
  243. v4 = sub_8120434(128);
  244. goto LABEL_3;
  245. case 38:
  246. if ( *(_DWORD *)(current_thread_ctx_addr + 84) != 3 )
  247. goto LABEL_5;
  248. v4 = sub_8120434(256);
  249. goto LABEL_3;
  250. case 39:
  251. if ( *(_DWORD *)(current_thread_ctx_addr + 84) != 3 )
  252. goto LABEL_5;
  253. v4 = sub_8120434(512);
  254. goto LABEL_3;
  255. case 40:
  256. v4 = sub_8120434(1024);
  257. goto LABEL_3;
  258. case 41:
  259. v4 = sub_8120434(2048);
  260. goto LABEL_3;
  261. case 42:
  262. v4 = sub_8120434(4096);
  263. goto LABEL_3;
  264. case 43:
  265. v4 = sub_8120434(0x2000);
  266. goto LABEL_3;
  267. case 44:
  268. v4 = sub_8120434(0x4000);
  269. goto LABEL_3;
  270. case 45:
  271. if ( *(_DWORD *)(current_thread_ctx_addr + 84) )
  272. goto LABEL_5;
  273. v4 = sub_8120434(0x8000000);
  274. goto LABEL_3;
  275. case 46:
  276. if ( *(_DWORD *)(current_thread_ctx_addr + 84) )
  277. goto LABEL_5;
  278. v4 = sub_8120434(0x20000000);
  279. goto LABEL_3;
  280. case 47:
  281. if ( *(_DWORD *)(current_thread_ctx_addr + 84) )
  282. {
  283. LABEL_5:
  284. sub_812E78C(v2);
  285. result = -1;
  286. }
  287. else
  288. {
  289. v4 = sub_8120434(2147483648);
  290. LABEL_3:
  291. sub_812E78C(v3);
  292. result = v4;
  293. }
  294. return result;
  295. }
  296. }
  297. // 8173BA0: using guessed type int current_thread_ctx_addr;
  298. // D8000F0: using guessed type int starlet_gpio2_INTFLAG;
  299. // D8000F4: using guessed type int starlet_gpio2_INTENABLE;
  300.  
  301. //----- (08120970) --------------------------------------------------------
  302. // void get_debug_register_value()
  303. // Stores the value from LT_DEBUG register in the IOSU heap
  304. // -> Nothing
  305. int __fastcall SysCall_0x6E()
  306. {
  307. dword_8150000 = dword_D8005A4;
  308. }
  309.  
  310. //----- (08120988) --------------------------------------------------------
  311. // void clear_debug_register_value()
  312. // Clears the LT_DEBUG register
  313. // -> Nothing
  314. int __fastcall SysCall_0x6F()
  315. {
  316. dword_D8005A4 = 0;
  317. }
  318. //----- (08120998) --------------------------------------------------------
  319. // void set_debug_register_value(u32 value)
  320. // Sets the value of the LT_DEBUG register
  321. // -> Nothing
  322. int __fastcall SysCall_0x70(int result)
  323. {
  324. if ( *(_DWORD *)(current_thread_ctx_addr + 84) == 1 )
  325. dword_D8005A4 = result;
  326. return result;
  327. }
  328. //----- (081209B8) --------------------------------------------------------
  329. // int check_debug_flag(u32 flag)
  330. // Checks if the supplied flag is enabled in the LT_DEBUG register copy on the IOSU heap
  331. // -> The flag value if enabled or 0 if disabled
  332. int __fastcall SysCall_0x71(u32 flag)
  333. {
  334. return flag & dword_8150000;
  335. }
  336. //----- (081209CC) --------------------------------------------------------
  337. // int set_iop2x_state(u32 state)
  338. // Sets the state of an unknown feature from BSP
  339. // -> 0 on success
  340. int __fastcall SysCall_0x6C(u32 state)
  341. {
  342. u32 v1; // r5@1
  343. int result; // r0@2
  344. int v3; // r0@3
  345. bool v4; // r6@3
  346. unsigned int v5; // r3@3
  347. int v6; // r11@3
  348. signed int v7; // r1@5
  349. int v8; // r9@7
  350. int v9; // r10@7
  351. int v10; // r8@7
  352. int v11; // r7@7
  353. signed int v12; // r2@9
  354. unsigned int v13; // r3@11
  355. int v14; // r2@11
  356. unsigned int v15; // r3@11
  357. int v16; // r4@13
  358. char v17; // r3@15
  359.  
  360. v1 = state;
  361. if ( *(_DWORD *)(current_thread_ctx_addr + 84) == 2 )
  362. {
  363. v3 = disable_interrupts();
  364. v4 = v1 == 0;
  365. v5 = (dword_D8005BC & 4u) >> 2;
  366. v6 = v3;
  367. if ( v4 & v5 || ((v17 = v5 ^ 1, v1) ? (v3 = v17 & 1) : (v3 = 0), v3) )
  368. {
  369. if ( v1 )
  370. v7 = 3;
  371. else
  372. v7 = 1;
  373. v8 = dword_D800478;
  374. v9 = dword_D80047C;
  375. v10 = dword_D800480;
  376. v11 = dword_D800484;
  377. dword_D800478 = 0;
  378. dword_D800480 = 0;
  379. dword_D800484 = 0;
  380. dword_D800474 = 4096;
  381. dword_D80047C = 4096;
  382. dword_D8005BC = v7;
  383. sub_81314C4(v3);
  384. while ( !(dword_D800474 & 0x1000) )
  385. ;
  386. dword_D80047C = 0;
  387. dword_D800474 = 4096;
  388. v12 = v1;
  389. if ( v1 )
  390. v12 = 1;
  391. v13 = dword_D8005BC & 4;
  392. v14 = v12 & (v13 >> 2);
  393. v15 = v13 >> 2;
  394. if ( v14 || v4 & (v15 ^ 1) )
  395. {
  396. v16 = 0;
  397. dword_D800478 = v8;
  398. dword_D80047C = v9;
  399. dword_D800480 = v10;
  400. dword_D800484 = v11;
  401. }
  402. else
  403. {
  404. v16 = -21;
  405. dword_D800478 = v8;
  406. dword_D80047C = v9;
  407. dword_D800480 = v10;
  408. dword_D800484 = v11;
  409. }
  410. }
  411. else
  412. {
  413. v16 = 0;
  414. }
  415. sub_812E78C(v6);
  416. result = v16;
  417. }
  418. else
  419. {
  420. result = -1;
  421. }
  422. return result;
  423. }
  424.  
  425. //----- (08120B10) --------------------------------------------------------
  426. int sub_8120B10()
  427. {
  428. int v0; // r0@1
  429. signed int v1; // r12@1
  430. unsigned int *v2; // r1@2
  431. int v3; // r2@2
  432. _DWORD *v4; // r1@3
  433. _DWORD *v5; // r3@4
  434. _DWORD *v6; // r2@4
  435.  
  436. HW_RESETS &= 0xFFBFBFFF;
  437. dword_D8005E0 &= 0xFFFFFFF7;
  438. v0 = sub_81247B4(4);
  439. v1 = 218366036;
  440. do
  441. {
  442. v2 = (unsigned int *)(v1 + 917504);
  443. *(_DWORD *)v1 = *(_DWORD *)v1 & 0xFFFFFFFB | 0x100;
  444. v3 = *(_DWORD *)(v1 + 917504);
  445. v1 += 4;
  446. *v2 = v3 & 0xFFFFFFFB | 0x100;
  447. }
  448. while ( v1 != 218366060 );
  449. v4 = (_DWORD *)218431572;
  450. do
  451. {
  452. *v4 = 16;
  453. v5 = v4 + 0x4000;
  454. v6 = v4 + 229376;
  455. ++v4;
  456. *v5 = 16;
  457. *v6 = 16;
  458. }
  459. while ( v4 != (_DWORD *)218431588 );
  460. return sub_81247B4(v0);
  461. }
  462. //----- (08120BB8) --------------------------------------------------------
  463. const char *sub_8120BB8()
  464. {
  465. void *v0; // r6@1
  466. signed int v1; // r0@1
  467. unsigned int v2; // r3@1
  468. signed int v3; // r5@1
  469. char v4; // zf@2
  470. const char *result; // r0@6
  471.  
  472. v0 = sub_812EB3C("Sys", 0, 0, 0, 0);
  473. v1 = sub_812ED34(&off_8143000);
  474. v2 = (unsigned int)off_8143000 >> 24;
  475. v3 = v1;
  476. if ( (unsigned int)off_8143000 >> 24 != 32 )
  477. {
  478. v4 = v2 == 0;
  479. if ( v2 )
  480. v4 = v2 == 16;
  481. if ( !v4 && !((unsigned int)off_8143000 & 0xF000000) )
  482. sub_8129A24("__iosPreBSPHardwareInit() failed to detect valid hardware version!\n");
  483. }
  484. result = "BSP Managed Entities Failed Initialization!\n";
  485. if ( (unsigned int)v0 | v3 )
  486. sub_8129A24("BSP Managed Entities Failed Initialization!\n");
  487. return result;
  488. }
  489. // 8143000: using guessed type int (*off_8143000)[264357];
  490.  
  491. //----- (08120C58) --------------------------------------------------------
  492. int sub_8120C58()
  493. {
  494. HW_EXICTRL = HW_EXICTRL & 0xFFFFFFFE | 1;
  495. HW_EXICTRL |= 4u;
  496. dword_D800074 |= 0x10u;
  497. if ( sub_8125298() )
  498. sub_8129A24("__iosInitMMU() failed!\n");
  499. if ( sub_8122500() )
  500. sub_8129A24("__iosMemMapInit() failed!\n");
  501. return sub_812EA44();
  502. }//----- (08120CC4) --------------------------------------------------------
  503. int sub_8120CC4()
  504. {
  505. dword_8143004 = sub_812CCB4((u32 (__cdecl *)(void *))sub_8120D08, 0, (u32 *)&dword_FFFF0500, 0x400u, 0);
  506. return 0;
  507. }
  508. //----- (08120D08) --------------------------------------------------------
  509. void sub_8120D08()
  510. {
  511. while ( 1 )
  512. {
  513. sub_812994C();
  514. sub_812994C();
  515. }
  516. }
  517.  
  518. //----- (08120D18) --------------------------------------------------------
  519. int *__fastcall sub_8120D18(unsigned int a1)
  520. {
  521. unsigned int v1; // r2@1
  522. int *result; // r0@2
  523.  
  524. v1 = 169 * a1;
  525. if ( a1 > 2 || (result = &debug_args_addr[v1], !debug_args_addr[v1]) )
  526. result = 0;
  527. return result;
  528. }
  529. // FFFF1904: using guessed type int debug_args_addr[];
  530.  
  531. //----- (08120D58) --------------------------------------------------------
  532. int __fastcall sub_8120D58(int a1, int a2, int a3)
  533. {
  534. int *v3; // r12@1
  535. int result; // r0@1
  536.  
  537. v3 = *(int **)(a1 + 72);
  538. result = ~a2;
  539. *v3 = a3 & a2 | *v3 & ~a2;
  540. return result;
  541. }
  542.  
  543. //----- (08120D78) --------------------------------------------------------
  544. // int flush_ipc_server()
  545. // Resets the ARM IPC control register's flags
  546. // -> 0 on success
  547. int __fastcall SysCall_0x5B()
  548. {
  549. int *v0; // r2@1
  550. _DWORD *v1; // r3@2
  551. char v2; // zf@2
  552.  
  553. v0 = debug_args_addr;
  554. do
  555. {
  556. v1 = (_DWORD *)*v0;
  557. v2 = *v0 == 0;
  558. if ( *v0 )
  559. v1 = *(_DWORD **)((char *)v0 + (_DWORD)byte_48);
  560. v0 += 169;
  561. if ( !v2 )
  562. *v1 = 62;
  563. }
  564. while ( v0 != &dword_FFFF20F0 );
  565. return 0;
  566. }
  567. //----- (08120DB0) --------------------------------------------------------
  568. int __fastcall sub_8120DB0(int a1, int a2, unsigned int a3)
  569. {
  570. return sub_81200F0(a2, a3);
  571. }
  572.  
  573. //----- (08120DBC) --------------------------------------------------------
  574. int __fastcall sub_8120DBC(int a1)
  575. {
  576. int v1; // r6@1
  577. int v2; // r5@1
  578. int result; // r0@1
  579. int v4; // r3@2
  580. int v5; // r2@2
  581. int v6; // r3@3
  582. void *v7; // r4@3
  583. int v8; // r3@3
  584. int v9; // r1@3
  585. int v10; // r3@4
  586. int v11; // r2@4
  587. char v12; // zf@4
  588. bool v13; // r3@4
  589.  
  590. v1 = *(_DWORD *)(a1 + 612);
  591. v2 = a1;
  592. result = a1 + 84;
  593. if ( !v1 )
  594. {
  595. v4 = *(_DWORD *)(v2 + 84);
  596. v5 = v4 - 1;
  597. if ( v4 )
  598. {
  599. v6 = *(_DWORD *)(result + 4);
  600. *(_DWORD *)(v2 + 84) = v5;
  601. v7 = *(void **)(result + 4 * v6 + 12);
  602. *(_DWORD *)(result + 4) = ((_BYTE)v6 + 1) & 0x7F;
  603. SysCall_0x52(v7, 0x38u);
  604. **(_DWORD **)(v2 + 80) = v7;
  605. v8 = *(_DWORD *)(v2 + 608);
  606. v9 = v8 - 1;
  607. if ( !v8 )
  608. sub_8129A24("IPC(%d): flowControlRetireRequest() invalid state detected\n", *(_DWORD *)(v2 + 8));
  609. v10 = *(_DWORD *)(v2 + 616);
  610. v11 = 9;
  611. v12 = v10 == 0;
  612. v13 = v10 != 0;
  613. *(_DWORD *)(v2 + 608) = v9;
  614. if ( v12 )
  615. {
  616. v11 = 1;
  617. *(_DWORD *)(v2 + 612) = 1;
  618. }
  619. else
  620. {
  621. *(_DWORD *)(v2 + 612) = v13;
  622. *(_DWORD *)(v2 + 616) = 0;
  623. }
  624. result = sub_8120D58(v2, -49, v11);
  625. ++*(_DWORD *)(v2 + 672);
  626. }
  627. }
  628. return result;
  629. }
  630.  
  631. //----- (08120E80) --------------------------------------------------------
  632. int __fastcall sub_8120E80(int a1, unsigned int *a2, int a3)
  633. {
  634. unsigned int *v3; // r6@1
  635. unsigned int v4; // r1@1
  636. int v5; // r11@1
  637. int v6; // r8@1
  638. int v7; // r12@5
  639. int v8; // r0@5
  640. unsigned int v9; // r1@5
  641. unsigned int v10; // r0@5
  642. int v12; // r3@8
  643. int v13; // r3@8
  644. int v14; // r6@9
  645. signed int v15; // r9@9
  646. int v16; // r10@10
  647. int v17; // r7@10
  648. unsigned int v18; // r0@11
  649.  
  650. v3 = a2;
  651. v4 = _byteswap_ulong(*a2);
  652. v5 = a3;
  653. v6 = a1;
  654. switch ( v4 )
  655. {
  656. case 6u:
  657. v12 = *((_BYTE *)v3 + 43);
  658. sub_8120DB0(a1, _byteswap_ulong(v3[10]), _byteswap_ulong(v3[11]));
  659. v13 = *((_BYTE *)v3 + 51);
  660. sub_8120DB0(v6, _byteswap_ulong(v3[12]), _byteswap_ulong(v3[13]));
  661. break;
  662. case 7u:
  663. v14 = (int)(v3 + 9);
  664. v15 = _byteswap_ulong(*(_DWORD *)(v14 + 4)) + _byteswap_ulong(*(_DWORD *)(v14 + 8));
  665. if ( v15 > 0 )
  666. {
  667. v16 = 0;
  668. v17 = 0;
  669. do
  670. {
  671. v18 = v17 + _byteswap_ulong(*(_DWORD *)(v14 + 12));
  672. ++v16;
  673. sub_8120DB0(v6, _byteswap_ulong(*(_DWORD *)v18), _byteswap_ulong(*(_DWORD *)(v18 + 4)));
  674. v17 += 12;
  675. }
  676. while ( v15 != v16 );
  677. }
  678. sub_8120DB0(v6, _byteswap_ulong(*(_DWORD *)(v14 + 12)), 12 * v15);
  679. break;
  680. case 3u:
  681. sub_8120DB0(a1, _byteswap_ulong(v3[9]), _byteswap_ulong(v3[1]));
  682. break;
  683. }
  684. v7 = *(_DWORD *)(v6 + 92);
  685. v8 = *(_DWORD *)(v6 + 84);
  686. *(_DWORD *)(v6 + 92) = ((_BYTE)v7 + 1) & 0x7F;
  687. v9 = *(_DWORD *)(v6 + 664);
  688. v10 = v8 + 1;
  689. *(_DWORD *)(v6 + 84) = v10;
  690. if ( v10 > v9 )
  691. *(_DWORD *)(v6 + 664) = v10;
  692. *(_DWORD *)(v6 + 84 + 4 * v7 + 12) = v5;
  693. return sub_8120DBC(v6);
  694. }
  695.  
  696. //----- (081210EC) --------------------------------------------------------
  697. int __fastcall sub_81210EC(int a1, int a2, unsigned int a3)
  698. {
  699. int v3; // r9@1
  700. int v4; // r10@1
  701. unsigned int v5; // r4@1
  702. int *v6; // r0@1
  703. int v8; // r3@4
  704. int v9; // r12@5
  705. int v10; // r6@6
  706. int v11; // lr@6
  707. int v12; // r5@6
  708. int v13; // r4@6
  709. int v14; // r11@6
  710. int v15; // [sp+1Ch] [bp-54h]@5
  711. int v16; // [sp+20h] [bp-50h]@5
  712. int v17; // [sp+24h] [bp-4Ch]@5
  713. int v18; // [sp+28h] [bp-48h]@6
  714. int v19; // [sp+2Ch] [bp-44h]@6
  715. int v20; // [sp+30h] [bp-40h]@6
  716. unsigned int v21; // [sp+34h] [bp-3Ch]@1
  717. unsigned int v22; // [sp+38h] [bp-38h]@4
  718. int v23; // [sp+3Ch] [bp-34h]@1
  719. int v24; // [sp+40h] [bp-30h]@1
  720. unsigned int v25; // [sp+44h] [bp-2Ch]@4
  721. unsigned int v26; // [sp+48h] [bp-28h]@4
  722.  
  723. v3 = a1;
  724. v4 = a2;
  725. v21 = a3;
  726. v24 = disable_interrupts();
  727. v5 = _byteswap_ulong(*(_DWORD *)(v3 + 16));
  728. v6 = sub_8120D18(v5 - 1);
  729. v23 = (int)v6;
  730. if ( !v6 )
  731. sub_8129A24("IPC(?): __iosIpcReply() encountered invalid clientNodeId %d.", v5);
  732. if ( !*v6 )
  733. sub_8129A24("IPC(%d): __iosIpcReply() invalid clientNodeId.", v6[2]);
  734. sub_812EA10(dword_81A4000[0]);
  735. v8 = (*(_BYTE *)(v3 + 21) << 16) | (*(_BYTE *)(v3 + 20) << 24) | (*(_BYTE *)(v3 + 22) << 8);
  736. v25 = _byteswap_ulong(*(_DWORD *)(v3 + 20)) - 14;
  737. sub_8120164(v4, 0x38u);
  738. v22 = _byteswap_ulong(*(_DWORD *)(v4 + 16));
  739. v26 = _byteswap_ulong(*(_DWORD *)(v3 + 16));
  740. if ( _byteswap_ulong(*(_DWORD *)(v4 + 16)) != v26 )
  741. {
  742. v17 = *(_BYTE *)(v4 + 20);
  743. v9 = *(_BYTE *)(v4 + 21);
  744. v16 = *(_BYTE *)(v4 + 22);
  745. v15 = *(_BYTE *)(v4 + 23);
  746. v10 = *(_BYTE *)v4;
  747. v11 = *(_BYTE *)(v4 + 1);
  748. v19 = *(_BYTE *)(v4 + 2);
  749. v18 = *(_BYTE *)(v4 + 3);
  750. v12 = *(_BYTE *)v3;
  751. v13 = *(_BYTE *)(v3 + 1);
  752. v20 = *(_BYTE *)(v3 + 2);
  753. v14 = *(_BYTE *)(v3 + 3);
  754. goto LABEL_8;
  755. }
  756. v9 = *(_BYTE *)(v4 + 21);
  757. v17 = *(_BYTE *)(v4 + 20);
  758. v16 = *(_BYTE *)(v4 + 22);
  759. v15 = *(_BYTE *)(v4 + 23);
  760. if ( v25 != (v15 | (v9 << 16) | (v17 << 24) | (v16 << 8)) )
  761. {
  762. v10 = *(_BYTE *)v4;
  763. v11 = *(_BYTE *)(v4 + 1);
  764. v19 = *(_BYTE *)(v4 + 2);
  765. v18 = *(_BYTE *)(v4 + 3);
  766. v12 = *(_BYTE *)v3;
  767. v13 = *(_BYTE *)(v3 + 1);
  768. v20 = *(_BYTE *)(v3 + 2);
  769. v14 = *(_BYTE *)(v3 + 3);
  770. goto LABEL_8;
  771. }
  772. v11 = *(_BYTE *)(v4 + 1);
  773. v13 = *(_BYTE *)(v3 + 1);
  774. v10 = *(_BYTE *)v4;
  775. v12 = *(_BYTE *)v3;
  776. v19 = *(_BYTE *)(v4 + 2);
  777. v20 = *(_BYTE *)(v3 + 2);
  778. v18 = *(_BYTE *)(v4 + 3);
  779. v14 = *(_BYTE *)(v3 + 3);
  780. if ( (v18 | (v11 << 16) | (v10 << 24) | (v19 << 8)) != (v14 | (v13 << 16) | (v12 << 24) | (v20 << 8)) )
  781. LABEL_8:
  782. sub_8129A24(
  783. "IPC(%d): __iosIpcReply() found invalid PPC state clientNodeId=%d/%d, clientPid=%d/%d, cmd=%d/%d, handle=%d/%d.",
  784. *(_DWORD *)(v23 + 8),
  785. v22,
  786. v26,
  787. v15 | (v9 << 16) | (v17 << 24) | (v16 << 8),
  788. v25,
  789. v18 | (v11 << 16) | (v10 << 24) | (v19 << 8),
  790. v14 | (v13 << 16) | (v12 << 24) | (v20 << 8),
  791. _byteswap_ulong(*(_DWORD *)(v4 + 8)),
  792. _byteswap_ulong(*(_DWORD *)(v3 + 8)),
  793. *(_BYTE *)(v4 + 9) << 16);
  794. *(_BYTE *)(v4 + 7) = v21;
  795. *(_BYTE *)(v4 + 4) = BYTE3(v21);
  796. *(_BYTE *)(v4 + 5) = v21 >> 16;
  797. *(_BYTE *)(v4 + 6) = BYTE1(v21);
  798. sub_8120E80(v23, (unsigned int *)v3, v4);
  799. sub_812EA10(dword_81A4000[*(_DWORD *)(current_thread_ctx_addr + 84)]);
  800. sub_812E78C(v24);
  801. return 0;
  802. }
  803. //----- (08121440) --------------------------------------------------------
  804. int __fastcall sub_8121440(unsigned int a1, int a2, int a3)
  805. {
  806. int v3; // r6@1
  807. int v4; // r5@1
  808. int v5; // r4@1
  809. int v6; // r7@1
  810. int result; // r0@2
  811. int v8; // r0@3
  812. unsigned int v9; // r3@3
  813.  
  814. v3 = a2;
  815. v4 = a2;
  816. v5 = a3;
  817. v6 = a1;
  818. if ( !a2 )
  819. goto LABEL_9;
  820. v8 = SysCall_0x5E((void *)a1, a2);
  821. v9 = (unsigned int)~v8 >> 31;
  822. if ( !v5 )
  823. v9 = 0;
  824. v4 = v8;
  825. if ( v9 )
  826. {
  827. sub_8120164(v6, v3);
  828. result = v4;
  829. }
  830. else
  831. {
  832. LABEL_9:
  833. result = v4;
  834. }
  835. return result;
  836. }
  837.  
  838. //----- (08121494) --------------------------------------------------------
  839. int sub_8121494()
  840. {
  841. int result; // r0@1
  842. int v1; // r2@1
  843.  
  844. sub_8131DA0((_BYTE *)debug_args_addr, 0, (unsigned int)&byte_7EC);
  845. sub_8131DA0(&dword_FFFF20F0, 0, (unsigned int)byte_408);
  846. result = sub_812CCB4((u32 (__cdecl *)(void *))sub_8121510, 0, (u32 *)dword_FFFF2CF8, 0x800u, 95);
  847. v1 = result;
  848. if ( result >= 0 )
  849. result = 0;
  850. dword_8143010 = v1;
  851. return result;
  852. }
  853. //----- (08121510) --------------------------------------------------------
  854. // write access to const memory has been detected, the output may be wrong!
  855. void sub_8121510()
  856. {
  857. int v0; // r0@1
  858. int *v1; // r11@2
  859. int **v2; // r6@2
  860. char v3; // zf@4
  861. signed int v4; // r1@7
  862. int *v5; // r4@10
  863. unsigned int *v6; // r4@16
  864. int v7; // r10@16
  865. unsigned int v8; // r4@16
  866. int *v9; // r0@16
  867. int v10; // r5@16
  868. int v11; // r2@17
  869. unsigned int v12; // r2@19
  870. unsigned int *v13; // r1@21
  871. int v14; // r3@21
  872. unsigned int v15; // r6@21
  873. int v16; // r2@21
  874. unsigned int v17; // r7@24
  875. int v18; // r8@24
  876. signed int v19; // r12@28
  877. unsigned int v20; // r3@50
  878. unsigned int v21; // r2@50
  879. unsigned __int8 v22; // cf@50
  880. unsigned int *v23; // r3@50
  881. int v24; // r5@59
  882. int v25; // [sp+18h] [bp-5Ch]@23
  883. int v26; // [sp+20h] [bp-54h]@31
  884. unsigned int v27; // [sp+2Ch] [bp-48h]@23
  885. _BYTE *v28; // [sp+3Ch] [bp-38h]@28
  886. unsigned int v29; // [sp+40h] [bp-34h]@34
  887. unsigned int v30; // [sp+44h] [bp-30h]@28
  888. unsigned int v31; // [sp+48h] [bp-2Ch]@43
  889. unsigned int v32; // [sp+4Ch] [bp-28h]@43
  890.  
  891. v0 = SysCall_0x0C((u32 *)dword_FFFF20F4, 0x100u);
  892. dword_814300C = v0;
  893. if ( v0 < 0 )
  894. {
  895. v1 = &dword_FFFF20F0;
  896. }
  897. else
  898. {
  899. v1 = &dword_FFFF20F0;
  900. v2 = sub_8123B14(v0, (int **)&dword_FFFF20F0);
  901. if ( (signed int)v2 < 0 )
  902. goto LABEL_75;
  903. sub_8131DA0((_BYTE *)debug_args_addr, 0, (unsigned int)&byte_7EC);
  904. if ( (unsigned __int8)off_8143000 == 32 )
  905. goto LABEL_76;
  906. v3 = (unsigned __int8)off_8143000 == 16;
  907. if ( (unsigned __int8)off_8143000 != 16 )
  908. v3 = (unsigned __int8)off_8143000 == 0;
  909. v4 = v3 ? 1 : 0;
  910. if ( v3 )
  911. {
  912. LABEL_76:
  913. dword_FFFF1BF0 = (int)&dword_D80000C;
  914. dword_FFFF1BF4 = 226492416;
  915. dword_FFFF1BF8 = (int)&dword_D800000[2];
  916. dword_FFFF1BB8 = 10;
  917. *(_DWORD *)algn_FFFF1BAC = 2;
  918. dword_FFFF1BB0 = 1;
  919. dword_FFFF1BB4 = 29;
  920. dword_FFFF1BA8 = 1;
  921. v2 = (int **)SysCall_0x11(29, dword_814300C, (int)&dword_FFFF1BB8);
  922. if ( v2 )
  923. sub_8129A24("IPC(%d): Unable to register event handler\n", 0);
  924. *(_DWORD *)word_0 = 6;
  925. SysCall_0x50(0);
  926. }
  927. else
  928. {
  929. v5 = debug_args_addr;
  930. while ( 1 )
  931. {
  932. v24 = v4 + 1;
  933. *(int *)((char *)v5 + (_DWORD)byte_8) = v4;
  934. *(int *)((char *)v5 + (_DWORD)dword_4) = v4 + 1;
  935. if ( v4 == 1 )
  936. {
  937. *(int *)((char *)v5 + (_DWORD)byte_48) = (int)&dword_D80041C;
  938. *(int *)((char *)v5 + (_DWORD)byte_4C) = (int)dword_D800410;
  939. *(int *)((char *)&dword_4D + (_DWORD)v5 + 3) = (int)&dword_D800410[2];
  940. v5[3] = 46;
  941. *(int *)((char *)v5 + (_DWORD)byte_10) = 10;
  942. *v5 = 1;
  943. }
  944. else if ( v4 == 2 )
  945. {
  946. *(int *)((char *)v5 + (_DWORD)byte_48) = (int)dword_D80042C;
  947. *(int *)((char *)v5 + (_DWORD)byte_4C) = (int)dword_D800420;
  948. *(int *)((char *)&dword_4D + (_DWORD)v5 + 3) = (int)&dword_D800420[2];
  949. v5[3] = 45;
  950. *(int *)((char *)v5 + (_DWORD)byte_10) = 11;
  951. *v5 = 1;
  952. }
  953. else
  954. {
  955. if ( v4 )
  956. sub_8129A24("IPC(%d): Invalid server client node index\n");
  957. *(int *)((char *)v5 + (_DWORD)byte_48) = (int)&dword_D80040C;
  958. *(int *)((char *)v5 + (_DWORD)byte_4C) = (int)dword_D800400;
  959. *(int *)((char *)&dword_4D + (_DWORD)v5 + 3) = (int)&dword_D800400[2];
  960. v5[3] = 47;
  961. *(int *)((char *)v5 + (_DWORD)byte_10) = 9;
  962. *v5 = 1;
  963. }
  964. if ( (signed int)v2 >= 0 )
  965. {
  966. v2 = (int **)SysCall_0x11(v5[3], dword_814300C, (int)(v5 + 4));
  967. if ( v2 )
  968. sub_8129A24("IPC(%d): Unable to register event handler\n", *(int *)((char *)v5 + (_DWORD)byte_8));
  969. **(_DWORD **)((char *)v5 + (_DWORD)byte_48) = 6;
  970. SysCall_0x50(v5[3]);
  971. }
  972. v5 += 169;
  973. if ( v24 == 3 )
  974. break;
  975. v4 = v24;
  976. }
  977. }
  978. if ( (signed int)v2 < 0 )
  979. LABEL_75:
  980. sub_8129A24("IPC: ipcServerInit() failed.\n");
  981. }
  982. while ( 1 )
  983. {
  984. while ( SysCall_0x10(dword_814300C, (u32 *)&dword_FFFF24F4, 0) < 0 )
  985. ;
  986. v6 = *(unsigned int **)((char *)v1 + (_DWORD)byte_404);
  987. v7 = disable_interrupts();
  988. v8 = _byteswap_ulong(*v6);
  989. v9 = sub_8120D18(v8 - 9);
  990. v10 = (int)v9;
  991. if ( !v9 )
  992. break;
  993. v11 = *(_DWORD *)v9[18];
  994. if ( v11 & 2 )
  995. {
  996. v9[153] = 0;
  997. sub_8120D58((int)v9, -49, 2);
  998. sub_8120DBC(v10);
  999. }
  1000. else
  1001. {
  1002. if ( !(v11 & 4) )
  1003. sub_8129A24("IPC(%d): __iosIpcThread() encountered unexpected IPC CTRL Reg value of 0x%08x.", v9[2]);
  1004. v12 = v9[152];
  1005. if ( v12 <= 0x7F )
  1006. {
  1007. v20 = v9[165];
  1008. v21 = v12 + 1;
  1009. v22 = v21 >= v20;
  1010. v3 = v21 == v20;
  1011. v23 = (unsigned int *)v9[19];
  1012. v9[152] = v21;
  1013. if ( !v3 & v22 )
  1014. v9[165] = v21;
  1015. v15 = *v23;
  1016. v16 = 12;
  1017. }
  1018. else
  1019. {
  1020. if ( v9[154] )
  1021. sub_8129A24("IPC(%d): flowControlReportNewRequest() invalid state detected\n", v9[2]);
  1022. v13 = (unsigned int *)v9[19];
  1023. v14 = v9[167] + 1;
  1024. v9[154] = 1;
  1025. v9[167] = v14;
  1026. v15 = *v13;
  1027. v16 = 4;
  1028. }
  1029. sub_8120D58((int)v9, -49, v16);
  1030. if ( sub_8121440(v15, 56, 1) < 0 )
  1031. {
  1032. ++*(_DWORD *)(v10 + 620);
  1033. sub_8129A24(
  1034. "IPC(%d): dispatchIpcRequest() encountered invalid resource request address %p.",
  1035. *(_DWORD *)(v10 + 8),
  1036. v15);
  1037. }
  1038. sub_8131D04(&v25, (char *)v15, 56);
  1039. if ( v27 > 7 )
  1040. {
  1041. ++*(_DWORD *)(v10 + 624);
  1042. sub_8129A24(
  1043. "IPC(%d): dispatchIpcRequest() received IPC request with invalid clientPid of %d.",
  1044. *(_DWORD *)(v10 + 8));
  1045. }
  1046. v17 = v27 + 14;
  1047. v18 = *(_DWORD *)(v10 + 4);
  1048. switch ( v25 )
  1049. {
  1050. case 1:
  1051. v19 = sub_8127FAC(v28, v30, *v1, v15, v17, v18);
  1052. if ( v19 >= 0 )
  1053. break;
  1054. ++*(_DWORD *)(v10 + 648);
  1055. goto LABEL_26;
  1056. case 2:
  1057. v19 = sub_812720C(v26, *v1, v15, (unsigned int)v28, v17, v18);
  1058. if ( v19 >= 0 )
  1059. break;
  1060. ++*(_DWORD *)(v10 + 652);
  1061. goto LABEL_26;
  1062. case 3:
  1063. v19 = sub_8127C2C(v26, (unsigned int)v28, v29, *v1, v15, v17, v18);
  1064. if ( v19 >= 0 )
  1065. break;
  1066. ++*(_DWORD *)(v10 + 628);
  1067. goto LABEL_26;
  1068. case 4:
  1069. v19 = sub_8127ADC(v26, (unsigned int)v28, v29, *v1, v15, v17, v18);
  1070. if ( v19 >= 0 )
  1071. break;
  1072. ++*(_DWORD *)(v10 + 632);
  1073. goto LABEL_26;
  1074. case 5:
  1075. v19 = sub_8126BC4(v26, (unsigned int)v28, v29, *v1, v15, v17, v18);
  1076. if ( v19 >= 0 )
  1077. break;
  1078. ++*(_DWORD *)(v10 + 636);
  1079. goto LABEL_26;
  1080. case 6:
  1081. v19 = sub_81278B4(v26, (unsigned int)v28, v29, v30, v31, v32, *v1, v15, v17, v18);
  1082. if ( v19 >= 0 )
  1083. break;
  1084. ++*(_DWORD *)(v10 + 640);
  1085. goto LABEL_26;
  1086. case 7:
  1087. v19 = sub_812742C(v26, (unsigned int)v28, v29, v30, v31, *v1, v15, v17, v18);
  1088. if ( v19 < 0 )
  1089. {
  1090. ++*(_DWORD *)(v10 + 644);
  1091. LABEL_26:
  1092. *(_BYTE *)(v15 + 5) = (unsigned int)v19 >> 16;
  1093. *(_BYTE *)(v15 + 6) = BYTE1(v19);
  1094. *(_BYTE *)(v15 + 4) = BYTE3(v19);
  1095. *(_BYTE *)(v15 + 7) = v19;
  1096. sub_8120E80(v10, (unsigned int *)v15, v15);
  1097. }
  1098. break;
  1099. default:
  1100. sub_8129A24(
  1101. "IPC(%d): dispatchIpcRequest() received IPC request with invalid cmd of %d.",
  1102. *(_DWORD *)(v10 + 8),
  1103. v25);
  1104. return;
  1105. }
  1106. }
  1107. SysCall_0x50(*(_DWORD *)(v10 + 12));
  1108. sub_812E78C(v7);
  1109. }
  1110. sub_8129A24("IPC(?): __iosIpcThread() encountered invalid cmd %d.", v8);
  1111. }
  1112.  
  1113. //----- (08121B18) --------------------------------------------------------
  1114. int sub_8121B18()
  1115. {
  1116. int v0; // r1@1
  1117. int v1; // r2@1
  1118. int v2; // r3@2
  1119. int v3; // r1@3
  1120. int v4; // r2@3
  1121. int v5; // r3@3
  1122. int v6; // r2@3
  1123. int v7; // r3@3
  1124. int v9; // [sp+0h] [bp-Ch]@2
  1125.  
  1126. SysCall_0x6E();
  1127. SysCall_0x6F();
  1128. if ( SysCall_0x71(0x80000000) )
  1129. {
  1130. v2 = 0;
  1131. v9 = 0;
  1132. do
  1133. {
  1134. sub_8131FF4("\n\n\n\n\n\n\n\n\n\n", v0, v1, v2);
  1135. sub_8131FF4("Enter '1' to proceed with kernel startup. \n", v3, v4, v5);
  1136. sub_8132148((int)"%d", (int)&v9, v6, v7);
  1137. v2 = v9;
  1138. }
  1139. while ( v9 != 1 );
  1140. }
  1141. sub_8120C58();
  1142. sub_8120510();
  1143. sub_8120488();
  1144. sub_812B308();
  1145. sub_81235E8();
  1146. sub_81294AC();
  1147. return sub_812CD08();
  1148. }
  1149.  
  1150. //----- (08121B9C) --------------------------------------------------------
  1151. bool __fastcall sub_8121B9C(unsigned int a1)
  1152. {
  1153. bool v1; // r3@1
  1154.  
  1155. v1 = 1;
  1156. if ( a1 < 0xFFF00000 || a1 > 0xFFF07FFF )
  1157. v1 = a1 >= 0xFFFF0000;
  1158. return v1;
  1159. }
  1160.  
  1161. //----- (08121BD8) --------------------------------------------------------
  1162. int __fastcall sub_8121BD8(unsigned int a1, _DWORD *a2, int a3, int a4)
  1163. {
  1164. char v4; // lr@6
  1165. char v5; // r3@9
  1166. int result; // r0@10
  1167. char v7; // lr@11
  1168.  
  1169. if ( a2 )
  1170. a4 = 0;
  1171. if ( a2 )
  1172. *a2 = a4;
  1173. if ( a1 >= 0xFFFF0000 )
  1174. goto LABEL_10;
  1175. v4 = 0;
  1176. if ( a1 > 0x811FFFF )
  1177. v4 = 1;
  1178. if ( a1 > 0x81BFFFF )
  1179. {
  1180. v5 = 0;
  1181. }
  1182. else
  1183. {
  1184. v5 = v4 & 1;
  1185. if ( v4 & 1 )
  1186. goto LABEL_10;
  1187. }
  1188. v7 = v5;
  1189. if ( a1 >= 0x1D000000 )
  1190. v7 = 1;
  1191. result = v7 & 1;
  1192. if ( v7 & 1 )
  1193. {
  1194. if ( a2 )
  1195. {
  1196. result = 1;
  1197. *a2 = 1;
  1198. return result;
  1199. }
  1200. LABEL_10:
  1201. result = 1;
  1202. }
  1203. return result;
  1204. }
  1205.  
  1206. //----- (08121CDC) --------------------------------------------------------
  1207. // int load_cafe2wii()
  1208. // Maps the cafe2wii image memory
  1209. // -> 0 on success
  1210. int __fastcall SysCall_0x86()
  1211. {
  1212. signed int v0; // r3@1
  1213. signed int v2; // [sp+0h] [bp-2Ch]@2
  1214. signed int v3; // [sp+4h] [bp-28h]@2
  1215. signed int v4; // [sp+8h] [bp-24h]@2
  1216. signed int v5; // [sp+Ch] [bp-20h]@2
  1217. signed int v6; // [sp+10h] [bp-1Ch]@2
  1218. int v7; // [sp+14h] [bp-18h]@2
  1219. int v8; // [sp+18h] [bp-14h]@2
  1220. int v9; // [sp+1Ch] [bp-10h]@2
  1221. int v10; // [sp+20h] [bp-Ch]@2
  1222.  
  1223. v0 = -1;
  1224. if ( *(_DWORD *)(current_thread_ctx_addr + 84) == 1 )
  1225. {
  1226. v2 = 2;
  1227. v3 = 235;
  1228. v4 = 2;
  1229. v5 = 1;
  1230. v6 = 1;
  1231. v9 = 0;
  1232. v10 = 0;
  1233. v7 = 0;
  1234. v8 = 0x2000000;
  1235. v0 = sub_812FEE0((int)&v2, 1);
  1236. }
  1237. return v0;
  1238. }
  1239. // 8173BA0: using guessed type int current_thread_ctx_addr;
  1240.  
  1241. //----- (08121D58) --------------------------------------------------------
  1242. // int load_ppc_kernel(u32 address, u32 size)
  1243. // Maps the PPC kernel image memory:
  1244. // address == 0x08000000
  1245. // size == 0x00120000
  1246. // ->0 on success
  1247. int __fastcall SysCall_0x77(u32 address, u32 size)
  1248. {
  1249. u32 v2; // r4@1
  1250. int result; // r0@2
  1251. void *v4; // r6@4
  1252. void *v5; // r3@4
  1253. int v6; // r0@7
  1254. int v7; // r4@7
  1255. signed int v8; // [sp+0h] [bp-38h]@8
  1256. signed int v9; // [sp+4h] [bp-34h]@8
  1257. signed int v10; // [sp+8h] [bp-30h]@8
  1258. signed int v11; // [sp+Ch] [bp-2Ch]@8
  1259. signed int v12; // [sp+10h] [bp-28h]@8
  1260. void *v13; // [sp+14h] [bp-24h]@8
  1261. int v14; // [sp+18h] [bp-20h]@8
  1262. int v15; // [sp+1Ch] [bp-1Ch]@8
  1263. int v16; // [sp+20h] [bp-18h]@8
  1264. int v17; // [sp+24h] [bp-14h]@5
  1265.  
  1266. v2 = size;
  1267. if ( *(_DWORD *)(current_thread_ctx_addr + 84) != 1 )
  1268. return -1;
  1269. v4 = (void *)0x8000000;
  1270. v5 = (void *)0x8000000;
  1271. if ( size )
  1272. {
  1273. v17 = 0;
  1274. v4 = SysCall_0x56((void *)address);
  1275. sub_81311C0((unsigned int)v4, (unsigned int *)&v17);
  1276. result = -1;
  1277. if ( v17 != 1 )
  1278. return result;
  1279. v5 = v4;
  1280. }
  1281. v6 = SysCall_0x5E(v5, v2);
  1282. v7 = (int)v4 + v2;
  1283. if ( v6 < 0 )
  1284. return -1;
  1285. v8 = 1;
  1286. v9 = 32;
  1287. v10 = 1;
  1288. v11 = 1;
  1289. v12 = 3;
  1290. v14 = v7;
  1291. v15 = 136052736;
  1292. v16 = 137232384;
  1293. v13 = v4;
  1294. return sub_812FEE0((int)&v8, 1);
  1295. }
  1296. // 8173BA0: using guessed type int current_thread_ctx_addr;
  1297.  
  1298. //----- (08121E34) --------------------------------------------------------
  1299. // int load_ppc_app(int mem_id, u32 addr1, u32 size1, u32 addr2, u32 size2)
  1300. // Maps the PPC user application memory:
  1301. // mem_id == 0x02
  1302. // addr1 == 0x00
  1303. // size1 == 0x00
  1304. // addr2 == 0xA8000000
  1305. // size2 == 0x28000000
  1306. // ->0 on success
  1307. int __fastcall SysCall_0x78(int mem_id, u32 addr1, u32 size1, u32 addr2, u32 size2)
  1308. {
  1309. char v5; // r5@1
  1310. u32 v6; // r6@1
  1311. void *v7; // r10@1
  1312. int v8; // r4@2
  1313. void *v10; // r11@5
  1314. void *v11; // r7@8
  1315. int v12; // r0@14
  1316. int v13; // r0@23
  1317. int v14; // [sp+0h] [bp-4Ch]@4
  1318. int v15; // [sp+4h] [bp-48h]@4
  1319. signed int v16; // [sp+8h] [bp-44h]@4
  1320. signed int v17; // [sp+Ch] [bp-40h]@4
  1321. int v18; // [sp+10h] [bp-3Ch]@4
  1322. void *v19; // [sp+14h] [bp-38h]@4
  1323. char *v20; // [sp+18h] [bp-34h]@4
  1324. void *v21; // [sp+1Ch] [bp-30h]@4
  1325. u32 v22; // [sp+20h] [bp-2Ch]@4
  1326. int v23; // [sp+24h] [bp-28h]@6
  1327.  
  1328. v5 = mem_id;
  1329. v6 = size1;
  1330. v7 = (void *)addr2;
  1331. if ( *(_DWORD *)(current_thread_ctx_addr + 84) != 1 )
  1332. return -1;
  1333. v14 = 0;
  1334. v16 = 1;
  1335. v17 = 1;
  1336. v18 = 0;
  1337. v19 = 0;
  1338. v20 = 0;
  1339. v21 = 0;
  1340. v22 = 0;
  1341. v15 = 194;
  1342. if ( size1 )
  1343. {
  1344. v23 = 0;
  1345. v10 = SysCall_0x56((void *)addr1);
  1346. sub_81311C0((unsigned int)v10, (unsigned int *)&v23);
  1347. if ( v23 != 3 )
  1348. return -1;
  1349. }
  1350. else
  1351. {
  1352. v10 = (void *)671088640;
  1353. }
  1354. if ( !size2 )
  1355. {
  1356. v11 = (void *)671088640;
  1357. goto LABEL_10;
  1358. }
  1359. v23 = 0;
  1360. v11 = SysCall_0x56(v7);
  1361. sub_81311C0((unsigned int)v11, (unsigned int *)&v23);
  1362. if ( v23 != 3 )
  1363. return -1;
  1364. LABEL_10:
  1365. if ( !(v5 & 1) || (v8 = SysCall_0x5E(v10, v6), v8 >= 0) )
  1366. v8 = 0;
  1367. if ( v5 & 2 )
  1368. {
  1369. v13 = SysCall_0x5E(v11, size2);
  1370. if ( v13 < 0 )
  1371. return v13;
  1372. }
  1373. if ( v8 >= 0 )
  1374. {
  1375. v12 = v5 & 3;
  1376. v14 = 3;
  1377. if ( v12 == 2 )
  1378. {
  1379. v18 = 2;
  1380. v22 = (u32)v11 + size2;
  1381. v21 = v11;
  1382. }
  1383. else if ( v12 == 3 )
  1384. {
  1385. v18 = v5 & 3;
  1386. v20 = (char *)v10 + v6;
  1387. v22 = (u32)v11 + size2;
  1388. v19 = v10;
  1389. v21 = v11;
  1390. }
  1391. else
  1392. {
  1393. if ( v12 != 1 )
  1394. return -29;
  1395. v18 = 1;
  1396. v20 = (char *)v10 + v6;
  1397. v19 = v10;
  1398. }
  1399. v8 = sub_812FEE0((int)&v14, 1);
  1400. }
  1401. return v8;
  1402. }
  1403. // 8140758: using guessed type int[7];
  1404. // 8173BA0: using guessed type int current_thread_ctx_addr;
  1405.  
  1406. //----- (08121FF4) --------------------------------------------------------
  1407. signed int __fastcall sub_8121FF4(unsigned int a1)
  1408. {
  1409. unsigned int v1; // r4@1
  1410. bool v2; // r0@1
  1411. signed int v3; // r12@1
  1412. unsigned __int64 v5; // kr00_8@6
  1413. unsigned int v6; // [sp+0h] [bp-20h]@4
  1414. unsigned int v7; // [sp+4h] [bp-1Ch]@4
  1415. char v8; // [sp+8h] [bp-18h]@4
  1416. int v9; // [sp+Ch] [bp-14h]@3
  1417.  
  1418. v1 = a1;
  1419. v2 = sub_8121B9C(a1);
  1420. v3 = -1179667;
  1421. if ( !v2 )
  1422. {
  1423. v3 = sub_81311C0(v1, (unsigned int *)&v9);
  1424. if ( !v3 )
  1425. {
  1426. v3 = sub_81302D0(v9, &v8, &v7, &v6);
  1427. if ( !v3 )
  1428. {
  1429. if ( v7 > v1 || (v5 = v6 + (unsigned __int64)v7, !HIDWORD(v5)) && (unsigned int)v5 <= v1 )
  1430. v3 = -1179667;
  1431. }
  1432. }
  1433. }
  1434. return v3;
  1435. }
  1436.  
  1437. //----- (08122094) --------------------------------------------------------
  1438. int __fastcall sub_8122094(_BYTE *a1, int a2, signed int *a3)
  1439. {
  1440. _BYTE *v3; // r7@1
  1441. int v4; // r8@1
  1442. signed int *v5; // r6@1
  1443. int v6; // r5@2
  1444. signed int v7; // r3@2
  1445. int result; // r0@4
  1446. signed int v9; // r0@3
  1447. char v10; // zf@12
  1448. int v11; // [sp+0h] [bp-A8h]@1
  1449. int v12; // [sp+80h] [bp-28h]@11
  1450. unsigned __int16 v13; // [sp+84h] [bp-24h]@12
  1451.  
  1452. v3 = a1;
  1453. v4 = a2;
  1454. v5 = a3;
  1455. sub_8131DA0(&v11, 0, 0x90u);
  1456. if ( dword_8150004 )
  1457. {
  1458. v9 = sub_812EED8((int)&v11);
  1459. v6 = v9;
  1460. if ( v9 == -1179662 )
  1461. {
  1462. if ( v4 )
  1463. sub_81329B8(v3, &v11, v4);
  1464. v7 = v12 & 0x20;
  1465. if ( v12 & 0x20 )
  1466. {
  1467. v10 = v13 == 160;
  1468. if ( v13 != 160 )
  1469. v10 = v13 == 128;
  1470. if ( v10 || v13 == 192 || v13 == 224 )
  1471. v7 = 1;
  1472. else
  1473. v7 = v13 > 0xFFu;
  1474. }
  1475. if ( v12 & 4 )
  1476. v7 = 1;
  1477. }
  1478. else
  1479. {
  1480. v7 = 0;
  1481. }
  1482. }
  1483. else
  1484. {
  1485. v6 = dword_8150004;
  1486. v7 = dword_8150004;
  1487. }
  1488. result = v6;
  1489. if ( v5 )
  1490. *v5 = v7;
  1491. return result;
  1492. }
  1493. //----- (08122174) --------------------------------------------------------
  1494. signed int __fastcall sub_8122174(unsigned int a1, int a2, unsigned int a3, unsigned int a4, int a5, int a6, unsigned int a7)
  1495. {
  1496. int v7; // r8@1
  1497. unsigned int v8; // r10@1
  1498. unsigned int v9; // r7@1
  1499. int v10; // r5@1
  1500. signed int result; // r0@2
  1501. signed int v12; // r9@2
  1502. signed int v13; // r3@13
  1503. unsigned int v14; // r1@19
  1504. unsigned int v15; // r2@19
  1505. int v16; // r4@20
  1506. unsigned int v17; // r6@20
  1507. int v18; // r7@22
  1508. int v19; // r3@24
  1509. unsigned int v20; // r12@24
  1510. int v21; // r3@28
  1511. int v22; // r2@29
  1512. int v23; // [sp+4h] [bp-40h]@16
  1513. int v24; // [sp+8h] [bp-3Ch]@16
  1514. unsigned int v25; // [sp+Ch] [bp-38h]@16
  1515. unsigned int v26; // [sp+10h] [bp-34h]@16
  1516. int v27; // [sp+14h] [bp-30h]@11
  1517. int v28; // [sp+18h] [bp-2Ch]@16
  1518. int v29; // [sp+1Ch] [bp-28h]@41
  1519. int v30; // [sp+20h] [bp-24h]@1
  1520.  
  1521. v7 = a2;
  1522. v8 = a3;
  1523. v9 = a4;
  1524. v30 = 0;
  1525. v10 = a1;
  1526. if ( sub_8121B9C(a1) )
  1527. {
  1528. result = 0;
  1529. v12 = 4096;
  1530. }
  1531. else
  1532. {
  1533. result = sub_81311C0(v10, (unsigned int *)&v30);
  1534. if ( v30 == 1 )
  1535. {
  1536. v12 = 0x10000;
  1537. }
  1538. else if ( (unsigned int)v30 < 1 || (unsigned int)v30 > 3 )
  1539. {
  1540. result = -1179650;
  1541. v12 = 4096;
  1542. }
  1543. else
  1544. {
  1545. v12 = 0x40000;
  1546. }
  1547. }
  1548. if ( v7 & 0xFFF || v10 & 0xFFF )
  1549. result = -33;
  1550. if ( v9 > 0xF )
  1551. return -29;
  1552. if ( result >= 0 )
  1553. {
  1554. if ( a7 & 0x20 )
  1555. {
  1556. if ( a7 & 0x10 )
  1557. {
  1558. v27 = 1;
  1559. }
  1560. else
  1561. {
  1562. if ( a7 & 8 )
  1563. v13 = 2;
  1564. else
  1565. v13 = 3;
  1566. v27 = v13;
  1567. }
  1568. v28 = ((unsigned __int8)(a7 >> 1) ^ 1) & 1;
  1569. v26 = v9;
  1570. v23 = v10;
  1571. v24 = v7;
  1572. v25 = v8;
  1573. sub_8124864((int)&v23);
  1574. if ( a7 & 4 )
  1575. result = sub_8124F88((char *)&v23);
  1576. else
  1577. result = sub_8125074((char *)&v23);
  1578. }
  1579. if ( ((unsigned int)~result >> 31) & (a7 >> 6) )
  1580. {
  1581. v14 = a5 & 0xFFFFFFF0;
  1582. v15 = a6 & 0xFFFFFFF0;
  1583. if ( a7 & 1 )
  1584. {
  1585. v21 = v12 - 1;
  1586. if ( a7 & 0x10 )
  1587. v22 = v15 | 0xF;
  1588. else
  1589. v22 = v15 | 7;
  1590. if ( a7 & 0x10 )
  1591. v16 = v14 | 0xF;
  1592. else
  1593. v16 = v14 | 7;
  1594. v18 = v10 & v21;
  1595. v17 = v22 & 0xFFC0000F;
  1596. if ( !(v10 & v21) )
  1597. goto LABEL_23;
  1598. }
  1599. else
  1600. {
  1601. v16 = v14 | 3;
  1602. v17 = v15 | 3;
  1603. v18 = v10 & (v12 - 1);
  1604. if ( !(v10 & (v12 - 1)) )
  1605. goto LABEL_23;
  1606. }
  1607. result = sub_81308A4(v30, (unsigned int *)&v29, v10);
  1608. if ( result )
  1609. {
  1610. LABEL_23:
  1611. if ( result < 0 )
  1612. return result;
  1613. v19 = v10;
  1614. v20 = v8;
  1615. return sub_8130D2C(v30, v16, v17, v19, v20);
  1616. }
  1617. if ( (v16 & v29) == (v16 & v17) || !v29 )
  1618. {
  1619. v20 = v8 + v18;
  1620. v19 = v10 & -v12;
  1621. return sub_8130D2C(v30, v16, v17, v19, v20);
  1622. }
  1623. result = -33;
  1624. }
  1625. }
  1626. return result;
  1627. }
  1628.  
  1629. //----- (08122374) --------------------------------------------------------
  1630. unsigned int sub_8122374()
  1631. {
  1632. unsigned int v0; // r4@0
  1633. signed int v1; // r5@1
  1634. int v2; // r0@1
  1635. unsigned int v3; // r0@5
  1636. unsigned int v4; // r0@7
  1637. unsigned int result; // r0@9
  1638.  
  1639. v1 = sub_8131098(4u);
  1640. v2 = sub_813125C((int)&byte_6FF, 2);
  1641. if ( v2 )
  1642. v0 = v2;
  1643. if ( !v2 )
  1644. v0 = v1;
  1645. v3 = sub_812F1D0(0xFFFFFu, 1, 2);
  1646. if ( v3 )
  1647. v0 = v3;
  1648. v4 = sub_812F1D0(0xFFFFFu, 2, 2);
  1649. if ( v4 )
  1650. v0 = v4;
  1651. result = sub_812F8B8(4u, 255);
  1652. dword_8150004 = 0;
  1653. if ( !result )
  1654. result = v0;
  1655. return result;
  1656. }
  1657. //----- (081223FC) --------------------------------------------------------
  1658. signed int sub_81223FC()
  1659. {
  1660. signed int v0; // r4@1
  1661. signed int v1; // r0@5
  1662. unsigned int v2; // r2@8
  1663. int v3; // r2@11
  1664. signed int v5; // r0@16
  1665. int v6; // [sp+0h] [bp-A0h]@16
  1666.  
  1667. v0 = sub_8131128();
  1668. if ( v0 < 0 )
  1669. goto LABEL_7;
  1670. v0 = sub_812F5C8(0x400u, 1);
  1671. if ( v0 < 0 )
  1672. goto LABEL_7;
  1673. v0 = sub_812F5C8(0xFE67Eu, 2);
  1674. if ( v0 < 0 )
  1675. goto LABEL_7;
  1676. v0 = sub_8131418(0);
  1677. if ( v0 < 0 )
  1678. goto LABEL_7;
  1679. sub_812F8C0();
  1680. v0 = v1;
  1681. if ( !v1 )
  1682. {
  1683. v0 = sub_8130FD4(4);
  1684. if ( !v0 )
  1685. {
  1686. do
  1687. {
  1688. sub_8131DA0(&v6, 0, 0x90u);
  1689. v5 = sub_812EED8((int)&v6);
  1690. v0 = v5;
  1691. }
  1692. while ( v5 == -1179662 );
  1693. if ( v5 >= 0 )
  1694. {
  1695. dword_8150004 = 1;
  1696. return v0;
  1697. }
  1698. LABEL_7:
  1699. if ( v0 & 0x8000 )
  1700. v2 = ~(v0 << 16);
  1701. else
  1702. v2 = v0 << 16;
  1703. if ( v0 & 0x8000 )
  1704. v3 = ~(v2 >> 16);
  1705. else
  1706. v3 = v2 >> 16;
  1707. sub_8129A24("Failed to enable system protection with status %d:%d.\n", (~v0 >> 16) & 0x3FF, v3);
  1708. }
  1709. }
  1710. if ( v0 < 0 )
  1711. goto LABEL_7;
  1712. return v0;
  1713. }
  1714. //----- (08122500) --------------------------------------------------------
  1715. int sub_8122500()
  1716. {
  1717. int v0; // r2@1
  1718. signed int v1; // r3@1
  1719. signed int v2; // r4@1
  1720. signed int v3; // r0@4
  1721. signed int v4; // r0@5
  1722. unsigned int v5; // r4@7
  1723. signed int v6; // r0@9
  1724. signed int v7; // r0@10
  1725. signed int v8; // r0@11
  1726. signed int v9; // r0@12
  1727. signed int v10; // r0@13
  1728. signed int v11; // r0@14
  1729. signed int v12; // r0@15
  1730. signed int v13; // r0@16
  1731. signed int v14; // r0@17
  1732. int result; // r0@18
  1733. unsigned int v16; // r2@20
  1734. int v17; // r2@23
  1735. unsigned int v18; // r2@27
  1736. int v19; // r2@30
  1737. unsigned int v20; // r2@41
  1738. int v21; // r2@44
  1739. unsigned int v22; // r2@48
  1740. int v23; // r2@51
  1741. unsigned int v24; // r2@55
  1742. int v25; // r2@58
  1743. unsigned int v26; // r2@62
  1744. int v27; // r2@65
  1745. unsigned int v28; // r2@69
  1746. int v29; // r2@72
  1747. unsigned int v30; // r2@76
  1748. int v31; // r2@79
  1749. unsigned int v32; // r2@83
  1750. int v33; // r2@86
  1751. unsigned int v34; // r2@90
  1752. int v35; // r2@93
  1753. unsigned int v36; // r2@97
  1754. int v37; // r2@100
  1755. unsigned int v38; // r2@104
  1756. int v39; // r2@107
  1757. unsigned int v40; // r2@111
  1758. int v41; // r2@114
  1759.  
  1760. v2 = sub_813124C();
  1761. if ( v2 < 0 )
  1762. goto Failed_to_initialize_system_protection;
  1763. v2 = sub_812FD7C(4u, 255, v0, v1);
  1764. if ( !v2 )
  1765. {
  1766. v2 = sub_812FEE0((int)dword_8140774, 4);
  1767. if ( !v2 )
  1768. {
  1769. v2 = sub_812FEE0((int)dword_8140804, 1);
  1770. if ( !v2 )
  1771. {
  1772. v2 = sub_812FEE0((int)dword_8140828, 7);
  1773. if ( !v2 )
  1774. {
  1775. v2 = sub_8131028(1, 0x10000u, 0x80C0000u);
  1776. if ( v2 < 0 )
  1777. goto Failed_to_initialize_system_protection;
  1778. v2 = sub_8131028(2, 0x40000u, 0);
  1779. if ( v2 < 0 )
  1780. goto Failed_to_initialize_system_protection;
  1781. v2 = sub_8131028(3, 0x40000u, 0x10000000u);
  1782. }
  1783. }
  1784. }
  1785. }
  1786. if ( v2 < 0 )
  1787. {
  1788. Failed_to_initialize_system_protection:
  1789. if ( v2 & 0x8000 )
  1790. v18 = ~(v2 << 16);
  1791. else
  1792. v18 = v2 << 16;
  1793. if ( v2 & 0x8000 )
  1794. v19 = ~(v18 >> 16);
  1795. else
  1796. v19 = v18 >> 16;
  1797. sub_8129A24("Failed to initialize system protection driver with status %d:%d.\n", (~v2 >> 16) & 0x3FF, v19);
  1798. }
  1799. v3 = sub_8122174((unsigned int)j__Reset, (int)j__Reset, 0x10000u, 0, 0, 0, 0x30u);
  1800. if ( v3 < 0 )
  1801. {
  1802. if ( v3 & 0x8000 )
  1803. v40 = ~(v3 << 16);
  1804. else
  1805. v40 = v3 << 16;
  1806. if ( v3 & 0x8000 )
  1807. v41 = ~(v40 >> 16);
  1808. else
  1809. v41 = v40 >> 16;
  1810. sub_8129A24("Failed to map kernel SRAM with status %d:%d.\n", (~v3 >> 16) & 0x3FF, v41);
  1811. }
  1812. v4 = sub_8122174((unsigned int)SysCall_0x4F, (int)SysCall_0x4F, 0xA0000u, 0, 0, 0, 0x30u);
  1813. if ( v4 < 0 )
  1814. {
  1815. if ( v4 & 0x8000 )
  1816. v38 = ~(v4 << 16);
  1817. else
  1818. v38 = v4 << 16;
  1819. if ( v4 & 0x8000 )
  1820. v39 = ~(v38 >> 16);
  1821. else
  1822. v39 = v38 >> 16;
  1823. sub_8129A24("Failed to map kernel MEM0 MMU with status %d:%d.\n", (~v4 >> 16) & 0x3FF, v39);
  1824. }
  1825. if ( sub_8121FF4(0x1D000000u) < 0 )
  1826. v5 = 32;
  1827. else
  1828. v5 = 96;
  1829. v6 = sub_8122174(0x1D000000u, 486539264, 0x2B00000u, 0, 0x3FFFFF, 4194288, v5);
  1830. if ( v6 < 0 )
  1831. {
  1832. if ( v6 & 0x8000 )
  1833. v36 = ~(v6 << 16);
  1834. else
  1835. v36 = v6 << 16;
  1836. if ( v6 & 0x8000 )
  1837. v37 = ~(v36 >> 16);
  1838. else
  1839. v37 = v36 >> 16;
  1840. sub_8129A24("Failed to map IOS global heap MEM2 with status %d:%d.\n", (~v6 >> 16) & 0x3FF, v37);
  1841. }
  1842. v7 = sub_8122174(0x8000000u, 0x8000000, 0x100000u, 0xFu, 0, 0, 0x20u);
  1843. if ( v7 < 0 )
  1844. {
  1845. if ( v7 & 0x8000 )
  1846. v34 = ~(v7 << 16);
  1847. else
  1848. v34 = v7 << 16;
  1849. if ( v7 & 0x8000 )
  1850. v35 = ~(v34 >> 16);
  1851. else
  1852. v35 = v34 >> 16;
  1853. sub_8129A24("Failed to map PPC MEM0-A MMU with status %d:%d.\n", (~v7 >> 16) & 0x3FF, v35);
  1854. }
  1855. v8 = sub_8122174(0x8100000u, 135266304, 0x20000u, 0, 0, 0, 0x20u);
  1856. if ( v8 < 0 )
  1857. {
  1858. if ( v8 & 0x8000 )
  1859. v32 = ~(v8 << 16);
  1860. else
  1861. v32 = v8 << 16;
  1862. if ( v8 & 0x8000 )
  1863. v33 = ~(v32 >> 16);
  1864. else
  1865. v33 = v32 >> 16;
  1866. sub_8129A24("Failed to map PPC MEM0-B MMU with status %d:%d.\n", (~v8 >> 16) & 0x3FF, v33);
  1867. }
  1868. v9 = sub_8122174(0x80C0000u, 135004160, 0x60000u, 0, 0x3FFFFF, 4194288, 0x40u);
  1869. if ( v9 < 0 )
  1870. {
  1871. if ( v9 & 0x8000 )
  1872. v30 = ~(v9 << 16);
  1873. else
  1874. v30 = v9 << 16;
  1875. if ( v9 & 0x8000 )
  1876. v31 = ~(v30 >> 16);
  1877. else
  1878. v31 = v30 >> 16;
  1879. sub_8129A24("Failed to map PPC MEM0 FG with status %d:%d.\n", (~v9 >> 16) & 0x3FF, v31);
  1880. }
  1881. v10 = sub_8122174(0, 0, 0x1000u, 0, 0, 0, 0x30u);
  1882. if ( v10 < 0 )
  1883. {
  1884. if ( v10 & 0x8000 )
  1885. v28 = ~(v10 << 16);
  1886. else
  1887. v28 = v10 << 16;
  1888. if ( v10 & 0x8000 )
  1889. v29 = ~(v28 >> 16);
  1890. else
  1891. v29 = v28 >> 16;
  1892. sub_8129A24("Failed to map MEM1-A MMU with status %d:%d.\n", (~v10 >> 16) & 0x3FF, v29);
  1893. }
  1894. v11 = sub_8122174(0x1000u, 4096, 0x1FFF000u, 0, 0, 0, 0x20u);
  1895. if ( v11 < 0 )
  1896. {
  1897. if ( v11 & 0x8000 )
  1898. v26 = ~(v11 << 16);
  1899. else
  1900. v26 = v11 << 16;
  1901. if ( v11 & 0x8000 )
  1902. v27 = ~(v26 >> 16);
  1903. else
  1904. v27 = v26 >> 16;
  1905. sub_8129A24("Failed to map MEM1-B MMU with status %d:%d.\n", (~v11 >> 16) & 0x3FF, v27);
  1906. }
  1907. v12 = sub_8122174(0, 0, 0x2000000u, 0, 0x3FFFFF, 4194288, 0x40u);
  1908. if ( v12 < 0 )
  1909. {
  1910. if ( v12 & 0x8000 )
  1911. v24 = ~(v12 << 16);
  1912. else
  1913. v24 = v12 << 16;
  1914. if ( v12 & 0x8000 )
  1915. v25 = ~(v24 >> 16);
  1916. else
  1917. v25 = v24 >> 16;
  1918. sub_8129A24("Failed to map MEM1 FG with status %d:%d.\n", (~v12 >> 16) & 0x3FF, v25);
  1919. }
  1920. v13 = sub_8122174(0x14000000u, 335544320, 0x9000000u, 0, 0, 0, 0x20u);
  1921. if ( v13 < 0 )
  1922. {
  1923. if ( v13 & 0x8000 )
  1924. v22 = ~(v13 << 16);
  1925. else
  1926. v22 = v13 << 16;
  1927. if ( v13 & 0x8000 )
  1928. v23 = ~(v22 >> 16);
  1929. else
  1930. v23 = v22 >> 16;
  1931. sub_8129A24("Failed to map PPC MEM2-A with status %d:%d.\n", (~v13 >> 16) & 0x3FF, v23);
  1932. }
  1933. v14 = sub_8122174(0x28000000u, 671088640, 0xA8000000, 0, 0, 0, 0x20u);
  1934. if ( v14 < 0 )
  1935. {
  1936. if ( v14 & 0x8000 )
  1937. v20 = ~(v14 << 16);
  1938. else
  1939. v20 = v14 << 16;
  1940. if ( v14 & 0x8000 )
  1941. v21 = ~(v20 >> 16);
  1942. else
  1943. v21 = v20 >> 16;
  1944. sub_8129A24("Failed to map PPC MEM2-B with status %d:%d.\n", (~v14 >> 16) & 0x3FF, v21);
  1945. }
  1946. result = sub_8122174(0x28000000u, 671088640, 0xA8000000, 0, 0, 0, 0x20u);
  1947. if ( result < 0 )
  1948. {
  1949. if ( result & 0x8000 )
  1950. v16 = ~(result << 16);
  1951. else
  1952. v16 = result << 16;
  1953. if ( result & 0x8000 )
  1954. v17 = ~(v16 >> 16);
  1955. else
  1956. v17 = v16 >> 16;
  1957. sub_8129A24("Failed to map PPC MEM2-B with status %d:%d.\n", (~result >> 16) & 0x3FF, v17);
  1958. }
  1959. return result;
  1960. }
  1961. //----- (08122AD4) --------------------------------------------------------
  1962. signed int __fastcall sub_8122AD4(int a1, unsigned int a2)
  1963. {
  1964. signed int result; // r0@2
  1965. int v3; // r2@3
  1966. int v4; // r3@4
  1967.  
  1968. if ( !a2 || (v3 = *(_DWORD *)a1, a2 < *(_DWORD *)a1 + 16) || (v4 = *(_DWORD *)(a1 + 8), result = 0, a2 >= v3 + v4) )
  1969. result = -4;
  1970. return result;
  1971. }
Advertisement
Add Comment
Please, Sign In to add comment