X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2Fsupport.s;h=2783a2f67275cf8d3eae600aa7913fd8cd096a1e;hp=0cd7e7468242c62484c578e2a4c39bf8347e86a9;hb=ef4e1472f67e497b3771916f795915599e9a4c29;hpb=1268f617007d777c492c9a04326eabe53caed5e2 diff --git a/src/org/ibex/nestedvm/support.s b/src/org/ibex/nestedvm/support.s index 0cd7e74..2783a2f 100644 --- a/src/org/ibex/nestedvm/support.s +++ b/src/org/ibex/nestedvm/support.s @@ -9,6 +9,9 @@ #define a3 $7 #define t0 $8 #define t1 $9 +#define t2 $10 +#define t3 $11 +#define sp $29 #define ra $31 /* We intentionally don't take advantage of delay slots because @@ -30,26 +33,42 @@ name: \ .end name; #define SYSCALL_R(name) SYSCALL_R2(_##name##_r,SYS_##name) +#define SYSCALL_R_LONG(name) SYSCALL_R2_LONG(_##name##_r,SYS_##name) + #define SYSCALL_R2(name,number) \ + SYSCALL_R2_BEG(name,number) \ + SYSCALL_R2_END(name) + + +#define SYSCALL_R2_LONG(name,number) \ + SYSCALL_R2_BEG(name,number) \ + lw a3,16(sp); \ + lw t0,20(sp); \ + lw t1,24(sp); \ + SYSCALL_R2_END(name) + +#define SYSCALL_R2_BEG(name,number) \ .section .text.name,"ax",@progbits; \ .align 2; \ .globl name; \ .ent name; \ name: \ li v0, number; \ - move t0, a0; \ + move t2, a0; \ move a0, a1; \ move a1, a2; \ move a2, a3; \ + +#define SYSCALL_R2_END(name) \ syscall; \ - addu t1,v0,255; \ - sltu t1,t1,255; \ - bne t1,zero,$L##name##_errno;\ + addu t3,v0,255; \ + sltu t3,t3,255; \ + bne t3,zero,$L##name##_errno;\ nop; \ j ra; \ nop; \ $L##name##_errno: \ - move a0, t0; \ + move a0, t2; \ move a1, v0; \ j _syscall_set_errno; \ nop; \ @@ -60,7 +79,7 @@ $L##name##_errno: \ .globl _call_helper .ent _call_helper _call_helper: - subu $sp,$sp,32 + subu sp,sp,32 /* addr */ move $2,$4 @@ -72,8 +91,8 @@ _call_helper: move $7,$16 /* args 5 and 6 */ - sw $17,16($sp) - sw $18,20($sp) + sw $17,16(sp) + sw $18,20(sp) /* call the func */ jal $31,$2 @@ -124,9 +143,9 @@ SYSCALL_R(readlink) SYSCALL_R(lstat) SYSCALL_R(symlink) SYSCALL_R(link) -SYSCALL_R(getdents) -/*SYSCALL(memcpy) */ -/*SYSCALL(memset) */ +SYSCALL_R_LONG(getdents) +SYSCALL(memcpy) +SYSCALL(memset) SYSCALL_R(dup) SYSCALL_R(vfork) SYSCALL_R(chroot) @@ -136,6 +155,17 @@ SYSCALL_R(ftruncate) SYSCALL_R(usleep) SYSCALL(getppid) SYSCALL_R(mkfifo) -SYSCALL_R2(__open_socket_r,SYS_opensocket) -SYSCALL_R2(__listen_socket_r,SYS_listensocket) -SYSCALL_R2(__accept_r,SYS_accept) +SYSCALL_R(klogctl) +SYSCALL_R(realpath) +SYSCALL_R2_LONG(__sysctl_r,SYS_sysctl) +SYSCALL_R(getpriority) +SYSCALL_R(setpriority) +SYSCALL_R(socket) +SYSCALL_R(connect) +SYSCALL_R2(__resolve_hostname_r,SYS_resolve_hostname) +SYSCALL_R(accept) +SYSCALL_R_LONG(setsockopt) +SYSCALL_R_LONG(getsockopt) +SYSCALL_R(listen) +SYSCALL_R(bind) +SYSCALL_R(shutdown)