From 377e753b7dbba879ea31485fd9ae49c520ba77cb Mon Sep 17 00:00:00 2001 From: fincs Date: Wed, 3 Dec 2014 23:40:49 +0100 Subject: [PATCH] Add getThreadLocalStorage(), major cleanup in svc.h/svc.s --- libctru/include/3ds/svc.h | 18 ++-- libctru/source/svc.s | 171 ++++++++++++++++++-------------------- 2 files changed, 93 insertions(+), 96 deletions(-) diff --git a/libctru/include/3ds/svc.h b/libctru/include/3ds/svc.h index 8a82e4e..d498d45 100644 --- a/libctru/include/3ds/svc.h +++ b/libctru/include/3ds/svc.h @@ -2,8 +2,7 @@ svc.h _ Syscall wrappers. */ -#ifndef SVC_H -#define SVC_H +#pragma once typedef enum { MEMOP_FREE =1, // Free heap @@ -42,8 +41,17 @@ typedef enum { ARBITER_KERNEL4 =4, } ArbitrationType; +static inline void* getThreadLocalStorage(void) +{ + void* ret; + asm volatile("mrc p15, 0, %[data], c13, c0, 3" : [data] "=r" (ret)); + return ret; +} -u32* getThreadCommandBuffer(void); +static inline u32* getThreadCommandBuffer(void) +{ + return (u32*)((u8*)getThreadLocalStorage() + 0x80); +} s32 svcControlMemory(u32* addr_out, u32 addr0, u32 addr1, u32 size, MemOp op, MemPerm perm); s32 svcQueryMemory(MemInfo* info, PageInfo* out, u32 addr); @@ -51,6 +59,7 @@ void __attribute__((noreturn)) svcExitProcess(); s32 svcCreateThread(Handle* thread, ThreadFunc entrypoint, u32 arg, u32* stack_top, s32 thread_priority, s32 processor_id); void __attribute__((noreturn)) svcExitThread(); void svcSleepThread(s64 ns); +s32 svcSetThreadPriority(Handle thread, s32 prio); s32 svcCreateMutex(Handle* mutex, bool initially_locked); s32 svcReleaseMutex(Handle handle); s32 svcCreateEvent(Handle* event, u8 reset_type); @@ -76,6 +85,3 @@ s32 svcConnectToPort(volatile Handle* out, const char* portName); s32 svcSendSyncRequest(Handle session); s32 svcGetProcessId(u32 *out, Handle handle); s32 svcOutputDebugString(const char* str, int length); -s32 svcSetThreadPriority(Handle thread, s32 prio); - -#endif diff --git a/libctru/source/svc.s b/libctru/source/svc.s index b16f479..2f2eb0e 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -1,72 +1,69 @@ .arm .align 4 -/* THIS DOES NOT BELONG HERE */ -.global getThreadCommandBuffer -.type getThreadCommandBuffer, %function -getThreadCommandBuffer: - mrc p15, 0, r0, c13, c0, 3 - add r0, #0x80 - bx lr - - .global svcControlMemory .type svcControlMemory, %function svcControlMemory: - stmfd sp!, {r0, r4} - ldr r0, [sp, #0x8] - ldr r4, [sp, #0x8+0x4] - svc 0x01 - ldr r2, [sp], #4 - str r1, [r2] - ldr r4, [sp], #4 - bx lr + push {r0, r4} + ldr r0, [sp, #0x8] + ldr r4, [sp, #0x8+0x4] + svc 0x01 + ldr r2, [sp], #4 + str r1, [r2] + ldr r4, [sp], #4 + bx lr .global svcQueryMemory .type svcQueryMemory, %function svcQueryMemory: - stmfd sp!, {r0,r1,r4-r6} - svc 2 - ldr r6, [sp] - str r1, [r6] - str r2, [r6,#4] - str r3, [r6,#8] - str r4, [r6,#0xc] - ldr r6, [sp,#4] - str r5, [r6] - add sp, sp, #8 - ldmfd sp!, {r4-r6} - bx lr + push {r0, r1, r4-r6} + svc 0x02 + ldr r6, [sp] + str r1, [r6] + str r2, [r6, #4] + str r3, [r6, #8] + str r4, [r6, #0xc] + ldr r6, [sp, #4] + str r5, [r6] + add sp, sp, #8 + pop {r4-r6} + bx lr .global svcExitProcess .type svcExitProcess, %function svcExitProcess: svc 0x03 - bx lr + bx lr .global svcCreateThread .type svcCreateThread, %function svcCreateThread: - stmfd sp!, {r0, r4} - ldr r0, [sp, #0x8] - ldr r4, [sp, #0x8+0x4] - svc 0x08 - ldr r2, [sp], #4 - str r1, [r2] - ldr r4, [sp], #4 - bx lr + push {r0, r4} + ldr r0, [sp, #0x8] + ldr r4, [sp, #0x8+0x4] + svc 0x08 + ldr r2, [sp], #4 + str r1, [r2] + ldr r4, [sp], #4 + bx lr .global svcExitThread .type svcExitThread, %function svcExitThread: svc 0x09 - bx lr + bx lr .global svcSleepThread .type svcSleepThread, %function svcSleepThread: svc 0x0A - bx lr + bx lr + +.global svcSetThreadPriority +.type svcSetThreadPriority, %function +svcSetThreadPriority: + svc 0x0C + bx lr .global svcCreateMutex .type svcCreateMutex, %function @@ -75,61 +72,61 @@ svcCreateMutex: svc 0x13 ldr r3, [sp], #4 str r1, [r3] - bx lr + bx lr .global svcReleaseMutex .type svcReleaseMutex, %function svcReleaseMutex: svc 0x14 - bx lr + bx lr .global svcCreateEvent .type svcCreateEvent, %function svcCreateEvent: - str r0, [sp,#-4]! + str r0, [sp, #-4]! svc 0x17 ldr r2, [sp], #4 str r1, [r2] - bx lr + bx lr .global svcSignalEvent .type svcSignalEvent, %function svcSignalEvent: svc 0x18 - bx lr + bx lr .global svcClearEvent .type svcClearEvent, %function svcClearEvent: svc 0x19 - bx lr + bx lr .global svcCreateTimer .type svcCreateTimer, %function svcCreateTimer: - str r0, [sp,#-4]! + str r0, [sp, #-4]! svc 0x1A ldr r2, [sp], #4 str r1, [r2] - bx lr + bx lr .global svcSetTimer .type svcSetTimer, %function svcSetTimer: svc 0x1B - bx lr + bx lr .global svcCancelTimer .type svcCancelTimer, %function svcCancelTimer: svc 0x1C - bx lr + bx lr .global svcClearTimer .type svcClearTimer, %function svcClearTimer: svc 0x1D - bx lr + bx lr .global svcCreateMemoryBlock .type svcCreateMemoryBlock, %function @@ -139,49 +136,49 @@ svcCreateMemoryBlock: svc 0x1E ldr r2, [sp], #4 str r1, [r2] - bx lr + bx lr .global svcMapMemoryBlock .type svcMapMemoryBlock, %function svcMapMemoryBlock: svc 0x1F - bx lr + bx lr .global svcUnmapMemoryBlock .type svcUnmapMemoryBlock, %function svcUnmapMemoryBlock: svc 0x20 - bx lr + bx lr .global svcCreateAddressArbiter .type svcCreateAddressArbiter, %function svcCreateAddressArbiter: svc 0x21 - bx lr + bx lr .global svcArbitrateAddress .type svcArbitrateAddress, %function svcArbitrateAddress: - push {r4,r5} + push {r4, r5} add sp, #8 ldr r5, [sp] ldr r4, [sp, #4] sub sp, #8 svc 0x22 - pop {r4,r5} - bx lr + pop {r4, r5} + bx lr .global svcCloseHandle .type svcCloseHandle, %function svcCloseHandle: svc 0x23 - bx lr + bx lr .global svcWaitSynchronization .type svcWaitSynchronization, %function svcWaitSynchronization: svc 0x24 - bx lr + bx lr .global svcWaitSynchronizationN .type svcWaitSynchronizationN, %function @@ -195,16 +192,16 @@ svcWaitSynchronizationN: str r1, [r5] ldr r4, [sp], #4 ldr r5, [sp], #4 - bx lr + bx lr .global svcDuplicateHandle .type svcDuplicateHandle, %function svcDuplicateHandle: - str r0, [sp,#-0x4]! + str r0, [sp, #-0x4]! svc 0x27 ldr r3, [sp], #4 str r1, [r3] - bx lr + bx lr .global svcGetSystemTick .type svcGetSystemTick, %function @@ -215,34 +212,34 @@ svcGetSystemTick: .global svcGetSystemInfo .type svcGetSystemInfo, %function svcGetSystemInfo: - stmfd sp!, {r0, r4} - svc 0x2A - ldr r4, [sp], #4 - str r1, [r4] - str r2, [r4, #4] - str r3, [r4, #8] - ldr r4, [sp], #4 - bx lr + push {r0, r4} + svc 0x2A + ldr r4, [sp], #4 + str r1, [r4] + str r2, [r4, #4] + str r3, [r4, #8] + ldr r4, [sp], #4 + bx lr .global svcGetProcessInfo .type svcGetProcessInfo, %function svcGetProcessInfo: - stmfd sp!, {r0, r4} - svc 0x2B - ldr r4, [sp], #4 - str r1, [r4] - str r2, [r4, #4] - ldr r4, [sp], #4 - bx lr + push {r0,r4} + svc 0x2B + ldr r4, [sp], #4 + str r1, [r4] + str r2, [r4, #4] + ldr r4, [sp], #4 + bx lr .global svcConnectToPort .type svcConnectToPort, %function svcConnectToPort: - str r0, [sp,#-0x4]! + str r0, [sp, #-0x4]! svc 0x2D ldr r3, [sp], #4 str r1, [r3] - bx lr + bx lr .global svcSendSyncRequest .type svcSendSyncRequest, %function @@ -253,23 +250,17 @@ svcSendSyncRequest: .global svcGetProcessId .type svcGetProcessId, %function svcGetProcessId: - str r0, [sp,#-0x4]! + str r0, [sp, #-0x4]! svc 0x35 ldr r3, [sp], #4 str r1, [r3] - bx lr - -.global svcSetThreadPriority -.type svcSetThreadPriority, %function -svcSetThreadPriority: - svc 0x0C - bx lr + bx lr .global svcOutputDebugString .type svcOutputDebugString, %function svcOutputDebugString: - str r0, [sp,#-0x4]! + str r0, [sp, #-0x4]! svc 0x3D ldr r2, [sp], #4 str r1, [r2] - bx lr + bx lr