merge with latest Utah version
[unix-history] / usr / src / sys / hp300 / stand / srt0.c
CommitLineData
a8fd2d0d
KM
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1982, 1990 The Regents of the University of California.
4 * All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department.
9 *
10 * %sccs.include.redist.c%
11 *
33583b53 12 * from: Utah $Hdr: srt0.c 1.15 92/06/18$
a8fd2d0d 13 *
33583b53 14 * @(#)srt0.c 7.6 (Berkeley) %G%
a8fd2d0d
KM
15 */
16
17/*
18 * Startup code for standalone system
19 */
20
21 .globl begin
22 .globl _end
23 .globl _edata
24 .globl _main
25 .globl _configure
47c41e2b 26 .globl _firstopen
a8fd2d0d 27 .globl __rtt
33583b53
MH
28 .globl _bootdev,_howto,_lowram,_machineid
29 .globl _internalhpib
a8fd2d0d
KM
30
31 STACK = 0xfffff000 | below the ROM page
32 BOOTTYPE = 0xfffffdc0
33 LOWRAM = 0xfffffdce
18239460 34 SYSFLAG = 0xfffffed2 | system flags
a8fd2d0d
KM
35 MSUS = 0xfffffedc | MSUS (?) structure
36 VECTORS = 0xfffffee0 | beginning of jump vectors
37 NMIRESET = 0xffffff9c | reset vector
38 BUSERR = 0xfffffffc
39 MAXADDR = 0xfffff000
40 NBPG = 4096
e5c8b742 41 MMUCMD = 0x005f400c | MMU command/status register
a8fd2d0d
KM
42
43 .data
47c41e2b
KB
44_bootdev:
45 .long 0
a8fd2d0d
KM
46_howto:
47 .long 0
47c41e2b 48_lowram:
a8fd2d0d 49 .long 0
e5c8b742
MH
50_machineid:
51 .long 0
a8fd2d0d
KM
52
53 .text
54begin:
55 movl #STACK,sp
56 moveq #47,d0 | # of vectors - 1
57 movl #VECTORS+2,a0 | addr part of first vector
58vecloop:
59 movl #trap,a0@ | make it direct to trap
60 addql #6,a0 | move to next vector addr
61 dbf d0,vecloop | go til done
62 movl #NMIRESET,a0 | NMI keyboard reset addr
63 movl #nmi,a0@ | catch in reset routine
e5c8b742
MH
64/*
65 * Determine our CPU type and look for internal HP-IB
66 * (really only care about detecting 320 (no DIO-II) right now).
67 */
68 lea _machineid,a0
69 movl #0x808,d0
70 movc d0,cacr | clear and disable on-chip cache(s)
71 movl #0x200,d0 | data freeze bit
72 movc d0,cacr | only exists on 68030
73 movc cacr,d0 | read it back
74 tstl d0 | zero?
33583b53 75 jeq not68030 | yes, we have 68020/68040
e5c8b742
MH
76 movl #0x808,d0
77 movc d0,cacr | clear data freeze bit again
33583b53 78
e5c8b742
MH
79 movl #0x80,MMUCMD | set magic cookie
80 movl MMUCMD,d0 | read it back
81 btst #7,d0 | cookie still on?
82 jeq not370 | no, 360 or 375
83 movl #4,a0@ | consider a 370 for now
84 movl #0,MMUCMD | clear magic cookie
85 movl MMUCMD,d0 | read it back
86 btst #7,d0 | still on?
87 jeq ihpibcheck | no, a 370
88 movl #5,a0@ | yes, must be a 340
89 jra ihpibcheck
90not370:
91 movl #3,a0@ | type is at least a 360
92 movl #0,MMUCMD | clear magic cookie2
93 movl MMUCMD,d0 | read it back
94 btst #16,d0 | still on?
95 jeq ihpibcheck | no, a 360
96 movl #6,a0@ | yes, must be a 345/375/400
97 jra ihpibcheck
33583b53
MH
98not68030:
99 bset #31,d0 | data cache enable bit
100 movc d0,cacr | only exists on 68040
101 movc cacr,d0 | read it back
102 tstl d0 | zero?
103 beq is68020 | yes, we have 68020
104 moveq #0,d0 | now turn it back off
105 movec d0,cacr | before we access any data
106 .long 0x4e7b0004 | movc d0,itt0
107 .long 0x4e7b0005 | movc d0,itt1
108 .long 0x4e7b0006 | movc d0,dtt0
109 .long 0x4e7b0007 | movc d0,dtt1
110 movl #7,a0@ | we have a 380
111 jra ihpibcheck
e5c8b742
MH
112is68020:
113 movl #1,a0@ | consider a 330 for now
114 movl #1,MMUCMD | a 68020, write HP MMU location
115 movl MMUCMD,d0 | read it back
116 btst #0,d0 | zero?
117 jeq ihpibcheck | yes, a 330
118 movl #0,a0@ | no, consider a 320 for now
119 movl #0x80,MMUCMD | set magic cookie
120 movl MMUCMD,d0 | read it back
121 btst #7,d0 | cookie still on?
122 jeq ihpibcheck | no, just a 320
123 movl #2,a0@ | yes, a 350
124ihpibcheck:
125 movl #0,MMUCMD | make sure MMU is off
18239460
KM
126 btst #5,SYSFLAG | do we have an internal HP-IB?
127 jeq boottype | yes, continue
128 clrl _internalhpib | no, clear the internal address
e5c8b742 129/*
33583b53 130 * If this is a reboot, extract howto/bootdev stored by kernel
e5c8b742 131 */
18239460 132boottype:
a8fd2d0d
KM
133 cmpw #12,BOOTTYPE | is this a reboot (REQ_REBOOT)?
134 jne notreboot | no, skip
33583b53
MH
135 lea MAXADDR,a0 | find last page
136 movl a0@+,d7 | and extract howto, bootdev
a8fd2d0d
KM
137 movl a0@+,d6 | from where doboot() left them
138 jra boot1
139/*
33583b53
MH
140 * At this point we do not know which logical device the MSUS select
141 * code refers to so we cannot construct bootdev. So we just punt
142 * and let configure() construct it.
a8fd2d0d
KM
143 */
144notreboot:
33583b53 145 moveq #0,d6 | make sure bootdev is invalid
a8fd2d0d
KM
146 cmpw #18,BOOTTYPE | does the user want to interact?
147 jeq askme | yes, go to it
a8fd2d0d
KM
148 moveq #0,d7 | default to RB_AUTOBOOT
149 jra boot1
150askme:
a8fd2d0d
KM
151 moveq #3,d7 | default to RB_SINGLE|RB_ASKNAME
152boot1:
33583b53 153 movl d6,_bootdev | save bootdev and howto
a8fd2d0d
KM
154 movl d7,_howto | globally so all can access
155 movl LOWRAM,d0 | read lowram value from bootrom
156 addl #NBPG,d0 | must preserve this for bootrom to reboot
157 andl #0xfffff000,d0 | round to next page
158 movl d0,_lowram | stash that value
159start:
160 movl #_edata,a2 | start of BSS
161 movl #_end,a3 | end
162clr:
163 clrb a2@+ | clear BSS
164 cmpl a2,a3 | done?
165 bne clr | no, keep going
166 jsr _configure | configure critical devices
47c41e2b 167 movl #1,_firstopen | mark this as the first open
a8fd2d0d
KM
168 jsr _main | lets go
169__rtt:
170 movl #3,_howto | restarts get RB_SINGLE|RB_ASKNAME
171 jmp start
172
173/*
174 * probe a location and see if it causes a bus error
175 */
176 .globl _badaddr
177_badaddr:
178 movl BUSERR,__bsave | save ROM bus error handler address
179 movl sp,__ssave | and current stack pointer
180 movl #catchbad,BUSERR| plug in our handler
181 movl sp@(4),a0 | address to probe
182 movw a0@,d1 | do it
33583b53 183 movl __bsave,BUSERR | if we got here, it did not fault
a8fd2d0d
KM
184 clrl d0 | return that this was not a bad addr
185 rts
186
187catchbad:
188 movl __bsave,BUSERR | got a bus error, so restore old handler
189 movl __ssave,sp | manually restore stack
190 moveq #1,d0 | indicate that we got a fault
191 rts | return to caller of badaddr()
192
193__bsave:
194 .long 0
195__ssave:
196 .long 0
197
198 .globl _trap
199trap:
200 moveml #0xFFFF,sp@- | save registers
201 movl sp,sp@- | push pointer to frame
202 jsr _trap | call C routine to deal with it
33583b53
MH
203 tstl d0
204 jeq Lstop
205 addql #4,sp
206 moveml sp@+,#0x7FFF
207 addql #8,sp
208 rte
209Lstop:
a8fd2d0d
KM
210 stop #0x2700 | stop cold
211
212nmi:
213 movw #18,BOOTTYPE | mark as system switch
214 jsr _kbdnmi | clear the interrupt
215 jra begin | start over
216
217#ifdef ROMPRF
218 .globl _romout
219_romout:
220 movl sp@(4),d0 | line number
221 movl sp@(8),a0 | string
222 jsr 0x150 | do it
223 rts
224#endif