X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2Fsupport.s;h=3a50fac9d9fb4ad7915e6ae8e63850417d594028;hb=6d6d9f59a2e6fe3b9e5b3563efcf0124bea4a672;hp=b7781d508df903febced737ca71d0be651129d7f;hpb=c2b2704764af1ade923ba8f15d517b87f9d16189;p=nestedvm.git diff --git a/src/org/ibex/nestedvm/support.s b/src/org/ibex/nestedvm/support.s index b7781d5..3a50fac 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 @@ -29,37 +32,54 @@ name: \ nop; \ .end name; -#define SYSCALL_R(name) \ - .section .text._##name##_r,"ax",@progbits; \ +#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##_r; \ - .ent _##name##_r; \ -_##name##_r: \ - li v0, SYS_##name; \ - move t0, a0; \ + .globl name; \ + .ent name; \ +name: \ + li v0, number; \ + 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; \ - .end _##name##_r; + .end name; .align 2 .globl _call_helper .ent _call_helper _call_helper: - subu $sp,$sp,32 + subu sp,sp,32 /* addr */ move $2,$4 @@ -71,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 @@ -97,7 +117,6 @@ SYSCALL_R(read) SYSCALL_R(write) SYSCALL_R(sbrk) SYSCALL_R(fstat) -SYSCALL(isatty) SYSCALL_R(lseek) SYSCALL_R(kill) SYSCALL_R(getpid) @@ -115,8 +134,64 @@ SYSCALL_R(pipe) SYSCALL_R(dup2) SYSCALL_R(fork) SYSCALL_R(waitpid) -SYSCALL_R(getcwd) -SYSCALL_R(execve) +SYSCALL_R2(__getcwd_r,SYS_getcwd) +SYSCALL_R2(__execve_r,SYS_exec) SYSCALL_R(fcntl) SYSCALL_R(rmdir) SYSCALL_R(sysconf) +SYSCALL_R(readlink) +SYSCALL_R(lstat) +SYSCALL_R(symlink) +SYSCALL_R(link) +SYSCALL_R_LONG(getdents) +SYSCALL(memcpy) +SYSCALL(memset) +SYSCALL_R(dup) +SYSCALL_R(vfork) +SYSCALL_R(chroot) +SYSCALL_R(mknod) +SYSCALL_R(lchown) +SYSCALL_R(ftruncate) +SYSCALL_R(usleep) +SYSCALL(getppid) +SYSCALL_R(mkfifo) +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) +SYSCALL_R_LONG(sendto) +SYSCALL_R_LONG(recvfrom) +SYSCALL_R_LONG(select) +SYSCALL(umask) +SYSCALL(getuid) +SYSCALL(geteuid) +SYSCALL(getgid) +SYSCALL(getegid) +SYSCALL_R(send) +SYSCALL_R(recv) +SYSCALL_R(getsockname) +SYSCALL_R(getpeername) +SYSCALL_R(setuid) +SYSCALL_R(seteuid) +SYSCALL_R(setgid) +SYSCALL_R(setegid) +SYSCALL_R(setgroups) +SYSCALL_R(access) +SYSCALL_R(chown) +SYSCALL_R(fchown) +SYSCALL_R(chmod) +SYSCALL_R(fchmod) +SYSCALL(alarm) +SYSCALL_R(getgroups) +SYSCALL_R(setsid) +SYSCALL_R2(__resolve_ip_r,SYS_resolve_ip)