Advertisement
GeeckoDev

lazy

Mar 3rd, 2013
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.69 KB | None | 0 0
  1. Assembleur :
  2.  
  3. ; ======================================================
  4. ; Subroutine sceGe_lazy_31129B95 - Address 0x00000140
  5. ; Exported in sceGe_lazy
  6. sceGe_lazy_31129B95:
  7. ; Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  8.     0x00000140: 0x3C010000 '...<' - lui        $at, 0x0
  9. ; Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  10.     0x00000144: 0x8C220B80 '..".' - lw         $v0, 2944($at)
  11.     0x00000148: 0x1482000C '....' - bne        $a0, $v0, loc_0000017C
  12.     0x0000014C: 0x00000000 '....' - nop        
  13.     0x00000150: 0x10A0000A '....' - beqz       $a1, loc_0000017C
  14. ; Data ref 0x00000B84 ... 0x00000000 0x00000000 0x00000064 0x00000000
  15.     0x00000154: 0xAC250B84 '..%.' - sw         $a1, 2948($at)
  16. ; Data ref 0x00000B88 ... 0x00000000 0x00000064 0x00000000 0x00000000
  17.     0x00000158: 0x8C230B88 '..#.' - lw         $v1, 2952($at)
  18. ; Data ref 0x00000B8C ... 0x00000064 0x00000000 0x00000000 0x00000000
  19.     0x0000015C: 0x8C260B8C '..&.' - lw         $a2, 2956($at)
  20.     0x00000160: 0x24630001 '..c$' - addiu      $v1, $v1, 1
  21. ; Data ref 0x00000B88 ... 0x00000000 0x00000064 0x00000000 0x00000000
  22.     0x00000164: 0xAC230B88 '..#.' - sw         $v1, 2952($at)
  23.     0x00000168: 0x0066182B '+.f.' - sltu       $v1, $v1, $a2
  24.     0x0000016C: 0x10600003 '..`.' - beqz       $v1, loc_0000017C
  25.     0x00000170: 0x00000000 '....' - nop        
  26.     0x00000174: 0x03E00008 '....' - jr         $ra
  27.     0x00000178: 0x00001021 '!...' - move       $v0, $zr
  28.  
  29. loc_0000017C:       ; Refs: 0x00000148 0x00000150 0x0000016C
  30.     0x0000017C: 0x27BDFFF0 '...'' - addiu      $sp, $sp, -16
  31.     0x00000180: 0xAFA40000 '....' - sw         $a0, 0($sp)
  32.     0x00000184: 0xAFA50004 '....' - sw         $a1, 4($sp)
  33.     0x00000188: 0x0440000D '..@.' - bltz       $v0, loc_000001C0
  34.     0x0000018C: 0xAFBF0008 '....' - sw         $ra, 8($sp)
  35. ; Data ref 0x00000B84 ... 0x00000000 0x00000000 0x00000064 0x00000000
  36.     0x00000190: 0x8C270B84 '..'.' - lw         $a3, 2948($at)
  37.  
  38. loc_00000194:       ; Refs: 0x000001A4
  39. ; Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  40.     0x00000194: 0xC0260B80 '..&.' - ll         $a2, 2944($at)
  41.     0x00000198: 0x14C20009 '....' - bne        $a2, $v0, loc_000001C0
  42.     0x0000019C: 0x2403FFFF '...$' - li         $v1, -1
  43. ; Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  44.     0x000001A0: 0xE0230B80 '..#.' - sc         $v1, 2944($at)
  45.     0x000001A4: 0x1060FFFB '..`.' - beqz       $v1, loc_00000194
  46.     0x000001A8: 0x00000000 '....' - nop        
  47.     0x000001AC: 0x00C02021 '! ..' - move       $a0, $a2
  48.     0x000001B0: 0x0C000082 '....' - jal        sub_00000208
  49.     0x000001B4: 0x00E02821 '!(..' - move       $a1, $a3
  50.     0x000001B8: 0x8FA40000 '....' - lw         $a0, 0($sp)
  51.     0x000001BC: 0x8FA50004 '....' - lw         $a1, 4($sp)
  52.  
  53. loc_000001C0:       ; Refs: 0x00000188 0x00000198
  54.     0x000001C0: 0x0C000082 '....' - jal        sub_00000208
  55.     0x000001C4: 0x00000000 '....' - nop        
  56.     0x000001C8: 0x0440000C '..@.' - bltz       $v0, loc_000001FC
  57.     0x000001CC: 0x00000000 '....' - nop        
  58.     0x000001D0: 0x8FA40000 '....' - lw         $a0, 0($sp)
  59. ; Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  60.     0x000001D4: 0x3C010000 '...<' - lui        $at, 0x0
  61.  
  62. loc_000001D8:       ; Refs: 0x000001E8
  63. ; Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  64.     0x000001D8: 0xC0230B80 '..#.' - ll         $v1, 2944($at)
  65.     0x000001DC: 0x04610007 '..a.' - bgez       $v1, loc_000001FC
  66.     0x000001E0: 0x00801821 '!...' - move       $v1, $a0
  67. ; Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  68.     0x000001E4: 0xE0230B80 '..#.' - sc         $v1, 2944($at)
  69.     0x000001E8: 0x1060FFFB '..`.' - beqz       $v1, loc_000001D8
  70.     0x000001EC: 0x00000000 '....' - nop        
  71.     0x000001F0: 0x8FA50004 '....' - lw         $a1, 4($sp)
  72. ; Data ref 0x00000B84 ... 0x00000000 0x00000000 0x00000064 0x00000000
  73.     0x000001F4: 0xAC250B84 '..%.' - sw         $a1, 2948($at)
  74. ; Data ref 0x00000B88 ... 0x00000000 0x00000064 0x00000000 0x00000000
  75.     0x000001F8: 0xAC200B88 '.. .' - sw         $zr, 2952($at)
  76.  
  77. loc_000001FC:       ; Refs: 0x000001C8 0x000001DC
  78.     0x000001FC: 0x8FBF0008 '....' - lw         $ra, 8($sp)
  79.     0x00000200: 0x03E00008 '....' - jr         $ra
  80.     0x00000204: 0x27BD0010 '...'' - addiu      $sp, $sp, 16
  81.  
  82. Code C généré :
  83.  
  84. sceGe_lazy_31129B95(...) // at 0x00000140
  85. {
  86. &    at = 0x00000; // Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  87. &    v0 = *(s32*)(at + 2944); // Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  88. &    if (a0 != v0)
  89. &        goto loc_0000017C;
  90. &    *(s32*)(at + 2948) = a1; // Data ref 0x00000B84 ... 0x00000000 0x00000000 0x00000064 0x00000000
  91. &    if (a1 == 0)
  92. &        goto loc_0000017C;
  93. &    v1 = *(s32*)(at + 2952); // Data ref 0x00000B88 ... 0x00000000 0x00000064 0x00000000 0x00000000
  94. &    a2 = *(s32*)(at + 2956); // Data ref 0x00000B8C ... 0x00000064 0x00000000 0x00000000 0x00000000
  95. &    v1 = v1 + 1;
  96. &    *(s32*)(at + 2952) = v1; // Data ref 0x00000B88 ... 0x00000000 0x00000064 0x00000000 0x00000000
  97. &    v1 = (u32)v1 < (u32)a2;
  98. &    if (v1 == 0)
  99. &        goto loc_0000017C;
  100. &    v0 = 0;
  101. &    return (v1 << 32) | v0;
  102.  
  103. loc_0000017C:      
  104. &    sp = sp - 16;
  105. &    *(s32*)(sp + 0) = a0;
  106. &    *(s32*)(sp + 4) = a1;
  107. &    *(s32*)(sp + 8) = ra;
  108. &    if (v0 < 0)
  109. &        goto loc_000001C0;
  110. &    a3 = *(s32*)(at + 2948); // Data ref 0x00000B84 ... 0x00000000 0x00000000 0x00000064 0x00000000
  111.  
  112. loc_00000194:      
  113. &    asm("ll         $a2, 2944($at)"); // Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  114. &    v1 = -1;
  115. &    if (a2 != v0)
  116. &        goto loc_000001C0;
  117. &    asm("sc         $v1, 2944($at)"); // Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  118. &    if (v1 == 0)
  119. &        goto loc_00000194;
  120. &    a0 = a2;
  121. &    a1 = a3;
  122.    v0, v1 = sub_00000208(...);
  123.    a0 = *(s32*)(sp + 0);
  124.    a1 = *(s32*)(sp + 4);
  125.  
  126. loc_000001C0:      
  127.    v0, v1 = sub_00000208(...);
  128.    if (v0 < 0)
  129.        goto loc_000001FC;
  130.    a0 = *(s32*)(sp + 0);
  131.    at = 0x00000; // Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  132.  
  133. loc_000001D8:      
  134.    asm("ll         $v1, 2944($at)"); // Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  135.    cond = (v1 >= 0);
  136.    v1 = a0;
  137.    if (cond)
  138.        goto loc_000001FC;
  139.    asm("sc         $v1, 2944($at)"); // Data ref 0x00000B80 ... 0xFFFFFFFF 0x00000000 0x00000000 0x00000064
  140.    if (v1 == 0)
  141.        goto loc_000001D8;
  142.    a1 = *(s32*)(sp + 4);
  143.    *(s32*)(at + 2948) = a1; // Data ref 0x00000B84 ... 0x00000000 0x00000000 0x00000064 0x00000000
  144.    *(s32*)(at + 2952) = 0; // Data ref 0x00000B88 ... 0x00000000 0x00000064 0x00000000 0x00000000
  145.  
  146. loc_000001FC:      
  147.    ra = *(s32*)(sp + 8);
  148.    sp = sp + 16;
  149.    return (v1 << 32) | v0;
  150. }
  151.  
  152. Code C reversé (non complet) :
  153.  
  154. s32 sceGe_lazy_31129B95(s32 arg0, s32 arg1)
  155. {
  156.    s32 tmp0;
  157.    s32 tmp1;
  158.  
  159.    if (arg0 == g_b80) {
  160.        g_b84 = arg1;
  161.  
  162.        if (arg1 != 0) {
  163.            g_b88++;
  164.  
  165.            if (g_b88 < g_b8c) {
  166.                return 0;
  167.            }
  168.        }
  169.    }
  170.  
  171.    // loc_0000017C
  172.  
  173.    if (g_b80 < 0) {
  174.        goto loc_000001C0;
  175.    }
  176.  
  177.    do {
  178.        /* begin atomic RMW */
  179.        asm __volatile__(
  180.            "ll %0, (%1)"
  181.            : "=r" (tmp0)
  182.            : "r" (&g_b80)
  183.        );
  184.  
  185.        tmp1 = -1;
  186.  
  187.        if (tmp0 != g_b80) {
  188.            goto loc_000001C0;
  189.        }
  190.  
  191.        /* end atomic RMW */
  192.        /* if an atomic update as occured, %0 will be set to 1 */
  193.        asm __volatile__(
  194.            "sc %0, (%1)"
  195.            : "=r" (tmp1)
  196.            : "r" (&g_b80)
  197.        );
  198.    } while (!tmp1);
  199.  
  200.    $at = 0
  201.    $a0 = tmp0
  202.    $a1 = g_b84
  203.    $a2 = g_b8c
  204.    $a3 = g_b84
  205.    $v0 = g_b80
  206.    $v1 = -1
  207. loc_000001C0:
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement