Annotation of xinu/sys/panic.s, revision 1.1.1.1

1.1       root        1: /* panic.s - panic, panic0, _panic, panvec0, panvec1, panvec2, panvec3, 
                      2:             panvec4, panvec5, panvec6, panvec7, panvec8, panvec9, panvec10,
                      3:             panvec11, panvec12, panvec13, panvec14, panvec15           */
                      4: 
                      5: #include <procreg.h>
                      6: #include <conf.h>
                      7: 
                      8: #define        REGMASK 0x3fff                  /* mask for pushr reg13-reg0    */
                      9: #define        STKPRNT 12                      /* # of stack items to print    */
                     10: #define        PSLDISAB 0x001f0000             /* disable saved psl interrupts */
                     11: 
                     12: /*------------------------------------------------------------------------
                     13:  *  panic0 -- entry point for "branch to zero" error; never called
                     14:  *------------------------------------------------------------------------
                     15: */
                     16:        .text
                     17:        .align  2                       /* align on longword            */
                     18:        .globl  panic0
                     19: panic0:
                     20:                                        /* no entry mask -- not called  */
                     21:        movpsl  kernstk-4               /* push psl for message print   */
                     22:        mtpr    $DISABLE, $IPL          /* disable interrupts           */
                     23:        movl    sp, kernstk             /* save old sp for message      */
                     24:        movl    $kernstk-4, sp          /* use kernel stack for printing*/
                     25:        pushl   _currpid                /* print process id             */
                     26:        pushal  panmsg1                 /* message address              */
                     27:        calls   $4, _kprintf            /* print message                */
                     28:        jmp     __halt                  /* halt cpu                     */
                     29: 
                     30: /*-------------------------------------------------------------------------
                     31:  *  panvec0 -- execute panic -- machine check (probably bus error)
                     32:  *            must be taken on interrupt stack (low bit of vector == 1)
                     33:  *             number of bytes of parameters is topmost on stack
                     34:  *             interrupts are (supposed to be) disabled by hardware
                     35:  *-------------------------------------------------------------------------
                     36: */
                     37:        .align  2                       /* align on longword bdry       */
                     38:        .globl  panvec0
                     39: panvec0:                               /* (now on interrupt stack)     */
                     40:        mtpr    $DISABLE, $IPL          /* disable, just in case        */
                     41:                                        /* clear history of machine chk */
                     42: #if    defined(VAX780) || defined(VAX785)
                     43:                mtpr    $SBIFSCLR, $SBIFS/* clr SBI's machchk history   */
                     44: #endif VAX78X
                     45: 
                     46: #if    defined(UVAX) || defined(VAX725) || defined(VAX730) \
                     47:        || defined(VAX750)
                     48:                mtpr    $MCESRCLR, $MCESR/* clear mach chk history reg. */
                     49: #endif UVAXX || VAX7X0
                     50: 
                     51: #if    defined(VAX8600)
                     52:                mtpr    $0, $EHSR       /* clear error handler stat. reg*/
                     53: #endif VAX8600
                     54: 
                     55:        addl2   (sp)+, sp               /* pop error parameters         */
                     56:        pushl   r0                      /* save old r0 value            */
                     57:        mfpr    $KSP, r0                /* r0 = old kernel stk ptr      */
                     58:        movl    8(sp), -(r0)            /* psl from int stk on kern stk */
                     59:        movl    4(sp), -(r0)            /* pc from int stk on kern stk  */
                     60:        mtpr    r0, $KSP                /* revised kernel stack pointer */
                     61:        movl    (sp)+, r0               /* restore old r0 value         */
                     62:        bisl2   $PSLDISAB, 4(sp)        /* disable psl interrupts       */
                     63:        moval   vec0cont, (sp)          /* get back on kernel stk,      */
                     64:        rei                             /* continue at vec0cont         */
                     65: vec0cont:                              /* stack dump can now be        */
                     66:        pushal  pmsg0                   /* meaningful                   */
                     67:        mtpr    $intstk, $ISP           /* reset interrupt stack        */
                     68:        jbr     panic
                     69: 
                     70: /*------------------------------------------------------------------------
                     71:  *  panvec1 -- execute panic -- kernel stack not valid
                     72:  *             must be taken on interrupt stack (low bit of vector == 1)
                     73:  *             interrupts are (supposed to be) disabled by hardware
                     74:  *------------------------------------------------------------------------
                     75: */
                     76:        .align  2
                     77:        .globl  panvec1
                     78: panvec1:                               /* (now on interrupt stack)     */
                     79:        mtpr    $DISABLE, $IPL          /* disable interrupts (safety)  */
                     80:        mfpr    $KSP, -(sp)             /* push args to kprintf--old sp */
                     81:        pushr   $REGMASK                /*      r13-r0                  */
                     82:        pushl   64(sp)                  /*      old psl                 */
                     83:        pushl   60(sp)                  /*      old pc                  */
                     84:        pushl   _currpid                /*      process id              */
                     85:        pushal  pmsg1                   /*      exception type message  */
                     86:        pushal  panmsg2                 /*      format string           */
                     87:        calls   $20, _kprintf           /* print reg dump               */
                     88:        pushal  panmsg4                 /* no stack dump                */
                     89:        calls   $1, _kprintf
                     90:        jmp     __halt                  /* halt cpu                     */
                     91: 
                     92: /*------------------------------------------------------------------------
                     93:  *  panvec2 -- execute panic -- power fail
                     94:  *------------------------------------------------------------------------
                     95: */
                     96:        .align  2
                     97:        .globl  panvec2
                     98: panvec2:
                     99:        mtpr    $DISABLE, $IPL          /* disable interrupts   */
                    100:        pushal  pmsg2
                    101:        jbr     panic
                    102: 
                    103: /*-------------------------------------------------------------------------
                    104:  *  panvec3 -- execute panic -- reserved/privileged instruction
                    105:  *-------------------------------------------------------------------------
                    106: */
                    107:        .align  2
                    108:        .globl  panvec3
                    109: panvec3:
                    110:        mtpr    $DISABLE, $IPL          /* disable interrupts   */
                    111:        pushal  pmsg3
                    112:        jbr     panic
                    113: 
                    114: /*-------------------------------------------------------------------------
                    115:  *  panvec4 -- execute panic -- virtual memory fault
                    116:  *-------------------------------------------------------------------------
                    117: */
                    118:        .align  2
                    119:        .globl  panvec4
                    120: panvec4:
                    121:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    122:        addl2   $8, sp                          /* pop parameters       */
                    123:        pushal  pmsg4
                    124:        jbr     panic
                    125: 
                    126: /*-------------------------------------------------------------------------
                    127:  *  panvec5 -- execute panic -- trace pending
                    128:  *-------------------------------------------------------------------------
                    129: */
                    130:        .align  2
                    131:        .globl  panvec5
                    132: panvec5:
                    133:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    134:        pushal  pmsg5
                    135:        jbr     panic
                    136: 
                    137: /*-------------------------------------------------------------------------
                    138:  *  panvec6 -- execute panic -- breakpoint fault
                    139:  *-------------------------------------------------------------------------
                    140: */
                    141:        .align  2
                    142:        .globl  panvec6
                    143: panvec6:
                    144:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    145:        pushal  pmsg6
                    146:        jbr     panic
                    147: 
                    148: /*-------------------------------------------------------------------------
                    149:  *  panvec7 -- execute panic -- compatibility mode
                    150:  *-------------------------------------------------------------------------
                    151: */
                    152:        .align  2
                    153:        .globl  panvec7
                    154: panvec7:
                    155:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    156:        tstl    (sp)+                           /* pop parameter        */
                    157:        pushal  pmsg7
                    158:        jbr     panic
                    159: 
                    160: /*-----------------------------------------------------------------------
                    161:  *  panvec8 -- execute panic -- arithmetic trap/fault
                    162:  *-----------------------------------------------------------------------
                    163: */
                    164:        .align  2
                    165:        .globl  panvec8
                    166: panvec8:
                    167:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    168:        pushl   r0                              /* save copy of r0      */
                    169:        subl3   $1, 4(sp), r0                   /* get trap type code-1 */
                    170:        movl    arithvec[r0], 4(sp)             /* replace type code w  */
                    171:                                                /* address of trap mesg */
                    172:        movl    (sp)+, r0                       /* pop saved r0         */
                    173:        jbr     panic
                    174: 
                    175: /*----------------------------------------------------------------------
                    176:  *  panvec9 -- execute panic -- unused exception vector
                    177:  *----------------------------------------------------------------------
                    178: */
                    179:        .align  2
                    180:        .globl  panvec9
                    181: panvec9:
                    182:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    183:        pushal  pmsg9
                    184:        jbr     panic
                    185: 
                    186: /*-----------------------------------------------------------------------
                    187:  *  panvec10 -- execute panic -- corrected memory read
                    188:  *-----------------------------------------------------------------------
                    189: */
                    190:        .align  2
                    191:        .globl  panvec10
                    192: panvec10:
                    193:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    194:        pushal  pmsg10
                    195:        jbr     panic
                    196: 
                    197: /*------------------------------------------------------------------------
                    198:  *  panvec11 -- execute panic -- write bus timeout
                    199:  *------------------------------------------------------------------------
                    200: */
                    201:        .align  2
                    202:        .globl  panvec11
                    203: panvec11:
                    204:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    205:        pushal  pmsg11
                    206:        jbr     panic
                    207: 
                    208: /*------------------------------------------------------------------------
                    209:  *  panvec12 -- execute panic -- unknown device
                    210:  *------------------------------------------------------------------------
                    211: */
                    212:        .align  2
                    213:        .globl  panvec12
                    214: panvec12:
                    215:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    216:        pushal  pmsg12
                    217:        jbr     panic
                    218: 
                    219: /*------------------------------------------------------------------------
                    220:  *  panvec13 -- execute panic -- change mode instruction
                    221:  *             must be executed on kernel stack (vector bits 1:0 == 0)
                    222:  *------------------------------------------------------------------------
                    223: */
                    224:        .align  2
                    225:        .globl  panvec13
                    226: panvec13:
                    227:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    228:        tstl    (sp)+                           /* pop parameter        */
                    229:        pushal  pmsg13
                    230:        jbr     panic
                    231: 
                    232: /*------------------------------------------------------------------------
                    233:  *  panvec14 -- execute panic -- reserved or illegal operand
                    234:  *------------------------------------------------------------------------
                    235:  */
                    236:        .align  2
                    237:        .globl  panvec14
                    238: panvec14:
                    239:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    240:        pushal  pmsg14
                    241:        jbr     panic
                    242: 
                    243: /*------------------------------------------------------------------------
                    244:  *  panvec15 -- execute panic -- reserved or illegal addressing mode
                    245:  *------------------------------------------------------------------------
                    246:  */
                    247:        .align  2
                    248:        .globl  panvec15
                    249: panvec15:
                    250:        mtpr    $DISABLE, $IPL                  /* disable interrupts   */
                    251:        pushal  pmsg15
                    252:        jbr     panic
                    253: 
                    254: /*------------------------------------------------------------------------
                    255:  *  _panic  --  entry point when called by user programs
                    256:  *------------------------------------------------------------------------
                    257: */
                    258:        .align  1
                    259:        .globl  _panic
                    260: _panic:                                        /* Note: "_panic" pushes the    */
                    261:                                        /* PC and PS, since it jumps to */
                    262:                                        /* "panic" (the trap entry      */
                    263:                                        /* point, below)                */
                    264:        .word   0x0                     /* save no registers            */
                    265:        movpsl  -(sp)                   /* old PS for trap simulation   */
                    266:        mtpr    $DISABLE, $IPL          /* disable interrupts           */
                    267:        pushl   16(fp)                  /* push ret. address for trap   */
                    268:        pushl   4(ap)                   /* address of users message     */
                    269:        jbr     panic
                    270: 
                    271: /*----------------------------------------------------------------------------
                    272:  *  panic  -- entry point for traps and exceptions only; not called
                    273:  *           contents of stack on call:
                    274:  *           (sp):message address, (sp+4):old pc, (sp+8):old ps
                    275:  *----------------------------------------------------------------------------
                    276: */
                    277:        .align  1
                    278: panic:
                    279:        movl    (sp)+, pansav           /* save message address         */
                    280:        movl    4(sp), kernstk          /* push on kernel stack: old psl*/
                    281:        movl    (sp), kernstk-4         /*      old pc                  */
                    282:        addl3   $8, sp, kernstk-8       /*      old sp(from before trap)*/
                    283:        movl    $kernstk-8, sp          /* switch stack to kernstk      */
                    284:        pushr   $REGMASK                /* save registers r13-r0        */
                    285:        calls   $0, sizmem              /* size up memory (needed later)*/
                    286: 
                    287:        /* set up call to kprintf to print register and stack dump */
                    288:        pushl   kernstk                 /* user's psl                   */
                    289:        pushl   kernstk-4               /* user's pc                    */
                    290:        pushl   _currpid                /* process id                   */
                    291:        pushl   pansav                  /* message address              */
                    292:        pushal  panmsg2                 /* format address               */
                    293:        calls   $5, _kprintf            /* print message, then pop until*/
                    294:                                        /* saved regs on stack top      */
                    295:        /* dump stack as long as sp was valid */
                    296:        movl    kernstk-8, r3           /* r3=user's stk before trap    */
                    297:        tstl    -(sp)                   /* space for arg to kprintf     */
                    298:        moval   panmsg3, -(sp)          /* format arg for kprintf       */
                    299:        movl    $STKPRNT, r4            /* count of stack items to print*/
                    300:        movl    _maxaddr, r5            /* r5 = copy of _maxaddr        */
                    301: panloop:
                    302:        cmpl    r3, r5                  /* avoid references beyond      */
                    303:        jgtru   pandone                 /*  valid memory addresses      */
                    304:        movl    (r3)+, 4(sp)            /* insert value to print as arg */
                    305:        calls   $0, _kprintf            /* print; pop no values         */
                    306:        sobgtr  r4, panloop             /* decr count, print more if >0 */
                    307: pandone:
                    308:        addl2   $8, sp                  /* pop off kprintf args         */
                    309:        popr    $REGMASK                /* pop off registers saved      */
                    310:        subl3   $8, (sp), sp            /* restore user's sp, with psl  */
                    311:                                        /* and pc from trap on top      */
                    312:        jmp     __halt                  /* halt processor               */
                    313:                                        /* user probably won't continue */
                    314:                                        /* pc & psl on top in case      */
                    315:                                        /* of console "C" command       */
                    316:        rei                             /* especially for call to _panic*/
                    317:        .data   1
                    318: pansav:
                    319:        .space  4                       /* save location for messg addr */
                    320: panmsg1:
                    321:        .ascii  "\n\nPanic: branch to location 0:\n"
                    322:        .ascii  "\tpid = (dec) %d\n"
                    323:        .ascii  "\tpsl = (hex) %0x\n"
                    324:        .ascii  "\tsp  = (hex) %0x\n\n\0"
                    325: panmsg2:
                    326:        .ascii  "\n\nPanic: trap type: %s\n"
                    327:        .ascii  "pid = %d\n"
                    328:        .ascii  "State: pc = %x psl = %08x\n"
                    329:        .ascii  "r0  = %8x r1  = %8x r2  = %8x r3  = %8x\n"
                    330:        .ascii  "r4  = %8x r5  = %8x r6  = %8x r7  = %8x\n"
                    331:        .ascii  "r8  = %8x r9  = %8x r10 = %8x r11 = %8x\n"
                    332:        .ascii  "r12 = %8x r13 = %8x\n"
                    333:        .ascii  "Stack: (top at %x)\n\0" 
                    334: panmsg3:
                    335:        .ascii  "%8x\n\0"
                    336: panmsg4:
                    337:        .ascii  "(can't dump stack)\n\0"
                    338: pmsg0:
                    339:        .ascii  "bus error or machine check\0"
                    340: pmsg1:
                    341:        .ascii  "invalid kernel stack pointer\0"
                    342: pmsg2:
                    343:        .ascii  "power fail\0"
                    344: pmsg3:
                    345:        .ascii  "reserved or privileged instruction\0"
                    346: pmsg4:
                    347:        .ascii  "virtual address fault\0" 
                    348: pmsg5:
                    349:        .ascii  "trace pending\0"
                    350: pmsg6:
                    351:        .ascii  "breakpoint instruction\0"
                    352: pmsg7:
                    353:        .ascii  "PDP-11 compatibility mode trap\0"
                    354: pmsg9:
                    355:        .ascii  "unused exception vector\0"
                    356: pmsg10:
                    357:        .ascii  "corrected memory read\0"
                    358: pmsg11:
                    359:        .ascii  "write bus timeout\0"
                    360: pmsg12:
                    361:        .ascii  "unknown device\0"
                    362: pmsg13:
                    363:        .ascii  "CHMx instruction\0"
                    364: pmsg14:
                    365:        .ascii  "reserved or illegal operand\0"
                    366: pmsg15:
                    367:        .ascii  "reserved or illegal addressing mode\0"
                    368: arith1:
                    369:        .ascii  "integer overflow\0"
                    370: arith2:
                    371:        .ascii  "integer divide by 0\0"
                    372: arith3:
                    373:        .ascii  "floating overflow\0"
                    374: arith4:
                    375:        .ascii  "floating/decimal divide by 0\0"
                    376: arith5:
                    377:        .ascii  "floating underflow\0"
                    378: arith6:
                    379:        .ascii  "decimal overflow\0"
                    380: arith7:
                    381:        .ascii  "subscript range\0"
                    382: arith8:
                    383:        .ascii  "floating overflow fault\0"
                    384: arith9:
                    385:        .ascii  "floating divide by 0 fault\0"
                    386: arith10:
                    387:        .ascii  "floating underflow fault\0"
                    388: arithvec:
                    389:        .long   arith1
                    390:        .long   arith2
                    391:        .long   arith3
                    392:        .long   arith4
                    393:        .long   arith5
                    394:        .long   arith6
                    395:        .long   arith7
                    396:        .long   arith8
                    397:        .long   arith9
                    398:        .long   arith10
                    399: 
                    400: /* Stack used by kernel at startup and to handle panic messages.       */
                    401: 
                    402:        .data   1                       /* kernstk & intstk are in      */
                    403:                                        /* initialized data segment     */
                    404:        .align  2                       /* align on fullword boundary   */
                    405:        .globl  kernstk
                    406:        .space  512                     /* decimal bytes in kernel stack*/
                    407: kernstk:
                    408: 
                    409: /* Intstk is used as interrupt stack (temporarily) by processor.       */
                    410: /* It is used during startup and temporarily during context switch,    */
                    411: /* also when processing certain exceptions.                            */
                    412:        .align  2
                    413:        .space  128
                    414:        .globl  intstk
                    415: intstk:
                    416:        .space  4                       /* no overlap of next symbol    */

unix.superglobalmegacorp.com

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