summaryrefslogtreecommitdiff
path: root/emu/Linux/asm-arm.S
blob: 90a337ff5994ef297d6c85b946d6adf8e912761f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
	.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 */
	mov	r0, #0
	mov	r7, #SYS_exit
	swi	0x0
        ldmea   fp, {fp, sp, pc}
        .size   executeonnewstack, .-executeonnewstack

/*
 * void unlockandexit(int *key)
 */

        .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]
	mov	r0, #0
	mov	r7, #SYS_exit
	swi	0x0
        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