1. recover correctly from invalid sys call number 2. don't rely on host order for vlong 3. initialise stack with area for Tos so libc will work Reference: /n/sources/patch/applied/5i-various Date: Wed Jul 4 18:13:13 CES 2007 Signed-off-by: forsyth@terzarima.net --- /sys/src/cmd/5i/5i.c Wed Jul 4 18:10:31 2007 +++ /sys/src/cmd/5i/5i.c Wed Jul 4 18:10:29 2007 @@ -4,6 +4,8 @@ #include #include "arm.h" +#include + char* file = "5.out"; int datasize; ulong textbase; @@ -138,12 +140,13 @@ initstk(int argc, char *argv[]) { ulong size; - ulong sp, ap; + ulong sp, ap, tos; int i; char *p; initmap(); - sp = STACKTOP - 4; + tos = STACKTOP - sizeof(Tos)*2; /* we'll assume twice the host's is big enough */ + sp = tos; /* Build exec stack */ size = strlen(file)+1+BY2WD+BY2WD+BY2WD; @@ -151,7 +154,8 @@ size += strlen(argv[i])+BY2WD+1; sp -= size; - sp &= ~3; + sp &= ~7; + reg.r[0] = tos; reg.r[13] = sp; reg.r[1] = STACKTOP-4; /* Plan 9 profiling clock */ --- /sys/src/cmd/5i/arm.h Wed Jul 4 18:10:45 2007 +++ /sys/src/cmd/5i/arm.h Wed Jul 4 18:10:42 2007 @@ -160,6 +160,7 @@ ulong getmem_4(ulong); uchar getmem_b(ulong); ushort getmem_h(ulong); +uvlong getmem_v(ulong); ulong getmem_w(ulong); ulong ifetch(ulong); void inithdr(int); @@ -181,8 +182,8 @@ void procinit(int); void putmem_b(ulong, uchar); void putmem_h(ulong, ushort); +void putmem_v(ulong, uvlong); void putmem_w(ulong, ulong); -void randseed(long, long); void reset(void); void run(void); void segsum(void); --- /sys/src/cmd/5i/mem.c Wed Jul 4 18:11:01 2007 +++ /sys/src/cmd/5i/mem.c Wed Jul 4 18:10:59 2007 @@ -109,6 +109,12 @@ return va[0]; } +uvlong +getmem_v(ulong addr) +{ + return ((uvlong)getmem_w(addr+4) << 32) | getmem_w(addr); +} + void putmem_h(ulong addr, ushort data) { @@ -159,6 +165,13 @@ va[0] = data; if(membpt) brkchk(addr, Write); +} + +void +putmem_v(ulong addr, uvlong data) +{ + putmem_w(addr, data); /* two stages, to catch brkchk */ + putmem_w(addr+4, data>>32); } char * --- /sys/src/cmd/5i/syscall.c Wed Jul 4 18:11:21 2007 +++ /sys/src/cmd/5i/syscall.c Wed Jul 4 18:11:18 2007 @@ -300,14 +300,7 @@ void syspread(void) { - union { - vlong v; - ulong u[2]; - } o; - - o.u[0] = getmem_w(reg.r[13]+16); - o.u[1] = getmem_w(reg.r[13]+20); - sysread(o.v); + sysread(getmem_v(reg.r[13]+16)); } void @@ -316,24 +309,20 @@ int fd; ulong mode; ulong retp; - union { - vlong v; - ulong u[2]; - } o; + vlong v; retp = getmem_w(reg.r[13]+4); fd = getmem_w(reg.r[13]+8); - o.u[0] = getmem_w(reg.r[13]+12); - o.u[1] = getmem_w(reg.r[13]+16); + v = getmem_v(reg.r[13]+16); mode = getmem_w(reg.r[13]+20); if(sysdbg) - itrace("seek(%d, %lld, %d)", fd, o.v, mode); + itrace("seek(%d, %lld, %d)", fd, v, mode); - o.v = seek(fd, o.v, mode); - if(o.v < 0) + v = seek(fd, v, mode); + if(v < 0) errstr(errbuf, sizeof errbuf); - memio((char*)o.u, retp, sizeof(vlong), MemWrite); + putmem_v(retp, v); } void @@ -505,14 +494,7 @@ void syspwrite(void) { - union { - vlong v; - ulong u[2]; - } o; - - o.u[0] = getmem_w(reg.r[13]+16); - o.u[1] = getmem_w(reg.r[13]+20); - syswrite(o.v); + syswrite(getmem_v(reg.r[13]+16)); } void @@ -811,9 +793,11 @@ int call; call = reg.r[REGARG]; - if(call < 0 || call > PWRITE || systab[call] == nil) { - Bprint(bioout, "bad system call\n"); + if(call < 0 || call >= nelem(systab) || systab[call] == nil) { + Bprint(bioout, "bad system call %d (%#ux)\n", call, call); dumpreg(); + Bflush(bioout); + return; } if(trace)