Annotation of lucent/sys/src/9/gnot/f002509, revision 1.1.1.1

1.1       root        1: #include       "u.h"
                      2: #include       "../port/lib.h"
                      3: #include       "mem.h"
                      4: #include       "dat.h"
                      5: #include       "fns.h"
                      6: #include       "ureg.h"
                      7: #include       "../port/error.h"
                      8: 
                      9: #define        FORMAT(ur)      ((((ur)->vo)>>12)&0xF)
                     10: #define        OFFSET(ur)      (((ur)->vo)&0xFFF)
                     11: 
                     12: 
                     13: struct FFrame
                     14: {
                     15:        ushort  ireg0;                  /* internal register */
                     16:        ushort  ssw;                    /* special status word */
                     17:        ushort  ipsc;                   /* instr. pipe stage c */
                     18:        ushort  ipsb;                   /* instr. pipe stage b */
                     19:        ulong   addr;                   /* data cycle fault address */
                     20:        ushort  ireg1;                  /* internal register */
                     21:        ushort  ireg2;                  /* internal register */
                     22:        ulong   dob;                    /* data output buffer */
                     23:        ushort  ireg3[4];               /* more stuff */
                     24:        ulong   baddr;                  /* stage b address */
                     25:        ushort  ireg4[26];              /* more more stuff */
                     26: };
                     27: 
                     28: /*
                     29:  * SSW bits
                     30:  */
                     31: #define        RW      0x0040          /* read/write for data cycle */
                     32: #define        FC      0x8000          /* fault on stage C of instruction pipe */
                     33: #define        FB      0x4000          /* fault on stage B of instruction pipe */
                     34: #define        RC      0x2000          /* rerun flag for stage C of instruction pipe */
                     35: #define        RB      0x1000          /* rerun flag for stage B of instruction pipe */
                     36: #define        DF      0x0100          /* fault/rerun flag for data cycle */
                     37: #define        RM      0x0080          /* read-modify-write on data cycle */
                     38: #define        READ    0x0040
                     39: #define        WRITE   0x0000
                     40: #define        SIZ     0x0030          /* size code for data cycle */
                     41: #define        FC2     0x0004          /* address space for data cycle */
                     42: #define        FC1     0x0002
                     43: #define        FC0     0x0001
                     44: 
                     45: void
                     46: fault68020(Ureg *ur, FFrame *f)
                     47: {
                     48:        ulong addr, badvaddr;
                     49:        int user, read, insyscall;
                     50:        char buf[ERRLEN];
                     51: 
                     52:        if(u == 0){
                     53:                dumpregs(ur);
                     54:                panic("fault u==0 pc=%lux", ur->pc);
                     55:        }
                     56:        insyscall = u->p->insyscall;
                     57:        u->p->insyscall = 1;
                     58:        addr = 0;       /* set */
                     59:        if(f->ssw & DF)
                     60:                addr = f->addr;
                     61:        else if(FORMAT(ur) == 0xA){
                     62:                if(f->ssw & FC)
                     63:                        addr = ur->pc+2;
                     64:                else if(f->ssw & FB)
                     65:                        addr = ur->pc+4;
                     66:                else
                     67:                        panic("prefetch pagefault");
                     68:        }else if(FORMAT(ur) == 0xB){
                     69:                if(f->ssw & FC)
                     70:                        addr = f->baddr-2;
                     71:                else if(f->ssw & FB)
                     72:                        addr = f->baddr;
                     73:                else
                     74:                        panic("prefetch pagefault");
                     75:        }else
                     76:                panic("prefetch format");
                     77: 
                     78:        addr &= VAMASK;
                     79:        badvaddr = addr;
                     80:        addr &= ~(BY2PG-1);
                     81:        user = !(ur->sr&SUPER);
                     82:        if(user)
                     83:                u->dbgreg = ur;
                     84: 
                     85:        if(f->ssw & DF)
                     86:                read = (f->ssw&READ) && !(f->ssw&RM);
                     87:        else
                     88:                read = f->ssw&(FB|FC);
                     89: 
                     90: /* print("fault pc=%lux addr=%lux read %d\n", ur->pc, badvaddr, read); /**/
                     91: 
                     92:        if(fault(addr, read) < 0){
                     93:                if(user){
                     94:                        sprint(buf, "sys: trap: fault %s addr=0x%lux",
                     95:                                read? "read" : "write", badvaddr);
                     96:                        postnote(u->p, 1, buf, NDebug);
                     97:                        notify(ur);
                     98:                        return;
                     99:                }
                    100:                dumpregs(ur);
                    101:                panic("fault: 0x%lux", badvaddr);
                    102:        }
                    103:        u->p->insyscall = insyscall;
                    104: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.