UNDO: remove memcpy/memset due to double-definition problem
[nestedvm.git] / src / org / ibex / nestedvm / support.s
1 #include "syscalls.h"
2
3 #define zero $0
4 #define v0 $2
5 #define v1 $3
6 #define a0 $4
7 #define a1 $5
8 #define a2 $6
9 #define a3 $7
10 #define t0 $8
11 #define t1 $9
12 #define t2 $10
13 #define t3 $11
14 #define sp $29
15 #define ra $31
16
17 /* We intentionally don't take advantage of delay slots because
18    the compiler removes them anyway */
19
20 .set noreorder;
21
22 #define SYSCALL(name) SYSCALL2(name,SYS_##name)
23 #define SYSCALL2(name,number)  \
24     .section .text.name,"ax",@progbits; \
25     .align 2;       \
26     .globl name;    \
27     .ent name;      \
28 name:               \
29     li v0, number;  \
30     syscall;        \
31     j ra;           \
32     nop;            \
33     .end name;
34
35 #define SYSCALL_R(name) SYSCALL_R2(_##name##_r,SYS_##name)
36 #define SYSCALL_R_LONG(name) SYSCALL_R2_LONG(_##name##_r,SYS_##name)
37
38 #define SYSCALL_R2(name,number) \
39     SYSCALL_R2_BEG(name,number) \
40     SYSCALL_R2_END(name)
41     
42     
43 #define SYSCALL_R2_LONG(name,number)  \
44     SYSCALL_R2_BEG(name,number) \
45     lw a3,16(sp); \
46     lw t0,20(sp); \
47     lw t1,24(sp); \
48     SYSCALL_R2_END(name)
49
50 #define SYSCALL_R2_BEG(name,number) \
51     .section .text.name,"ax",@progbits; \
52     .align 2;                  \
53     .globl name;               \
54     .ent name;                 \
55 name:                          \
56     li v0, number;             \
57     move t2, a0;               \
58     move a0, a1;               \
59     move a1, a2;               \
60     move a2, a3;               \
61     
62 #define SYSCALL_R2_END(name) \
63     syscall;                   \
64     addu t3,v0,255;            \
65     sltu t3,t3,255;            \
66     bne t3,zero,$L##name##_errno;\
67     nop;                       \
68     j ra;                      \
69     nop;                       \
70 $L##name##_errno:              \
71     move a0, t2;               \
72     move a1, v0;               \
73     j _syscall_set_errno;      \
74     nop;                       \
75     .end name;
76
77
78     .align   2
79     .globl   _call_helper
80     .ent     _call_helper
81 _call_helper:
82     subu sp,sp,32
83     
84     /* addr */
85     move $2,$4
86     
87     /* args 1-4 */
88     move $4,$5 
89     move $5,$6
90     move $6,$7
91     move $7,$16
92     
93     /* args 5 and 6 */
94     sw $17,16(sp)
95     sw $18,20(sp)
96     
97     /* call the func */
98     jal $31,$2
99     nop
100     
101     move $3,$2
102     li $2,SYS_pause
103     syscall
104     
105     /* shouldn't get here */
106     li $2,SYS_exit
107     li $3,1
108     syscall
109     
110     .end _call_helper
111
112 SYSCALL2(_exit,SYS_exit)
113 SYSCALL2(_pause,SYS_pause)
114 SYSCALL_R(open)
115 SYSCALL_R(close)
116 SYSCALL_R(read)
117 SYSCALL_R(write)
118 SYSCALL_R(sbrk)
119 SYSCALL_R(fstat)
120 SYSCALL_R(lseek)
121 SYSCALL_R(kill)
122 SYSCALL_R(getpid)
123 SYSCALL2(_call_java,SYS_calljava)
124 SYSCALL_R(stat)
125 SYSCALL_R(gettimeofday)
126 SYSCALL(sleep)
127 SYSCALL_R(times)
128 SYSCALL_R(mkdir)
129 SYSCALL(getpagesize)
130 SYSCALL_R(unlink)
131 SYSCALL_R(utime)
132 SYSCALL_R(chdir)
133 SYSCALL_R(pipe)
134 SYSCALL_R(dup2)
135 SYSCALL_R(fork)
136 SYSCALL_R(waitpid)
137 SYSCALL_R2(__getcwd_r,SYS_getcwd)
138 SYSCALL_R2(__execve_r,SYS_exec)
139 SYSCALL_R(fcntl)
140 SYSCALL_R(rmdir)
141 SYSCALL_R(sysconf)
142 SYSCALL_R(readlink)
143 SYSCALL_R(lstat)
144 SYSCALL_R(symlink)
145 SYSCALL_R(link)
146 SYSCALL_R_LONG(getdents)
147 SYSCALL(memcpy)
148 SYSCALL(memset)
149 SYSCALL_R(dup)
150 SYSCALL_R(vfork)
151 SYSCALL_R(chroot)
152 SYSCALL_R(mknod)
153 SYSCALL_R(lchown)
154 SYSCALL_R(ftruncate)
155 SYSCALL_R(usleep)
156 SYSCALL(getppid)
157 SYSCALL_R(mkfifo)
158 SYSCALL_R(klogctl)
159 SYSCALL_R(realpath)
160 SYSCALL_R2_LONG(__sysctl_r,SYS_sysctl)
161 SYSCALL_R(getpriority)
162 SYSCALL_R(setpriority)
163 SYSCALL_R(socket)
164 SYSCALL_R(connect)
165 SYSCALL_R2(__resolve_hostname_r,SYS_resolve_hostname)
166 SYSCALL_R(accept)
167 SYSCALL_R_LONG(setsockopt)
168 SYSCALL_R_LONG(getsockopt)
169 SYSCALL_R(listen)
170 SYSCALL_R(bind)
171 SYSCALL_R(shutdown)