|
|
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.