V10/sys/ml/bootcomet.s
#
# primitives to stop the machine
# with and without rebooting
# comet (750) version
#
#
# death stops the machine cold, without rebooting
# we're not allowed to halt because it's hard to guarantee
# that we'll really halt, and not reboot or restart
#
.globl _death
_death: .word 0x0
mtpr $HIGH,$IPL
pushab deathmsg
calls $1,_printf
dl: brb dl
deathmsg:
.asciz "death\n\n"
#
# reboot restarts the machine, if possible
# we ask for an auto-restart
# which will take a crash dump and then boot
# registers saved here because comet may spoil them otherwise
#
.globl _reboot
_reboot: .word 0x0
clrl r0
rb0: aobleq $1000000,r0,rb0 # about 1 sec delay, to let disk finish
mtpr $HIGH,$IPL # from here on, no interruptions!
movl sp,rebsp # save current stack
moval rebsp,sp # get ptr to register save place
pushr $0x3fff # save the registers there
movl rebsp,sp # and get the real stack back
mfpr $PCBB,rebpcb
jbr doadump
.data
.globl rebregs
.globl rebsp
.globl rebpcb
rebregs:
.space 14*4 # place to store registers from crash
rebsp: .space 4
rebpcb: .space 4 # place for pcbb at crash
.text
#
# place to call on auto-restart,
# from the restart parameter block
#
.globl restart
.align 2
restart:
bbss $0,_rpb+12,0f # console should do this, but doesn't
0:
# cmpl $PFMAGIC,pfmagic # power fail?
# bneq doadump # no
# clrl _rpb+12 # yes: flag further restarts ok
# jmp Xpowrec # and do power recovery
#
# not a power fail
# take a crash dump and reboot
# registers have already been saved (above)
#
# crash dump routine is called as
# dump(dev, low, size)
#
.globl doadump
doadump:
mtpr $HIGH,$IPL # no interrupts
mtpr $0,$MAPEN # turn off memory management
movab dumpstack,sp # set up a clean stack
pushab dumping
calls $1,_printf
# pushl _dumpsize
# pushl _dumplow
# pushl _dumpdev
# calls $3,*_dumprout
clrl r5 # boot flags; magic: r5 undisturbed in setboot
calls $0,_setboot
halt
dumping: .asciz "dumping core\n"
.data
.align 2
.globl dumpstack
.space 58*4 # separate stack for dumps
dumpstack:
.space 4