#include #include #include #include "dat.h" #include "fns.h" int nflag, pflag, bflag; Ref nproc; void dump(void) { int i; for(i = 0; i < 16; i++) { print("R%2d %.8ux", i, P->R[i]); if((i % 4) == 3) print("\n"); else print("\t"); } } static void adjustns(void) { if(bind("/arm/bin", "/bin", MREPL) < 0) sysfatal("bind: %r"); if(bind("/rc/bin", "/bin", MAFTER) < 0) sysfatal("bind: %r"); putenv("cputype", "arm"); putenv("objtype", "arm"); } void cleanup(void) { if(P == nil) return; remproc(P); decref(&nproc); freesegs(); fddecref(P->fd); if(P->path != nil && decref(P->path) == 0) free(P->path); free(P); } static void usage(void) { fprint(2, "usage: 5e [-npb] text [...]\n"); exits(nil); } void suicide(char *fmt, ...) { va_list va; char buf[1024]; va_start(va, fmt); vsnprint(buf, sizeof(buf), fmt, va); va_end(va); fprint(2, "%s\n", buf); if(!bflag) exits(buf); abort(); } void main(int argc, char **argv) { ARGBEGIN { case 'n': nflag++; break; case 'p': pflag++; break; case 'b': bflag++; break; default: usage(); } ARGEND; if(argc < 1) usage(); if(_nprivates < 1) sysfatal("we don't have privates"); if(rfork(RFREND | RFNAMEG | RFENVG) < 0) sysfatal("rfork: %r"); atexit(cleanup); if(nflag) adjustns(); if(pflag) initfs("armproc", "/proc"); initproc(); if(loadtext(argv[0], argc, argv) < 0) sysfatal("%r"); for(;;) { if(ultraverbose) dump(); step(); } }