X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fld-acess.so_src%2Farch%2Farmv7.S.h;h=560b809f0c1df0c929465293938271c71c5f73a2;hb=30c11f371da98d13344e8bed3766d3e574a65ac9;hp=75c56d8f153931d378a875640d6b4a5203bd0ec8;hpb=dc8801cc0b5ed911a775cfc2ea853048f7a00db1;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/ld-acess.so_src/arch/armv7.S.h b/Usermode/Libraries/ld-acess.so_src/arch/armv7.S.h index 75c56d8f..560b809f 100644 --- a/Usermode/Libraries/ld-acess.so_src/arch/armv7.S.h +++ b/Usermode/Libraries/ld-acess.so_src/arch/armv7.S.h @@ -7,7 +7,8 @@ .globl _start .extern SoMain _start: - push {r1,r2,r3} + pop {r0} + ldm sp, {r1,r2,r3} bl SoMain mov r4, r0 @@ -33,6 +34,13 @@ __ucmpdi2: mov r0, #1 mov pc, lr +@ Well, can't blame it +@ - Clear the instruction cache +.globl __clear_cache +__clear_cache: + svc #0x1001 + mov pc, lr + @ DEST @ SRC @_memcpy: @@ -53,9 +61,31 @@ _errno: .long 0 @ Placed in .text, to allow use of relative addressing .macro syscall0 _name, _num .globl \_name \_name: + push {lr} svc #\_num str r2, _errno - mov pc, lr + pop {pc} +.endm + +.macro syscall5 _name, _num +.globl \_name +\_name: + push {r4, lr} + ldr r4, [sp,#8] + svc #\_num + str r2, _errno + 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 + str r2, _errno + pop {r4,r5,pc} .endm #define SYSCALL0(_name,_num) syscall0 _name, _num @@ -64,13 +94,30 @@ _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 #include "syscalls.s.h" #undef _exit +#undef _clone + +.globl _clone +_clone: + push {r4} + mov r4, r1 + svc #SYS_CLONE + str r2, _errno + 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: