]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/teg2/syscall.c
devarch: restrict i/o port access to 64K, disallow msr 32-bit wrap arround (thanks...
[plan9front.git] / sys / src / 9 / teg2 / syscall.c
index adaa399620e284decb6c0b07044a67de6cf6955a..be24849b236a73e676b5813178b78665787642cf 100644 (file)
@@ -84,18 +84,15 @@ noted(Ureg* cur, uintptr arg0)
                nf->arg0 = &nf->ureg;
                nf->ip = 0;
                cur->sp = PTR2UINT(nf);
+               cur->r0 = PTR2UINT(nf->arg0);
                break;
        default:
-               pprint("unknown noted arg %#p\n", arg0);
                up->lastnote.flag = NDebug;
                /*FALLTHROUGH*/
        case NDFLT:
-               if(up->lastnote.flag == NDebug){ 
-                       qunlock(&up->debug);
+               qunlock(&up->debug);
+               if(up->lastnote.flag == NDebug)
                        pprint("suicide: %s\n", up->lastnote.msg);
-               }
-               else
-                       qunlock(&up->debug);
                pexit(up->lastnote.msg, up->lastnote.flag != NDebug);
        }
 }
@@ -114,7 +111,7 @@ notify(Ureg* ureg)
        NFrame *nf;
 
        if(up->procctl)
-               procctl(up);
+               procctl();
        if(up->nnote == 0)
                return 0;
 
@@ -133,9 +130,9 @@ notify(Ureg* ureg)
        }
 
        if(n->flag != NUser && (up->notified || up->notify == 0)){
+               qunlock(&up->debug);
                if(n->flag == NDebug)
                        pprint("suicide: %s\n", n->msg);
-               qunlock(&up->debug);
                pexit(n->msg, n->flag != NDebug);
        }
 
@@ -150,8 +147,8 @@ notify(Ureg* ureg)
                pexit(n->msg, n->flag != NDebug);
        }
        if(!okaddr(PTR2UINT(up->notify), 1, 0)){
-               pprint("suicide: notify function address %#p\n", up->notify);
                qunlock(&up->debug);
+               pprint("suicide: notify function address %#p\n", up->notify);
                pexit("Suicide", 0);
        }
 
@@ -173,6 +170,7 @@ notify(Ureg* ureg)
 
        ureg->sp = sp;
        ureg->pc = PTR2UINT(up->notify);
+       ureg->r0 = PTR2UINT(nf->arg0);
 
        up->notified = 1;
        up->nnote--;
@@ -209,8 +207,6 @@ syscall(Ureg* ureg)
 
        scallnr = ureg->r0;
        up->scallnr = scallnr;
-       if(scallnr == RFORK)
-               fpusysrfork(ureg);
        spllo();
        sp = ureg->sp;
 
@@ -227,7 +223,7 @@ syscall(Ureg* ureg)
 
                syscallfmt(scallnr, ureg->pc, (va_list)(sp+BY2WD));
                up->procctl = Proc_stopme;
-               procctl(up);
+               procctl();
                if (up->syscalltrace) 
                        free(up->syscalltrace);
                up->syscalltrace = nil;
@@ -254,7 +250,7 @@ syscall(Ureg* ureg)
 
        /*      iprint("%s: syscall %s\n", up->text, sysctab[scallnr]?sysctab[scallnr]:"huh?"); */
 
-               ret = systab[scallnr](up->s.args);
+               ret = systab[scallnr]((va_list)up->s.args);
                poperror();
        }else{
                /* failure: save the error buffer for errstr */
@@ -280,10 +276,10 @@ syscall(Ureg* ureg)
 
        if(up->procctl == Proc_tracesyscall){
                stopns = todget(nil);
-               up->procctl = Proc_stopme;
                sysretfmt(scallnr, (va_list)(sp+BY2WD), ret, startns, stopns);
                s = splhi();
-               procctl(up);
+               up->procctl = Proc_stopme;
+               procctl();
                splx(s);
                if(up->syscalltrace)
                        free(up->syscalltrace);
@@ -310,8 +306,8 @@ syscall(Ureg* ureg)
        kexit(ureg);
 }
 
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
        ulong *sp;
        Ureg *ureg;
@@ -361,6 +357,4 @@ forkchild(Proc *p, Ureg *ureg)
        /* Things from bottom of syscall which were never executed */
        p->psstate = 0;
        p->insyscall = 0;
-
-       fpusysrforkchild(p, cureg, up);
 }