]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/bcm64/trap.c
bcm64: handle 8GB of physical memory for raspberry pi4
[plan9front.git] / sys / src / 9 / bcm64 / trap.c
index 936a3de11fcd1e3e9508d3ea23b1513ed3cc7caa..3c683765b4bbd10b55f3ed0123f1db9a1f872bd7 100644 (file)
@@ -10,6 +10,8 @@
 #include "ureg.h"
 #include "sysreg.h"
 
+int    (*buserror)(Ureg*);
+
 /* SPSR bits user can modify */
 #define USPSRMASK      (0xFULL<<28)
 
@@ -141,6 +143,8 @@ trap(Ureg *ureg)
                }
                if(intr == 3){
        case 0x2F:      // SError interrupt
+                       if(buserror != nil && (*buserror)(ureg))
+                               break;
                        dumpregs(ureg);
                        panic("SError interrupt");
                        break;
@@ -442,13 +446,22 @@ faultarm64(Ureg *ureg)
        insyscall = up->insyscall;
        up->insyscall = 1;
 
-       if(!userureg(ureg) && waserror()){
-               if(up->nerrlab == 0){
-                       pprint("suicide: sys: %s\n", up->errstr);
-                       pexit(up->errstr, 1);
+       if(!userureg(ureg)){
+               extern void _peekinst(void);
+
+               if(ureg->pc == (uintptr)_peekinst){
+                       ureg->pc = ureg->link;
+                       goto out;
+               }
+
+               if(waserror()){
+                       if(up->nerrlab == 0){
+                               pprint("suicide: sys: %s\n", up->errstr);
+                               pexit(up->errstr, 1);
+                       }
+                       up->insyscall = insyscall;
+                       nexterror();
                }
-               up->insyscall = insyscall;
-               nexterror();
        }
 
        addr = getfar();
@@ -459,7 +472,7 @@ faultarm64(Ureg *ureg)
        case  8: case  9: case 10: case 11:     // Access flag fault.
        case 12: case 13: case 14: case 15:     // Permission fault.
        case 48:                                // tlb conflict fault.
-               if(fault(addr, read) == 0)
+               if(fault(addr, ureg->pc, read) == 0)
                        break;
 
                /* wet floor */
@@ -486,6 +499,7 @@ faultarm64(Ureg *ureg)
        if(!userureg(ureg))
                poperror();
 
+out:
        up->insyscall = insyscall;
 }
 
@@ -614,9 +628,6 @@ forkchild(Proc *p, Ureg *ureg)
        cureg = (Ureg*) (p->sched.sp + 16);
        memmove(cureg, ureg, sizeof(Ureg));
        cureg->r0 = 0;
-
-       p->psstate = 0;
-       p->insyscall = 0;
 }
 
 uintptr