Home | History | Annotate | Line # | Download | only in common
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