diff options
Diffstat (limited to 'src/libthread/Linux-arm-asm.s')
-rw-r--r-- | src/libthread/Linux-arm-asm.s | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/libthread/Linux-arm-asm.s b/src/libthread/Linux-arm-asm.s new file mode 100644 index 00000000..95c8aaac --- /dev/null +++ b/src/libthread/Linux-arm-asm.s @@ -0,0 +1,53 @@ + +.globl _tas +_tas: + mov r3, #0xCA000000 + add r3, r3, #0xFE0000 + add r3, r3, #0xBA00 + add r3, r3, #0xBE + swp r3, r3, [r0] + mov r0, r3 + mov pc, lr + +.globl getmcontext +getmcontext: + /* r0 will be overwritten */ + str r1, [r0,#4]! + str r2, [r0,#4]! + str r3, [r0,#4]! + str r4, [r0,#4]! + str r5, [r0,#4]! + str r6, [r0,#4]! + str r7, [r0,#4]! + str r8, [r0,#4]! + str r9, [r0,#4]! + str r10, [r0,#4]! + str r11, [r0,#4]! + str r12, [r0,#4]! + str r13, [r0,#4]! + str r14, [r0,#4]! + /* r15 is pc */ + mov r0, #0 + mov pc, lr + +.globl setmcontext +setmcontext: + /* r0 will be overwritten */ + ldr r1, [r0,#4]! + ldr r2, [r0,#4]! + ldr r3, [r0,#4]! + ldr r4, [r0,#4]! + ldr r5, [r0,#4]! + ldr r6, [r0,#4]! + ldr r7, [r0,#4]! + ldr r8, [r0,#4]! + ldr r9, [r0,#4]! + ldr r10, [r0,#4]! + ldr r11, [r0,#4]! + ldr r12, [r0,#4]! + ldr r13, [r0,#4]! + ldr r14, [r0,#4]! + /* r15 is pc */ + mov r0, #1 + mov pc, lr + |