Advertisement
GeeckoDev

sceKernelTryLockLwMutex_600 reverse

Feb 22nd, 2013
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.80 KB | None | 0 0
  1. // Kernel_Library_37431849
  2. // ptr[0] count
  3. // ptr[1] lock_id
  4. // ptr[2] flags
  5. // ptr[4] id
  6. s32 sceKernelTryLockLwMutex_600(s32 *ptr, u32 count)
  7. {
  8.     s32 tmp0;
  9.     s32 tmp1;
  10.     s32 tmp2;
  11.  
  12.     if (g_2bc0 == NULL) {
  13.         // 0x80020064
  14.         return SCE_ERROR_KERNEL_CANNOT_BE_CALLED_FROM_INTERRUPT;
  15.     }
  16.  
  17.     if (count <= 0) {
  18.         // 0x800201BD
  19.         return SCE_ERROR_KERNEL_ILLEGAL_COUNT;
  20.     }
  21.  
  22.     if (ptr[4] < 0) {
  23.         // 0x800201CA
  24.         return SCE_ERROR_KERNEL_LWMUTEX_NOT_FOUND;
  25.     }
  26.  
  27.     if (ptr[1] == g_2bc0[48]) { // loc_00000340
  28.         if (!((ptr[2] >> 9) & 1)) {
  29.             // 0x800201CF
  30.             return SCE_ERROR_KERNEL_LWMUTEX_RECURSIVE_NOT_ALLOWED;
  31.         }
  32.  
  33.         if (ptr[0] + count < 0) {
  34.             // 0x800201CD
  35.             return SCE_ERROR_KERNEL_LWMUTEX_LOCK_OVERFLOW;
  36.         }
  37.  
  38.         ptr[0] += count;
  39.  
  40.         return SCE_ERROR_OK;
  41.     }
  42.  
  43.     if (ptr[1] != 0) {
  44.         // 0x800201CB
  45.         return SCE_ERROR_KERNEL_LWMUTEX_LOCKED;
  46.     }
  47.  
  48.     if (((ptr[2] >> 9) & 1)) {
  49.         tmp0 = 0;
  50.     } else {
  51.         tmp0 = count ^ 1;
  52.     }
  53.  
  54.     if (tmp0) {
  55.         // 0x800201BD
  56.         return SCE_ERROR_KERNEL_ILLEGAL_COUNT;
  57.     }
  58.  
  59.     do {
  60.         /* begin atomic RMW */
  61.         asm __volatile__(
  62.             "ll %0, (%1)"
  63.             : "=r" (tmp1)
  64.             : "r" (&ptr[1])
  65.         );
  66.  
  67.         if (tmp1) {
  68.             // 0x800201CB
  69.             return SCE_ERROR_KERNEL_LWMUTEX_LOCKED;
  70.         }
  71.  
  72.         tmp2 = g_2bc0[48];
  73.  
  74.         /* end atomic RMW */
  75.         /* if an atomic update as occured, %0 will be set to true */
  76.         asm __volatile__(
  77.             "sc %0, (%1)"
  78.             : "=r" (tmp2)
  79.             : "r" (&ptr[1])
  80.         );
  81.     } while (!tmp2);
  82.  
  83.     ptr[0] = count;
  84.  
  85.     return SCE_ERROR_OK;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement