|
|
1.1 ! root 1: # ! 2: # primitives to stop the machine ! 3: # with and without rebooting ! 4: # big vax version ! 5: # ! 6: # subtleties: ! 7: # the crash dump is written after a `warm restart', ! 8: # so it will happen if the system mysteriously halts. ! 9: # but registers must be saved before the restart, ! 10: # as restarts often destroy the registers. ! 11: # but they must be saved after the restart too if ! 12: # the system just halted. ! 13: # hence some of the tangle below. ! 14: # ! 15: # the flow: ! 16: # if we are supposed to reboot: ! 17: # save the registers ! 18: # cause a warm restart ! 19: # when we restart: ! 20: # if this wasn't a power failure, ! 21: # save registers if not already saved, ! 22: # write a crash dump, ! 23: # reboot. ! 24: # ! 25: .text ! 26: ! 27: # ! 28: # reboot restarts the machine, if possible ! 29: # we ask for an auto-restart ! 30: # which will take a crash dump and then boot ! 31: # ! 32: # if the argument is nonzero, and it seems safe, call update first ! 33: # ! 34: ! 35: .globl _reboot ! 36: _reboot: .word 0x0 ! 37: mfpr $IPL,rebipl # merely for debugging ! 38: tstl 4(ap) ! 39: beql 1f # don't want to sync ! 40: movpsl r0 ! 41: bbs $PSLB_IS,r0,1f # or on interrupt stack, so shouldn't ! 42: mtpr $0,$IPL ! 43: calls $0,_update ! 44: mull3 $1000000,_delayfact,r0 # about 1 sec delay to let update finish ! 45: 0: sobgtr r0,0b ! 46: 1: mtpr $HIGH,$IPL # from here on, no interruptions! ! 47: bbss $0,gotregs,1f ! 48: movl sp,rebsp # save current stack ! 49: moval rebsp,sp # get ptr to register save place ! 50: pushr $0x3fff # save the registers there ! 51: movl rebsp,sp # and get the real stack back ! 52: mfpr $PCBB,rebpcb ! 53: 1: ! 54: mtpr $0,$MAPEN # else comet can't find rpb! ! 55: halt # whereupon we shall restart ! 56: ! 57: # ! 58: # place to call on auto-restart, ! 59: # from the restart parameter block ! 60: # ! 61: ! 62: .globl restart ! 63: .align 2 ! 64: restart: ! 65: bbss $0,_rpb+12,0f # console should do this, but doesn't ! 66: 0: ! 67: # cmpl $PFMAGIC,pfmagic # power fail? ! 68: # bneq doadump # no ! 69: # clrl _rpb+12 # yes: flag further restarts ok ! 70: # jmp Xpowrec # and do power recovery ! 71: # ! 72: # here if started at 0x10 -> dump core ! 73: # ! 74: .globl doadump ! 75: doadump: ! 76: mtpr $HIGH,$IPL # from here on, no interruptions! ! 77: bbss $0,gotregs,1f ! 78: movl sp,rebsp # save current stack ! 79: moval rebsp,sp # get ptr to register save place ! 80: pushr $0x3fff # save the registers there ! 81: movl rebsp,sp # and get the real stack back ! 82: mfpr $PCBB,rebpcb ! 83: mfpr $MAPEN,rebmapen ! 84: 1: ! 85: mtpr $0,$MAPEN # turn off memory management ! 86: movab dumpstack,sp # set up a clean stack ! 87: pushab dumping ! 88: calls $1,_printf ! 89: movl _time,dumptime ! 90: movl _dumpsize,dumplen ! 91: cmpl dumplen,_physmem ! 92: bleq 1f ! 93: movl _physmem,dumplen ! 94: 1: movl $DUMPMAGIC,dumpmagic ! 95: pushl _dumpsize ! 96: pushl _dumplow ! 97: pushl _dumpunit ! 98: calls $3,*_dumprout ! 99: tstl r0 ! 100: beql 2f ! 101: pushab dumpfailed ! 102: calls $1,_printf ! 103: 2: ! 104: clrl r5 # boot flags; magic: r5 undisturbed in setboot ! 105: calls $0,_setboot ! 106: halt ! 107: ! 108: dumping: .asciz "dumping core\n" ! 109: dumpfailed: .asciz "failed\n"; ! 110: ! 111: .data ! 112: .align 2 ! 113: .globl dumpstack ! 114: .globl rebregs ! 115: .globl rebsp ! 116: .globl rebpcb ! 117: .space 128*4 # separate stack for dumps ! 118: dumpstack: ! 119: .space 4 ! 120: rebregs: ! 121: .space 14*4 # place to store registers from crash ! 122: rebsp: .space 4 ! 123: rebpcb: .space 4 # place for pcbb at crash ! 124: rebipl: .space 4 # ipl at reboot ! 125: rebmapen: .space 4 # mapen at reboot ! 126: gotregs: .space 4
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.