]> Chaos Git - corbenik/ctrulib.git/commitdiff
Add getThreadLocalStorage(), major cleanup in svc.h/svc.s
authorfincs <fincs.alt1@gmail.com>
Wed, 3 Dec 2014 22:40:49 +0000 (23:40 +0100)
committerfincs <fincs.alt1@gmail.com>
Fri, 5 Dec 2014 13:13:18 +0000 (14:13 +0100)
libctru/include/3ds/svc.h
libctru/source/svc.s

index 8a82e4e88c600527c5999f1b517c3bafa3ab040a..d498d45aafc9acfc7edc85a50329e03af0f5b577 100644 (file)
@@ -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
index b16f47944e1038701b88250e335efd57075a537c..2f2eb0e75529d85a41bbc7116c778d4f9fc80a10 100644 (file)
@@ -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