.file "asm-Linux-arm.S"#include "syscall.h" .text /* * void executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg) */ .align 2 .global executeonnewstack .type executeonnewstack, %functionexecuteonnewstack: @ args = 0, pretend = 0, frame = 12 @ frame_needed = 1, uses_anonymous_args = 0 mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 sub sp, sp, #12 str r0, [fp, #-16] /* store tos */ str r1, [fp, #-20] /* store tramp */ str r2, [fp, #-24] /* store arg */ ldr r0, [fp, #-24] /* get arg */ ldr r2, [fp, #-16] /* get tos */ mov sp, r2 /* set new stack */ mov lr, pc blx r1 /* call tramp*/ /* if we return here, tramp didn't do it's job */ swi SYS_exit ldmea fp, {fp, sp, pc} .size executeonnewstack, .-executeonnewstack /* * void unlockandexit(int *key) * * NB: the return status may be garbaged if the stack is reused * between the unlock and the system call, but this should * not matter since no task is waiting for the result */ .align 2 .global unlockandexit .type unlockandexit, %functionunlockandexit: @ args = 0, pretend = 0, frame = 4 @ frame_needed = 1, uses_anonymous_args = 0 mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 sub sp, sp, #4 mov r1, #0 str r1, [r0] swi SYS_exit ldmea fp, {fp, sp, pc} .size unlockandexit, .-unlockandexit /* * ulong umult(ulong m1, ulong m2, ulong *hi) */ .align 2 .global umult .type umult, %functionumult: @ args = 0, pretend = 0, frame = 12 @ frame_needed = 1, uses_anonymous_args = 0 mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 sub sp, sp, #12 str r0, [fp, #-16] str r1, [fp, #-20] str r2, [fp, #-24] ldr r1, [fp, #-16] ldr r2, [fp, #-20] umull r0, r3, r1, r2 ldr r1, [fp, #-24] str r3, [r1] ldmea fp, {fp, sp, pc} .size umult, .-umult /* * void FPsave(void*); */ .align 2 .global FPsave .type FPsave, %functionFPsave: @ args = 0, pretend = 0, frame = 4 @ frame_needed = 1, uses_anonymous_args = 0 mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 sub sp, sp, #4 str r0, [fp, #-16] ldmea fp, {fp, sp, pc} .size FPsave, .-FPsave /* * void FPrestore(void*); */ .align 2 .global FPrestore .type FPrestore, %functionFPrestore: @ args = 0, pretend = 0, frame = 4 @ frame_needed = 1, uses_anonymous_args = 0 mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 sub sp, sp, #4 str r0, [fp, #-16] ldmea fp, {fp, sp, pc} .size FPrestore, .-FPrestore /* * ulong _tas(ulong*); */ .align 2 .global _tas .type _tas, %function_tas: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. @ lr needed for prologue mov r3, #1 swp r0, r3, [r0] mov pc, lr .size _tas, .-_tas
.file "asm-Linux-arm.S"
#include "syscall.h"
.text
/*
* void executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg)
*/
.align 2
.global executeonnewstack
.type executeonnewstack, %function
executeonnewstack:
@ args = 0, pretend = 0, frame = 12
@ frame_needed = 1, uses_anonymous_args = 0
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #12
str r0, [fp, #-16] /* store tos */
str r1, [fp, #-20] /* store tramp */
str r2, [fp, #-24] /* store arg */
ldr r0, [fp, #-24] /* get arg */
ldr r2, [fp, #-16] /* get tos */
mov sp, r2 /* set new stack */
mov lr, pc
blx r1 /* call tramp*/
/* if we return here, tramp didn't do it's job */
swi SYS_exit
ldmea fp, {fp, sp, pc}
.size executeonnewstack, .-executeonnewstack
/*
* void unlockandexit(int *key)
*
* NB: the return status may be garbaged if the stack is reused
* between the unlock and the system call, but this should
* not matter since no task is waiting for the result
*/
.align 2
.global unlockandexit
.type unlockandexit, %function
unlockandexit:
@ args = 0, pretend = 0, frame = 4
@ frame_needed = 1, uses_anonymous_args = 0
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #4
mov r1, #0
str r1, [r0]
swi SYS_exit
ldmea fp, {fp, sp, pc}
.size unlockandexit, .-unlockandexit
/*
* ulong umult(ulong m1, ulong m2, ulong *hi)
*/
.align 2
.global umult
.type umult, %function
umult:
@ args = 0, pretend = 0, frame = 12
@ frame_needed = 1, uses_anonymous_args = 0
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #12
str r0, [fp, #-16]
str r1, [fp, #-20]
str r2, [fp, #-24]
ldr r1, [fp, #-16]
ldr r2, [fp, #-20]
umull r0, r3, r1, r2
ldr r1, [fp, #-24]
str r3, [r1]
ldmea fp, {fp, sp, pc}
.size umult, .-umult
/*
* void FPsave(void*);
*/
.align 2
.global FPsave
.type FPsave, %function
FPsave:
@ args = 0, pretend = 0, frame = 4
@ frame_needed = 1, uses_anonymous_args = 0
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #4
str r0, [fp, #-16]
ldmea fp, {fp, sp, pc}
.size FPsave, .-FPsave
/*
* void FPrestore(void*);
*/
.align 2
.global FPrestore
.type FPrestore, %function
FPrestore:
@ args = 0, pretend = 0, frame = 4
@ frame_needed = 1, uses_anonymous_args = 0
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #4
str r0, [fp, #-16]
ldmea fp, {fp, sp, pc}
.size FPrestore, .-FPrestore
/*
* ulong _tas(ulong*);
*/
.align 2
.global _tas
.type _tas, %function
_tas:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
@ lr needed for prologue
mov r3, #1
swp r0, r3, [r0]
mov pc, lr
.size _tas, .-_tas