boot.c revision 1.3.12.2 1 1.3.12.2 yamt /* $NetBSD: boot.c,v 1.3.12.2 2006/06/21 14:51:20 yamt Exp $ */
2 1.3.12.2 yamt
3 1.3.12.2 yamt /*-
4 1.3.12.2 yamt * Copyright (c) 2004 The NetBSD Foundation, Inc.
5 1.3.12.2 yamt * All rights reserved.
6 1.3.12.2 yamt *
7 1.3.12.2 yamt * This code is derived from software contributed to The NetBSD Foundation
8 1.3.12.2 yamt * by UCHIYAMA Yasushi.
9 1.3.12.2 yamt *
10 1.3.12.2 yamt * Redistribution and use in source and binary forms, with or without
11 1.3.12.2 yamt * modification, are permitted provided that the following conditions
12 1.3.12.2 yamt * are met:
13 1.3.12.2 yamt * 1. Redistributions of source code must retain the above copyright
14 1.3.12.2 yamt * notice, this list of conditions and the following disclaimer.
15 1.3.12.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
16 1.3.12.2 yamt * notice, this list of conditions and the following disclaimer in the
17 1.3.12.2 yamt * documentation and/or other materials provided with the distribution.
18 1.3.12.2 yamt * 3. All advertising materials mentioning features or use of this software
19 1.3.12.2 yamt * must display the following acknowledgement:
20 1.3.12.2 yamt * This product includes software developed by the NetBSD
21 1.3.12.2 yamt * Foundation, Inc. and its contributors.
22 1.3.12.2 yamt * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.3.12.2 yamt * contributors may be used to endorse or promote products derived
24 1.3.12.2 yamt * from this software without specific prior written permission.
25 1.3.12.2 yamt *
26 1.3.12.2 yamt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.3.12.2 yamt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.3.12.2 yamt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.3.12.2 yamt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.3.12.2 yamt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.3.12.2 yamt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.3.12.2 yamt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.3.12.2 yamt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.3.12.2 yamt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.3.12.2 yamt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.3.12.2 yamt * POSSIBILITY OF SUCH DAMAGE.
37 1.3.12.2 yamt */
38 1.3.12.2 yamt
39 1.3.12.2 yamt #include <lib/libsa/stand.h>
40 1.3.12.2 yamt #include <lib/libkern/libkern.h>
41 1.3.12.2 yamt
42 1.3.12.2 yamt #include "local.h"
43 1.3.12.2 yamt #include "cmd.h"
44 1.3.12.2 yamt #include "common.h"
45 1.3.12.2 yamt
46 1.3.12.2 yamt #include <machine/sbd.h>
47 1.3.12.2 yamt #include <machine/pdinfo.h>
48 1.3.12.2 yamt #include <machine/vtoc.h>
49 1.3.12.2 yamt
50 1.3.12.2 yamt #include "console.h"
51 1.3.12.2 yamt
52 1.3.12.2 yamt
53 1.3.12.2 yamt extern const char bootprog_name[];
54 1.3.12.2 yamt extern const char bootprog_rev[];
55 1.3.12.2 yamt extern const char bootprog_date[];
56 1.3.12.2 yamt extern const char bootprog_maker[];
57 1.3.12.2 yamt
58 1.3.12.2 yamt struct cmd_batch_tab cmd_batch_tab[] = {
59 1.3.12.2 yamt /* func argc argp... */
60 1.3.12.2 yamt #if 0
61 1.3.12.2 yamt { cmd_boot, 1, { "mem:", 0, 0, 0, 0, 0, 0 } },
62 1.3.12.2 yamt { cmd_boot, 1, { "sd0k:netbsd", 0, 0, 0, 0, 0, 0 } },
63 1.3.12.2 yamt { cmd_load_binary, 1, { "0x80001000", 0, 0, 0, 0, 0, 0 } },
64 1.3.12.2 yamt { cmd_jump, 2, { "0x80001000", "0x80001000", 0, 0, 0, 0, 0 } },
65 1.3.12.2 yamt #endif
66 1.3.12.2 yamt { NULL, 0, { 0, 0, 0, 0, 0, 0, 0 } } /* terminate */
67 1.3.12.2 yamt };
68 1.3.12.2 yamt
69 1.3.12.2 yamt struct ipl_args ipl_args;
70 1.3.12.2 yamt struct device_capability DEVICE_CAPABILITY;
71 1.3.12.2 yamt void set_device_capability(void);
72 1.3.12.2 yamt boolean_t guess_boot_kernel(char *, size_t, int);
73 1.3.12.2 yamt extern int kernel_binary_size;
74 1.3.12.2 yamt
75 1.3.12.2 yamt void
76 1.3.12.2 yamt main(int a0, int v0, int v1)
77 1.3.12.2 yamt {
78 1.3.12.2 yamt extern char edata[], end[];
79 1.3.12.2 yamt char boot_kernel[32];
80 1.3.12.2 yamt char *args[CMDARG_MAX];
81 1.3.12.2 yamt int i;
82 1.3.12.2 yamt
83 1.3.12.2 yamt memset(edata, 0, end - edata);
84 1.3.12.2 yamt /* Save args for chain-boot to iopboot */
85 1.3.12.2 yamt ipl_args.a0 = a0;
86 1.3.12.2 yamt ipl_args.v0 = v0;
87 1.3.12.2 yamt ipl_args.v1 = v1;
88 1.3.12.2 yamt
89 1.3.12.2 yamt console_init();
90 1.3.12.2 yamt
91 1.3.12.2 yamt printf("\n");
92 1.3.12.2 yamt printf("%s boot, Revision %s\n", bootprog_name, bootprog_rev);
93 1.3.12.2 yamt printf("(%s, %s)\n", bootprog_date, bootprog_maker);
94 1.3.12.2 yamt
95 1.3.12.2 yamt
96 1.3.12.2 yamt /* Inquire IPL activated device */
97 1.3.12.2 yamt set_device_capability();
98 1.3.12.2 yamt
99 1.3.12.2 yamt if (!guess_boot_kernel(boot_kernel, sizeof boot_kernel, 0))
100 1.3.12.2 yamt goto prompt;
101 1.3.12.2 yamt printf(
102 1.3.12.2 yamt ">> Press return to boot now, any other key for boot console.\n");
103 1.3.12.2 yamt
104 1.3.12.2 yamt for (i = 5000; i >= 0; i--) {
105 1.3.12.2 yamt int c;
106 1.3.12.2 yamt if (i % 1000 == 0)
107 1.3.12.2 yamt printf("booting %s - starting %d\r",
108 1.3.12.2 yamt boot_kernel, i / 1000);
109 1.3.12.2 yamt if ((c = cnscan()) == -1) {
110 1.3.12.2 yamt delay(10);
111 1.3.12.2 yamt continue;
112 1.3.12.2 yamt }
113 1.3.12.2 yamt else if (c == '\r')
114 1.3.12.2 yamt break;
115 1.3.12.2 yamt else
116 1.3.12.2 yamt goto prompt;
117 1.3.12.2 yamt }
118 1.3.12.2 yamt printf("\n[non-interactive mode]\n");
119 1.3.12.2 yamt args[0] = "boot";
120 1.3.12.2 yamt args[1] = boot_kernel;
121 1.3.12.2 yamt cmd_boot(2, args, FALSE);
122 1.3.12.2 yamt prompt:
123 1.3.12.2 yamt
124 1.3.12.2 yamt printf("\ntype \"help\" for help.\n");
125 1.3.12.2 yamt console_cursor(TRUE);
126 1.3.12.2 yamt prompt();
127 1.3.12.2 yamt /* NOTREACHED */
128 1.3.12.2 yamt }
129 1.3.12.2 yamt
130 1.3.12.2 yamt boolean_t
131 1.3.12.2 yamt guess_boot_kernel(char *name, size_t len, int pri)
132 1.3.12.2 yamt {
133 1.3.12.2 yamt extern struct vtoc_sector vtoc;
134 1.3.12.2 yamt struct ux_partition *partition;
135 1.3.12.2 yamt int i, unit;
136 1.3.12.2 yamt
137 1.3.12.2 yamt if (!DEVICE_CAPABILITY.active)
138 1.3.12.2 yamt return FALSE;
139 1.3.12.2 yamt
140 1.3.12.2 yamt unit = DEVICE_CAPABILITY.booted_unit;
141 1.3.12.2 yamt
142 1.3.12.2 yamt switch (DEVICE_CAPABILITY.booted_device) {
143 1.3.12.2 yamt default:
144 1.3.12.2 yamt return FALSE;
145 1.3.12.2 yamt case NVSRAM_BOOTDEV_FLOPPYDISK:
146 1.3.12.2 yamt strncpy(name, "fd:netbsd", len); /* ustarfs */
147 1.3.12.2 yamt return TRUE;
148 1.3.12.2 yamt
149 1.3.12.2 yamt case NVSRAM_BOOTDEV_HARDDISK:
150 1.3.12.2 yamt snprintf(name, len, "sd%d:netbsd", unit); /* ustarfs */
151 1.3.12.2 yamt if (!read_vtoc())
152 1.3.12.2 yamt return TRUE;
153 1.3.12.2 yamt
154 1.3.12.2 yamt partition = vtoc.partition;
155 1.3.12.2 yamt for (i = 0; i < VTOC_MAXPARTITIONS; i++, partition++) {
156 1.3.12.2 yamt if (partition->tag != __VTOC_TAG_BSDFFS)
157 1.3.12.2 yamt continue;
158 1.3.12.2 yamt /* ffs */
159 1.3.12.2 yamt snprintf(name, len, "sd%d%c:netbsd", unit, 'a' + i);
160 1.3.12.2 yamt return TRUE;
161 1.3.12.2 yamt }
162 1.3.12.2 yamt return TRUE;
163 1.3.12.2 yamt
164 1.3.12.2 yamt case NVSRAM_BOOTDEV_CGMT:
165 1.3.12.2 yamt break;
166 1.3.12.2 yamt case NVSRAM_BOOTDEV_NETWORK:
167 1.3.12.2 yamt /*FALLTHROUGH*/
168 1.3.12.2 yamt case NVSRAM_BOOTDEV_NETWORK_T_AND_D:
169 1.3.12.2 yamt if (kernel_binary_size) {
170 1.3.12.2 yamt strncpy(name, "mem:", len); /* datafs */
171 1.3.12.2 yamt return TRUE;
172 1.3.12.2 yamt }
173 1.3.12.2 yamt if (DEVICE_CAPABILITY.network_enabled) {
174 1.3.12.2 yamt strncpy(name, "nfs:netbsd", len); /* nfs */
175 1.3.12.2 yamt return TRUE;
176 1.3.12.2 yamt }
177 1.3.12.2 yamt break;
178 1.3.12.2 yamt }
179 1.3.12.2 yamt
180 1.3.12.2 yamt return FALSE;
181 1.3.12.2 yamt }
182 1.3.12.2 yamt
183 1.3.12.2 yamt int
184 1.3.12.2 yamt cmd_info(int argc, char *argp[], int interactive)
185 1.3.12.2 yamt {
186 1.3.12.2 yamt extern char _ftext[], _etext[], _fdata[], _edata[];
187 1.3.12.2 yamt extern char _fbss[], end[];
188 1.3.12.2 yamt uint32_t m;
189 1.3.12.2 yamt int i, size, total;
190 1.3.12.2 yamt struct sbdinfo *sbd = SBD_INFO;
191 1.3.12.2 yamt
192 1.3.12.2 yamt printf("\n>> %s boot, rev. %s [%s, %s] <<\n", bootprog_name,
193 1.3.12.2 yamt bootprog_rev, bootprog_date, bootprog_maker);
194 1.3.12.2 yamt
195 1.3.12.2 yamt printf("IPL args: 0x%x 0x%x 0x%x\n", ipl_args.a0, ipl_args.v0,
196 1.3.12.2 yamt ipl_args.v1);
197 1.3.12.2 yamt printf("\ttext : %p-%p\n\tdata : %p-%p\n\t"
198 1.3.12.2 yamt "bss : %p-%p\n\tstack: %p\n\theap : %p\n",
199 1.3.12.2 yamt _ftext, _etext, _fdata, _edata,
200 1.3.12.2 yamt _fbss, end, _ftext, end);
201 1.3.12.2 yamt
202 1.3.12.2 yamt m = ipl_args.v1;
203 1.3.12.2 yamt total = 0;
204 1.3.12.2 yamt printf("Memory Area:\n\t");
205 1.3.12.2 yamt for (i = 0; i < 8; i++, m >>= 4) {
206 1.3.12.2 yamt size = m & 0xf ? ((m & 0xf) << 4) : 0;
207 1.3.12.2 yamt total += size;
208 1.3.12.2 yamt if (size)
209 1.3.12.2 yamt printf("M%d=%dMB ", i, size);
210 1.3.12.2 yamt }
211 1.3.12.2 yamt printf(" total %dMB\n", total);
212 1.3.12.2 yamt
213 1.3.12.2 yamt printf("Board Revision:\n");
214 1.3.12.2 yamt printf("\tmachine=0x%x, ", sbd->machine);
215 1.3.12.2 yamt printf("model=0x%x\n", sbd->model);
216 1.3.12.2 yamt printf("\tpmmu=%d, ", sbd->mmu);
217 1.3.12.2 yamt printf("cache=%d, ", sbd->cache);
218 1.3.12.2 yamt printf("panel=%d, ", sbd->panel);
219 1.3.12.2 yamt printf("fdd=%d\n", sbd->fdd);
220 1.3.12.2 yamt printf("\tcpu=%d, fpp=%d, fpa=%d, iop=%d\n",
221 1.3.12.2 yamt sbd->cpu, sbd->fpp, sbd->fpa, sbd->iop);
222 1.3.12.2 yamt printf("\tclock=%d\n", sbd->clock);
223 1.3.12.2 yamt printf("\tipl=%d, cpu_ex=%d, fpp_ex=%d\n",
224 1.3.12.2 yamt sbd->ipl, sbd->cpu_ex, sbd->fpp_ex);
225 1.3.12.2 yamt printf("\tkbms=%d, sio=%d, battery=%d, scsi=%d\n",
226 1.3.12.2 yamt sbd->kbms, sbd->sio, sbd->battery, sbd->scsi);
227 1.3.12.2 yamt printf("model name=%s\n", sbd->model_name);
228 1.3.12.2 yamt
229 1.3.12.2 yamt return 0;
230 1.3.12.2 yamt }
231 1.3.12.2 yamt
232 1.3.12.2 yamt int
233 1.3.12.2 yamt cmd_reboot(int argc, char *argp[], int interactive)
234 1.3.12.2 yamt {
235 1.3.12.2 yamt int bootdev = -1;
236 1.3.12.2 yamt
237 1.3.12.2 yamt if (argc > 1)
238 1.3.12.2 yamt bootdev = strtoul(argp[1], 0, 0); /* next boot device. */
239 1.3.12.2 yamt if (bootdev != NVSRAM_BOOTDEV_FLOPPYDISK &&
240 1.3.12.2 yamt bootdev != NVSRAM_BOOTDEV_HARDDISK &&
241 1.3.12.2 yamt bootdev != NVSRAM_BOOTDEV_CGMT &&
242 1.3.12.2 yamt bootdev != NVSRAM_BOOTDEV_NETWORK) {
243 1.3.12.2 yamt printf("invalid boot device.");
244 1.3.12.2 yamt bootdev = -1;
245 1.3.12.2 yamt }
246 1.3.12.2 yamt
247 1.3.12.2 yamt switch (SBD_INFO->machine) {
248 1.3.12.2 yamt case MACHINE_TR2A:
249 1.3.12.2 yamt if (bootdev != -1)
250 1.3.12.2 yamt *(uint8_t *)0xbe493030 = bootdev;
251 1.3.12.2 yamt *(volatile uint32_t *)0xbe000064 |= 0x80000000;
252 1.3.12.2 yamt *(volatile uint8_t *)0xba000004 = 1;
253 1.3.12.2 yamt *(uint8_t *)0xbfbffffc = 255;
254 1.3.12.2 yamt break;
255 1.3.12.2 yamt case MACHINE_TR2:
256 1.3.12.2 yamt if (bootdev != -1)
257 1.3.12.2 yamt *(uint8_t *)0xbb023030 = bootdev;
258 1.3.12.2 yamt *(volatile uint32_t *)0xbfb00000 |= 0x10;
259 1.3.12.2 yamt break;
260 1.3.12.2 yamt default:
261 1.3.12.2 yamt ROM_MONITOR();
262 1.3.12.2 yamt }
263 1.3.12.2 yamt
264 1.3.12.2 yamt while (/*CONSTCOND*/1)
265 1.3.12.2 yamt ;
266 1.3.12.2 yamt /* NOTREACHED */
267 1.3.12.2 yamt return 0;
268 1.3.12.2 yamt }
269 1.3.12.2 yamt
270 1.3.12.2 yamt void
271 1.3.12.2 yamt set_device_capability(void)
272 1.3.12.2 yamt {
273 1.3.12.2 yamt const char *devname[] = {
274 1.3.12.2 yamt "Floppy disk",
275 1.3.12.2 yamt "Unknown",
276 1.3.12.2 yamt "Hard disk",
277 1.3.12.2 yamt "Unknown",
278 1.3.12.2 yamt "CGMT",
279 1.3.12.2 yamt "Unknown",
280 1.3.12.2 yamt "Network",
281 1.3.12.2 yamt "Unknown",
282 1.3.12.2 yamt "Network T&D"
283 1.3.12.2 yamt };
284 1.3.12.2 yamt int booted_device, booted_unit, fd_format;
285 1.3.12.2 yamt
286 1.3.12.2 yamt boot_device(&booted_device, &booted_unit, &fd_format);
287 1.3.12.2 yamt if (booted_device > NVSRAM_BOOTDEV_MAX ||
288 1.3.12.2 yamt booted_device < NVSRAM_BOOTDEV_MIN) {
289 1.3.12.2 yamt printf(
290 1.3.12.2 yamt "invalid booted device. NVSRAM information isn't valid\n");
291 1.3.12.2 yamt } else {
292 1.3.12.2 yamt DEVICE_CAPABILITY.booted_device = booted_device;
293 1.3.12.2 yamt }
294 1.3.12.2 yamt DEVICE_CAPABILITY.booted_unit = booted_unit;
295 1.3.12.2 yamt
296 1.3.12.2 yamt switch (SBD_INFO->machine) {
297 1.3.12.2 yamt case MACHINE_TR2A:
298 1.3.12.2 yamt DEVICE_CAPABILITY.active = TRUE;
299 1.3.12.2 yamt /* boot has LANCE driver */
300 1.3.12.2 yamt DEVICE_CAPABILITY.network_enabled = TRUE;
301 1.3.12.2 yamt break;
302 1.3.12.2 yamt case MACHINE_TR2:
303 1.3.12.2 yamt DEVICE_CAPABILITY.active = TRUE;
304 1.3.12.2 yamt break;
305 1.3.12.2 yamt default:
306 1.3.12.2 yamt DEVICE_CAPABILITY.active = FALSE;
307 1.3.12.2 yamt break;
308 1.3.12.2 yamt }
309 1.3.12.2 yamt
310 1.3.12.2 yamt DEVICE_CAPABILITY.fd_enabled = TRUE; /* always enabled */
311 1.3.12.2 yamt
312 1.3.12.2 yamt if (DEVICE_CAPABILITY.active) {
313 1.3.12.2 yamt /*
314 1.3.12.2 yamt * When NETWORK IPL, FD IPL doesn't activate ROM DISK routine.
315 1.3.12.2 yamt */
316 1.3.12.2 yamt if (DEVICE_CAPABILITY.booted_device == NVSRAM_BOOTDEV_HARDDISK)
317 1.3.12.2 yamt DEVICE_CAPABILITY.disk_enabled = TRUE;
318 1.3.12.2 yamt }
319 1.3.12.2 yamt
320 1.3.12.2 yamt printf("FD[%c] DISK[%c] NETWORK[%c] COMPILED[%c]\n",
321 1.3.12.2 yamt DEVICE_CAPABILITY.fd_enabled ? 'x' : '_',
322 1.3.12.2 yamt DEVICE_CAPABILITY.disk_enabled ? 'x' : '_',
323 1.3.12.2 yamt DEVICE_CAPABILITY.network_enabled ? 'x' : '_',
324 1.3.12.2 yamt kernel_binary_size ? 'x' : '_');
325 1.3.12.2 yamt
326 1.3.12.2 yamt printf("booted from %s IPL", devname[DEVICE_CAPABILITY.booted_device]);
327 1.3.12.2 yamt if ((DEVICE_CAPABILITY.booted_device == NVSRAM_BOOTDEV_NETWORK) ||
328 1.3.12.2 yamt (DEVICE_CAPABILITY.booted_device == NVSRAM_BOOTDEV_NETWORK_T_AND_D))
329 1.3.12.2 yamt {
330 1.3.12.2 yamt printf("\n");
331 1.3.12.2 yamt } else {
332 1.3.12.2 yamt printf(" unit %d\n", DEVICE_CAPABILITY.booted_unit);
333 1.3.12.2 yamt }
334 1.3.12.2 yamt }
335 1.3.12.2 yamt
336 1.3.12.2 yamt int
337 1.3.12.2 yamt cmd_test(int argc, char *argp[], int interactive)
338 1.3.12.2 yamt {
339 1.3.12.2 yamt
340 1.3.12.2 yamt /* MISC TEST ROUTINE */
341 1.3.12.2 yamt extern int fdd_test(void);
342 1.3.12.2 yamt fdd_test();
343 1.3.12.2 yamt #if 0
344 1.3.12.2 yamt int i;
345 1.3.12.2 yamt
346 1.3.12.2 yamt printf("argc=%d\n", argc);
347 1.3.12.2 yamt for (i = 0; i < argc; i++)
348 1.3.12.2 yamt printf("[%d] %s\n", i, argp[i]);
349 1.3.12.2 yamt #endif
350 1.3.12.2 yamt #if 0 /* Recover my 360ADII NVSRAM.. */
351 1.3.12.2 yamt uint8_t *p = (uint8_t *)0xbe490000;
352 1.3.12.2 yamt uint8_t *q = nvsram_tr2a;
353 1.3.12.2 yamt int i;
354 1.3.12.2 yamt
355 1.3.12.2 yamt for (i = 0; i < sizeof nvsram_tr2a; i++) {
356 1.3.12.2 yamt *p = *q;
357 1.3.12.2 yamt p += 4;
358 1.3.12.2 yamt q += 1;
359 1.3.12.2 yamt }
360 1.3.12.2 yamt #endif
361 1.3.12.2 yamt #if 0 /* ROM PUTC test */
362 1.3.12.2 yamt char a[]= "ohayotest!";
363 1.3.12.2 yamt int i;
364 1.3.12.2 yamt for (i = 0; i < 10; i++)
365 1.3.12.2 yamt ROM_PUTC(120 + i * 12, 24 * 10, a[i]);
366 1.3.12.2 yamt #endif
367 1.3.12.2 yamt #if 0 /* ROM SCSI disk routine test TR2 */
368 1.3.12.2 yamt uint8_t buf[512*2];
369 1.3.12.2 yamt uint8_t *p;
370 1.3.12.2 yamt int i;
371 1.3.12.2 yamt
372 1.3.12.2 yamt printf("type=%d\n", *(uint8_t *)0xbb023034);
373 1.3.12.2 yamt memset(buf, 0, sizeof buf);
374 1.3.12.2 yamt p = (uint8_t *)(((uint32_t)buf + 511) & ~511);
375 1.3.12.2 yamt i = ROM_DK_READ(0, 0, 1, p);
376 1.3.12.2 yamt printf("err=%d\n", i);
377 1.3.12.2 yamt for (i = 0; i < 64; i++) {
378 1.3.12.2 yamt printf("%x ", p[i]);
379 1.3.12.2 yamt if (((i + 1) & 0xf) == 0)
380 1.3.12.2 yamt printf("\n");
381 1.3.12.2 yamt }
382 1.3.12.2 yamt #endif
383 1.3.12.2 yamt #if 0
384 1.3.12.2 yamt /*XXX failed. */
385 1.3.12.2 yamt __asm volatile(
386 1.3.12.2 yamt ".set noreorder;"
387 1.3.12.2 yamt "li $4, 2;"
388 1.3.12.2 yamt "mtc0 $4, $16;" /* Config */
389 1.3.12.2 yamt "lui $4, 0xbfc2;"
390 1.3.12.2 yamt "jr $4;"
391 1.3.12.2 yamt "nop;"
392 1.3.12.2 yamt ".set reorder");
393 1.3.12.2 yamt /* NOTREACHED */
394 1.3.12.2 yamt #endif
395 1.3.12.2 yamt #if 0
396 1.3.12.2 yamt /* FPU test */
397 1.3.12.2 yamt {
398 1.3.12.2 yamt int v;
399 1.3.12.2 yamt __asm volatile(
400 1.3.12.2 yamt ".set noreorder;"
401 1.3.12.2 yamt "lui %0, 0x2000;"
402 1.3.12.2 yamt "mtc0 %0, $12;" /* Cu1 */
403 1.3.12.2 yamt "nop;"
404 1.3.12.2 yamt "nop;"
405 1.3.12.2 yamt "cfc1 %0, $%1;"
406 1.3.12.2 yamt "nop;"
407 1.3.12.2 yamt "nop;"
408 1.3.12.2 yamt ".set reorder"
409 1.3.12.2 yamt : "=r"(v) : "i"(0));
410 1.3.12.2 yamt printf("FPUId: %x\n", v);
411 1.3.12.2 yamt }
412 1.3.12.2 yamt #endif
413 1.3.12.2 yamt return 0;
414 1.3.12.2 yamt }
415