diff --git a/libctru/include/3ds/svc.h b/libctru/include/3ds/svc.h index 6e3ff60..0a023e2 100644 --- a/libctru/include/3ds/svc.h +++ b/libctru/include/3ds/svc.h @@ -34,6 +34,14 @@ typedef struct { u32 flags; } PageInfo; +typedef enum { + ARBITER_FREE =0, + ARBITER_ACQUIRE =1, + ARBITER_KERNEL2 =2, + ARBITER_ACQUIRE_TIMEOUT=3, + ARBITER_KERNEL4 =4, +} ArbitrationType; + u32* getThreadCommandBuffer(void); @@ -55,6 +63,8 @@ s32 svcClearTimer(Handle timer); s32 svcCreateMemoryBlock(Handle* memblock, u32 addr, u32 size, MemPerm my_perm, MemPerm other_perm); s32 svcMapMemoryBlock(Handle memblock, u32 addr, MemPerm my_perm, MemPerm other_perm); s32 svcUnmapMemoryBlock(Handle memblock, u32 addr); +s32 svcCreateAddressArbiter(Handle *arbiter); +s32 svcArbitrateAddress(Handle arbiter, u32 addr, ArbitrationType type, s32 value, s64 nanoseconds); s32 svcWaitSynchronization(Handle handle, s64 nanoseconds); s32 svcWaitSynchronizationN(s32* out, Handle* handles, s32 handles_num, bool wait_all, s64 nanoseconds); s32 svcCloseHandle(Handle handle); diff --git a/libctru/source/svc.s b/libctru/source/svc.s index 6dbdddd..f918369 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -153,6 +153,24 @@ svcUnmapMemoryBlock: svc 0x20 bx lr +.global svcCreateAddressArbiter +.type svcCreateAddressArbiter, %function +svcCreateAddressArbiter: + svc 0x21 + bx lr + +.global svcArbitrateAddress +.type svcArbitrateAddress, %function +svcArbitrateAddress: + push {r4,r5} + add sp, #8 + ldr r5, [sp] + ldr r4, [sp, #4] + sub sp, #8 + svc 0x22 + pop {r4,r5} + bx lr + .global svcCloseHandle .type svcCloseHandle, %function svcCloseHandle: