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 ra $31
13
14 /* We intentionally don't take advantage of delay slots because
15    the compiler removes them anyway */
16
17 .set noreorder;
18
19 #define SYSCALL(name) SYSCALL2(name,SYS_##name)
20 #define SYSCALL2(name,number)  \
21     .section .text.name,"ax",@progbits; \
22     .align 2;       \
23     .globl name;    \
24     .ent name;      \
25 name:               \
26     li v0, number;  \
27     syscall;        \
28     j ra;           \
29     nop;            \
30     .end name;
31
32 #define SYSCALL_R(name) SYSCALL_R2(_##name##_r,SYS_##name)
33 #define SYSCALL_R2(name,number) \
34     .section .text.name,"ax",@progbits; \
35     .align 2;                  \
36     .globl name;               \
37     .ent name;                 \
38 name:                          \
39     li v0, number;             \
40     move t0, a0;               \
41     move a0, a1;               \
42     move a1, a2;               \
43     move a2, a3;               \
44     syscall;                   \
45     addu t1,v0,255;            \
46     sltu t1,t1,255;            \
47     bne t1,zero,$L##name##_errno;\
48     nop;                       \
49     j ra;                      \
50     nop;                       \
51 $L##name##_errno:              \
52     move a0, t0;               \
53     move a1, v0;               \
54     j _syscall_set_errno;      \
55     nop;                       \
56     .end name;
57
58
59     .align   2
60     .globl   _call_helper
61     .ent     _call_helper
62 _call_helper:
63     subu $sp,$sp,32
64     
65     /* addr */
66     move $2,$4
67     
68     /* args 1-4 */
69     move $4,$5 
70     move $5,$6
71     move $6,$7
72     move $7,$16
73     
74     /* args 5 and 6 */
75     sw $17,16($sp)
76     sw $18,20($sp)
77     
78     /* call the func */
79     jal $31,$2
80     nop
81     
82     move $3,$2
83     li $2,SYS_pause
84     syscall
85     
86     /* shouldn't get here */
87     li $2,SYS_exit
88     li $3,1
89     syscall
90     
91     .end _call_helper
92
93 SYSCALL2(_exit,SYS_exit)
94 SYSCALL2(_pause,SYS_pause)
95 SYSCALL_R(open)
96 SYSCALL_R(close)
97 SYSCALL_R(read)
98 SYSCALL_R(write)
99 SYSCALL_R(sbrk)
100 SYSCALL_R(fstat)
101 SYSCALL_R(lseek)
102 SYSCALL_R(kill)
103 SYSCALL_R(getpid)
104 SYSCALL2(_call_java,SYS_calljava)
105 SYSCALL_R(stat)
106 SYSCALL_R(gettimeofday)
107 SYSCALL(sleep)
108 SYSCALL_R(times)
109 SYSCALL_R(mkdir)
110 SYSCALL(getpagesize)
111 SYSCALL_R(unlink)
112 SYSCALL_R(utime)
113 SYSCALL_R(chdir)
114 SYSCALL_R(pipe)
115 SYSCALL_R(dup2)
116 SYSCALL_R(fork)
117 SYSCALL_R(waitpid)
118 SYSCALL_R2(__getcwd_r,SYS_getcwd)
119 SYSCALL_R2(__execve_r,SYS_exec)
120 SYSCALL_R(fcntl)
121 SYSCALL_R(rmdir)
122 SYSCALL_R(sysconf)
123 SYSCALL_R(readlink)
124 SYSCALL_R(lstat)
125 SYSCALL_R(symlink)
126 SYSCALL_R(link)
127 SYSCALL_R(getdents)
128 /*SYSCALL(memcpy)                         */
129 /*SYSCALL(memset)                        */
130 SYSCALL_R(dup)
131 SYSCALL_R(vfork)
132 SYSCALL_R(chroot)
133 SYSCALL_R(mknod)
134 SYSCALL_R(lchown)
135 SYSCALL_R(ftruncate)
136 SYSCALL_R(usleep)
137 SYSCALL(getppid)
138 SYSCALL_R(mkfifo)
139 SYSCALL_R2(__open_socket_r,SYS_opensocket)
140 SYSCALL_R2(__listen_socket_r,SYS_listensocket)
141 SYSCALL_R2(__accept_r,SYS_accept)