Merge branch 'master' of git://ted.mutabah.net/acess2
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / arch / armv7.S.h
index 75c56d8..351c841 100644 (file)
@@ -2,12 +2,11 @@
 // Acess2 ARMv7 - System Calls
 //
 
-#include "../../../../Kernel/include/syscalls.h"
-
 .globl _start
 .extern SoMain
 _start:
-       push {r1,r2,r3}
+       pop {r0}
+       ldm sp, {r1,r2,r3}
        bl SoMain
        
        mov r4, r0
@@ -33,29 +32,60 @@ __ucmpdi2:
        mov r0, #1
        mov pc, lr
 
-@ DEST
-@ SRC
-@_memcpy:
-@      push rbp
-@      mov rbp, rsp
-@      
-@      ; RDI - First Param
-@      ; RSI - Second Param
-@      mov rcx, rdx    ; RDX - Third
-@      rep movsb
-@      
-@      pop rbp
-@      ret
-@
+@ Well, can't blame it
+@ - Clear the instruction cache
+.globl __clear_cache
+__clear_cache:
+       svc #0x1001
+       mov pc, lr
+
+
+@ >r0: PC
+@ >r1: Pointer to item count
+@ <r0: Address
+@ STUBBED
+__gnu_Unwind_Find_exidx:
+       mov r0, #0
+       str r0, [r1]
+       mov pc, lr
+
+.section .data
 .globl _errno
 _errno:        .long   0       @ Placed in .text, to allow use of relative addressing
+.section .text
 
 .macro syscall0 _name, _num    
 .globl \_name
 \_name:
+       push {lr}
        svc #\_num
-       str r2, _errno
-       mov pc, lr
+       @mrc p15, 0, r3, c13, c0, 2
+       ldr r3, =_errno
+       str r2, [r3]
+       pop {pc}
+.endm
+
+.macro syscall5 _name, _num
+.globl \_name
+\_name:
+       push {r4, lr}
+       ldr r4, [sp,#8]
+       svc #\_num
+       ldr r3, =_errno
+       str r2, [r3]
+       pop {r4, pc}
+.endm
+
+.macro syscall6 _name, _num
+.globl \_name
+\_name:
+       push {r4,r5,lr}
+       ldr r4, [sp,#12]
+       ldr r5, [sp,#16]
+       svc #\_num
+       ldr r3, =_errno
+       str r2, [r3]
+       pop {r4,r5,pc}
 .endm
 
 #define SYSCALL0(_name,_num)   syscall0 _name, _num
@@ -64,13 +94,46 @@ _errno:     .long   0       @ Placed in .text, to allow use of relative addressing
 #define SYSCALL3(_name,_num)   SYSCALL0(_name, _num)
 #define SYSCALL4(_name,_num)   SYSCALL0(_name, _num)
 // TODO: 5/6 need special handling, because the args are on the stack
-#define SYSCALL5(_name,_num)   SYSCALL0(_name, _num)
-#define SYSCALL6(_name,_num)   SYSCALL0(_name, _num)
+#define SYSCALL5(_name,_num)   syscall5 _name, _num
+#define SYSCALL6(_name,_num)   syscall6 _name, _num
 
 // Override the clone syscall
 #define _exit  _exit_raw
+#define _clone _clone_raw
+#define _SysSeek       _SysSeek_borken
 #include "syscalls.s.h"
 #undef _exit
+#undef _clone
+#undef _SysSeek 
+
+// NOTE: _SysSeek needs special handling for alignment
+.globl _SysSeek
+_SysSeek:
+       push {lr}
+       mov r1,r2
+       mov r2,r3
+       ldr r3, [sp,#4]
+       svc #SYS_SEEK
+       ldr r3, =_errno
+       str r2, [r3]
+       pop {pc}
+
+.globl _clone
+_clone:
+       push {r4}
+       mov r4, r1
+       svc #SYS_CLONE
+       ldr r3, =_errno
+       str r2, [r3]
+       tst r4, r4
+       beq _clone_ret
+       @ If in child, set SP
+       tst r0,r0
+       movne sp, r4
+_clone_ret:
+       pop {r4}
+       mov pc, lr
+
 
 .globl _exit
 _exit:

UCC git Repository :: git.ucc.asn.au