Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Kernel_Library_37431849
- // ptr[0] count
- // ptr[1] lock_id
- // ptr[2] flags
- // ptr[4] id
- s32 sceKernelTryLockLwMutex_600(s32 *ptr, u32 count)
- {
- s32 tmp0;
- s32 tmp1;
- s32 tmp2;
- if (g_2bc0 == NULL) {
- // 0x80020064
- return SCE_ERROR_KERNEL_CANNOT_BE_CALLED_FROM_INTERRUPT;
- }
- if (count <= 0) {
- // 0x800201BD
- return SCE_ERROR_KERNEL_ILLEGAL_COUNT;
- }
- if (ptr[4] < 0) {
- // 0x800201CA
- return SCE_ERROR_KERNEL_LWMUTEX_NOT_FOUND;
- }
- if (ptr[1] == g_2bc0[48]) { // loc_00000340
- if (!((ptr[2] >> 9) & 1)) {
- // 0x800201CF
- return SCE_ERROR_KERNEL_LWMUTEX_RECURSIVE_NOT_ALLOWED;
- }
- if (ptr[0] + count < 0) {
- // 0x800201CD
- return SCE_ERROR_KERNEL_LWMUTEX_LOCK_OVERFLOW;
- }
- ptr[0] += count;
- return SCE_ERROR_OK;
- }
- if (ptr[1] != 0) {
- // 0x800201CB
- return SCE_ERROR_KERNEL_LWMUTEX_LOCKED;
- }
- if (((ptr[2] >> 9) & 1)) {
- tmp0 = 0;
- } else {
- tmp0 = count ^ 1;
- }
- if (tmp0) {
- // 0x800201BD
- return SCE_ERROR_KERNEL_ILLEGAL_COUNT;
- }
- do {
- /* begin atomic RMW */
- asm __volatile__(
- "ll %0, (%1)"
- : "=r" (tmp1)
- : "r" (&ptr[1])
- );
- if (tmp1) {
- // 0x800201CB
- return SCE_ERROR_KERNEL_LWMUTEX_LOCKED;
- }
- tmp2 = g_2bc0[48];
- /* end atomic RMW */
- /* if an atomic update as occured, %0 will be set to true */
- asm __volatile__(
- "sc %0, (%1)"
- : "=r" (tmp2)
- : "r" (&ptr[1])
- );
- } while (!tmp2);
- ptr[0] = count;
- return SCE_ERROR_OK;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement