Home | History | Annotate | Line # | Download | only in standtest
      1  1.7  dholland /* $NetBSD: test.c,v 1.7 2016/06/11 06:26:50 dholland Exp $ */
      2  1.1       cgd 
      3  1.1       cgd /*
      4  1.1       cgd  * Copyright (c) 1999 Christopher G. Demetriou.  All rights reserved.
      5  1.1       cgd  *
      6  1.1       cgd  * Redistribution and use in source and binary forms, with or without
      7  1.1       cgd  * modification, are permitted provided that the following conditions
      8  1.1       cgd  * are met:
      9  1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     10  1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     11  1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     12  1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     13  1.1       cgd  *    documentation and/or other materials provided with the distribution.
     14  1.1       cgd  * 3. All advertising materials mentioning features or use of this software
     15  1.1       cgd  *    must display the following acknowledgement:
     16  1.1       cgd  *      This product includes software developed by Christopher G. Demetriou
     17  1.1       cgd  *	for the NetBSD Project.
     18  1.1       cgd  * 4. The name of the author may not be used to endorse or promote products
     19  1.1       cgd  *    derived from this software without specific prior written permission
     20  1.1       cgd  *
     21  1.1       cgd  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22  1.1       cgd  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23  1.1       cgd  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24  1.1       cgd  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25  1.1       cgd  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26  1.1       cgd  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27  1.1       cgd  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28  1.1       cgd  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29  1.1       cgd  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30  1.1       cgd  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  1.1       cgd  */
     32  1.1       cgd 
     33  1.1       cgd #include <lib/libsa/stand.h>
     34  1.1       cgd #include <lib/libkern/libkern.h>
     35  1.1       cgd #include <machine/autoconf.h>
     36  1.1       cgd #include <machine/rpb.h>
     37  1.1       cgd 
     38  1.1       cgd #include "../common/common.h"
     39  1.1       cgd 
     40  1.1       cgd struct cmdtab {
     41  1.1       cgd 	const char *cmd;
     42  1.1       cgd 	void (*fn)(const char *buf);
     43  1.1       cgd };
     44  1.1       cgd 
     45  1.1       cgd int		done;
     46  1.1       cgd unsigned long	arg_pfn, arg_ptb, arg_bim, arg_bip, arg_biv;
     47  1.1       cgd 
     48  1.1       cgd const char *advance_past_space(const char *buf);
     49  1.2       cgd const char *cvt_number(const char *buf, u_int64_t *nump);
     50  1.1       cgd int	dispatch_cmd(const char *buf, const struct cmdtab *cmds);
     51  1.1       cgd #define		DISPATCH_CMD_NOCMD	0
     52  1.1       cgd #define		DISPATCH_CMD_MATCHED	1
     53  1.1       cgd #define		DISPATCH_CMD_NOMATCH	2
     54  1.1       cgd #define		DISPATCH_CMD_AMBIGUOUS	3
     55  1.1       cgd void	print_cmds(const struct cmdtab *cmds, const char *match,
     56  1.1       cgd 	    size_t matchlen);
     57  1.1       cgd void	print_stringarray(const char *s, size_t maxlen);
     58  1.1       cgd 
     59  1.2       cgd void	toplevel_dpb(const char *buf);
     60  1.2       cgd void	toplevel_dpl(const char *buf);
     61  1.2       cgd void	toplevel_dpq(const char *buf);
     62  1.2       cgd void	toplevel_dpw(const char *buf);
     63  1.2       cgd void	toplevel_dvb(const char *buf);
     64  1.2       cgd void	toplevel_dvl(const char *buf);
     65  1.2       cgd void	toplevel_dvq(const char *buf);
     66  1.2       cgd void	toplevel_dvw(const char *buf);
     67  1.1       cgd void	toplevel_halt(const char *buf);
     68  1.1       cgd void	toplevel_help(const char *buf);
     69  1.1       cgd void	toplevel_show(const char *buf);
     70  1.1       cgd 
     71  1.1       cgd void	show_args(const char *buf);
     72  1.1       cgd void	show_bootinfo(const char *buf);
     73  1.1       cgd void	show_pt(const char *buf);
     74  1.1       cgd void	show_rpb(const char *buf);
     75  1.1       cgd 
     76  1.1       cgd void
     77  1.4       dsl main(unsigned long pfn, unsigned long ptb, unsigned long bim, unsigned long bip, unsigned long biv)
     78  1.4       dsl 	/* pfn:	 first free PFN number */
     79  1.4       dsl 	/* ptb:	 PFN of current level 1 page table */
     80  1.4       dsl 	/* bim:	 bootinfo magic */
     81  1.4       dsl 	/* bip:	 bootinfo pointer */
     82  1.4       dsl 	/* biv:	 bootinfo version */
     83  1.1       cgd {
     84  1.1       cgd 	char input_buf[512];
     85  1.3      yamt 	static const struct cmdtab toplevel_cmds[] = {
     86  1.1       cgd 	    {	"?",		toplevel_help,	},
     87  1.1       cgd #if 0 /* XXX notyet */
     88  1.2       cgd 	    {	"dpb",		toplevel_dpb,	},
     89  1.2       cgd 	    {	"dpl",		toplevel_dpl,	},
     90  1.2       cgd 	    {	"dpq",		toplevel_dpq,	},
     91  1.2       cgd 	    {	"dpw",		toplevel_dpw,	},
     92  1.2       cgd 	    {	"dvb",		toplevel_dvb,	},
     93  1.2       cgd 	    {	"dvl",		toplevel_dvl,	},
     94  1.2       cgd 	    {	"dvq",		toplevel_dvq,	},
     95  1.2       cgd 	    {	"dvw",		toplevel_dvw,	},
     96  1.1       cgd #endif
     97  1.1       cgd 	    {	"quit",		toplevel_halt,	},
     98  1.1       cgd 	    {	"show",		toplevel_show,	},
     99  1.1       cgd 	    {	NULL,				},
    100  1.1       cgd 	};
    101  1.1       cgd 
    102  1.1       cgd 	printf("\n");
    103  1.1       cgd 	printf("NetBSD/alpha " NETBSD_VERS
    104  1.1       cgd 	    " Standalone Test Program, Revision %s\n", bootprog_rev);
    105  1.1       cgd 	printf("\n");
    106  1.1       cgd 
    107  1.1       cgd 	arg_pfn = pfn;
    108  1.1       cgd 	arg_ptb = ptb;
    109  1.1       cgd 	arg_bim = bim;
    110  1.1       cgd 	arg_bip = bip;
    111  1.1       cgd 	arg_biv = biv;
    112  1.1       cgd 
    113  1.1       cgd 	printf("Enter '?' for help.\n");
    114  1.1       cgd 	printf("\n");
    115  1.1       cgd 
    116  1.1       cgd 	do {
    117  1.1       cgd 		printf("test> ");
    118  1.7  dholland 		kgets(input_buf, sizeof(input_buf));
    119  1.1       cgd 
    120  1.1       cgd 		dispatch_cmd(input_buf, toplevel_cmds);
    121  1.1       cgd 	} while (!done);
    122  1.1       cgd 
    123  1.1       cgd 	printf("\n");
    124  1.1       cgd 	printf("halting...\n");
    125  1.1       cgd 	halt();
    126  1.1       cgd }
    127  1.1       cgd 
    128  1.1       cgd const char *
    129  1.1       cgd advance_past_space(const char *buf)
    130  1.1       cgd {
    131  1.1       cgd 
    132  1.1       cgd 	/* advance past white space. */
    133  1.1       cgd 	while (isspace(*buf))
    134  1.1       cgd 		buf++;
    135  1.1       cgd 
    136  1.1       cgd 	if (*buf == '\0')
    137  1.1       cgd 		return NULL;
    138  1.1       cgd 	return buf;
    139  1.1       cgd }
    140  1.1       cgd 
    141  1.2       cgd const char *
    142  1.2       cgd cvt_number(const char *buf, u_int64_t *nump)
    143  1.2       cgd {
    144  1.2       cgd 	int base;
    145  1.2       cgd 	unsigned char c;
    146  1.2       cgd 
    147  1.2       cgd 	base = 10;
    148  1.2       cgd 	*nump = 0;
    149  1.2       cgd 
    150  1.2       cgd 	c = *buf;
    151  1.2       cgd 	if (c == '0') {
    152  1.2       cgd 		c = *(++buf);
    153  1.2       cgd 
    154  1.2       cgd 		if (c == 'x' || c == 'X') {
    155  1.2       cgd 			base = 16;
    156  1.2       cgd 			buf++;
    157  1.2       cgd 		} else {
    158  1.2       cgd 			base = 8;
    159  1.2       cgd 		}
    160  1.2       cgd 	}
    161  1.2       cgd 
    162  1.2       cgd 	for (c = *buf; c != '\0' && !isspace(c); c = *(++buf)) {
    163  1.2       cgd 		switch (base) {
    164  1.2       cgd 		case 10:
    165  1.2       cgd 			if (c < '0' || c > '9')
    166  1.2       cgd 				goto done;
    167  1.2       cgd 		}
    168  1.2       cgd 	}
    169  1.2       cgd done:
    170  1.2       cgd 
    171  1.2       cgd }
    172  1.2       cgd 
    173  1.1       cgd int
    174  1.1       cgd dispatch_cmd(const char *buf, const struct cmdtab *cmds)
    175  1.1       cgd {
    176  1.1       cgd 	const struct cmdtab *try, *winner;
    177  1.1       cgd 	size_t nonwhitespace, i;
    178  1.1       cgd 	unsigned int nmatches;
    179  1.1       cgd 	const char *pre, *post;
    180  1.1       cgd 	int rv;
    181  1.1       cgd 
    182  1.1       cgd 	/* advance past white space. */
    183  1.1       cgd 	buf = advance_past_space(buf);
    184  1.1       cgd 	if (buf == NULL)
    185  1.1       cgd 		return (DISPATCH_CMD_NOCMD);
    186  1.1       cgd 
    187  1.1       cgd 	/* find how much non-white space there is. */
    188  1.1       cgd 	nonwhitespace = 0;
    189  1.1       cgd 	while ((buf[nonwhitespace] != '\0') && !isspace(buf[nonwhitespace]))
    190  1.1       cgd 		nonwhitespace++;
    191  1.1       cgd 
    192  1.1       cgd 	/* at this point, nonwhitespace should always be non-zero */
    193  1.1       cgd 	if (nonwhitespace == 0) {
    194  1.1       cgd 		printf("assertion failed: dispatch_cmd: nonwhitespace == 0\n");
    195  1.1       cgd 		halt();
    196  1.1       cgd 	}
    197  1.1       cgd 
    198  1.1       cgd 	/* see how many matches there were. */
    199  1.1       cgd 	for (nmatches = 0, try = cmds;
    200  1.1       cgd 	    try != NULL && try->cmd != NULL;
    201  1.1       cgd 	    try++) {
    202  1.1       cgd 		if (strncmp(buf, try->cmd, nonwhitespace) == 0) {
    203  1.1       cgd 			winner = try;
    204  1.1       cgd 			nmatches++;
    205  1.1       cgd 		}
    206  1.1       cgd 	}
    207  1.1       cgd 
    208  1.1       cgd 	if (nmatches == 1) {
    209  1.1       cgd 		(*winner->fn)(buf + nonwhitespace);
    210  1.1       cgd 		return (DISPATCH_CMD_MATCHED);
    211  1.1       cgd 	} else if (nmatches == 0) {
    212  1.1       cgd 		pre = "invalid command word";
    213  1.1       cgd 		post = "allowed words";
    214  1.1       cgd 		rv = DISPATCH_CMD_NOMATCH;
    215  1.1       cgd 	} else {
    216  1.1       cgd 		pre = "ambiguous command word";
    217  1.1       cgd 		post = "matches";
    218  1.1       cgd 		rv = DISPATCH_CMD_AMBIGUOUS;
    219  1.1       cgd 	}
    220  1.1       cgd 
    221  1.1       cgd 	printf("%s \"", pre);
    222  1.1       cgd 	print_stringarray(buf, nonwhitespace);
    223  1.1       cgd 	printf("\", %s:\n", post);
    224  1.1       cgd 
    225  1.1       cgd 	/* print commands.  if no match, print all commands. */
    226  1.1       cgd 	print_cmds(cmds, buf, rv == DISPATCH_CMD_NOMATCH ? 0 : nonwhitespace);
    227  1.1       cgd 	return (rv);
    228  1.1       cgd }
    229  1.1       cgd 
    230  1.1       cgd void
    231  1.1       cgd print_cmds(const struct cmdtab *cmds, const char *match, size_t matchlen)
    232  1.1       cgd {
    233  1.1       cgd 	const struct cmdtab *try;
    234  1.1       cgd 
    235  1.1       cgd 	printf("    ");
    236  1.1       cgd 	for (try = cmds; try != NULL && try->cmd != NULL; try++) {
    237  1.1       cgd 		if (strncmp(match, try->cmd, matchlen) == 0)
    238  1.1       cgd 			printf("%s%s", try != cmds ? ", " : "", try->cmd);
    239  1.1       cgd 	}
    240  1.1       cgd 	printf("\n");
    241  1.1       cgd }
    242  1.1       cgd 
    243  1.1       cgd void
    244  1.1       cgd print_stringarray(const char *s, size_t maxlen)
    245  1.1       cgd {
    246  1.1       cgd 	size_t i;
    247  1.1       cgd 
    248  1.1       cgd 	for (i = 0; (i < maxlen) && (*s != '\0'); i++, s++)
    249  1.1       cgd 		putchar(*s);
    250  1.1       cgd }
    251  1.1       cgd 
    252  1.1       cgd void
    253  1.1       cgd warn_ignored_args(const char *buf, const char *cmd)
    254  1.1       cgd {
    255  1.1       cgd 
    256  1.1       cgd 	if (advance_past_space(buf) != NULL)
    257  1.1       cgd 		printf("WARNING: extra arguments to \"%s\" command ignored\n",
    258  1.1       cgd 		    cmd);
    259  1.1       cgd }
    260  1.1       cgd 
    261  1.2       cgd 
    262  1.1       cgd /*
    263  1.1       cgd  * Top-level Commands
    264  1.1       cgd  */
    265  1.1       cgd 
    266  1.1       cgd void
    267  1.2       cgd toplevel_dpb(const char *buf)
    268  1.2       cgd {
    269  1.2       cgd 	u_int64_t startaddr, count = 1;
    270  1.2       cgd 
    271  1.2       cgd 	buf = advance_past_space(buf);
    272  1.2       cgd 	if (buf == NULL) {
    273  1.2       cgd 		printf("\"dpb\" must be given starting address\n");
    274  1.2       cgd 		return;
    275  1.2       cgd 	}
    276  1.2       cgd 	buf = cvt_number(buf, &startaddr);
    277  1.2       cgd 	if (*buf != '\0' && !isspace(*buf)) {
    278  1.6  christos 		printf("bad character '%c' in starting address\n", *buf);
    279  1.2       cgd 		return;
    280  1.2       cgd 	}
    281  1.2       cgd 
    282  1.2       cgd 	buf = advance_past_space(buf);
    283  1.2       cgd 	if (buf != NULL) {
    284  1.2       cgd 		buf = cvt_number(buf, &count);
    285  1.2       cgd 		if (*buf != '\0' && !isspace(*buf)) {
    286  1.6  christos 			printf("bad character '%c' in count\n", *buf);
    287  1.2       cgd 			return;
    288  1.2       cgd 		}
    289  1.2       cgd 		buf = advance_past_space(buf);
    290  1.2       cgd 		if (buf != NULL) {
    291  1.2       cgd 			printf("extra args at end of \"dpb\" command\n");
    292  1.2       cgd 			return;
    293  1.2       cgd 		}
    294  1.2       cgd 	}
    295  1.2       cgd 
    296  1.2       cgd 	printf("startaddr = 0x%lx, count = 0x%lx\n", startaddr, count);
    297  1.2       cgd 	printf("\"dpb\" not yet implemented\n");
    298  1.2       cgd }
    299  1.2       cgd 
    300  1.2       cgd void
    301  1.2       cgd toplevel_dpl(const char *buf)
    302  1.2       cgd {
    303  1.2       cgd 
    304  1.2       cgd 	printf("\"dpl\" not yet implemented\n");
    305  1.2       cgd }
    306  1.2       cgd 
    307  1.2       cgd void
    308  1.2       cgd toplevel_dpq(const char *buf)
    309  1.2       cgd {
    310  1.2       cgd 
    311  1.2       cgd 	printf("\"dpq\" not yet implemented\n");
    312  1.2       cgd }
    313  1.2       cgd 
    314  1.2       cgd void
    315  1.2       cgd toplevel_dpw(const char *buf)
    316  1.2       cgd {
    317  1.2       cgd 
    318  1.2       cgd 	printf("\"dpw\" not yet implemented\n");
    319  1.2       cgd }
    320  1.2       cgd 
    321  1.2       cgd void
    322  1.2       cgd toplevel_dvb(const char *buf)
    323  1.1       cgd {
    324  1.1       cgd 
    325  1.2       cgd 	printf("\"dvb\" not yet implemented\n");
    326  1.1       cgd }
    327  1.1       cgd 
    328  1.1       cgd void
    329  1.2       cgd toplevel_dvl(const char *buf)
    330  1.1       cgd {
    331  1.1       cgd 
    332  1.2       cgd 	printf("\"dvl\" not yet implemented\n");
    333  1.1       cgd }
    334  1.1       cgd 
    335  1.1       cgd void
    336  1.2       cgd toplevel_dvq(const char *buf)
    337  1.1       cgd {
    338  1.1       cgd 
    339  1.2       cgd 	printf("\"dvq\" not yet implemented\n");
    340  1.1       cgd }
    341  1.1       cgd 
    342  1.1       cgd void
    343  1.2       cgd toplevel_dvw(const char *buf)
    344  1.1       cgd {
    345  1.1       cgd 
    346  1.2       cgd 	printf("\"dvw\" not yet implemented\n");
    347  1.1       cgd }
    348  1.1       cgd 
    349  1.1       cgd void
    350  1.1       cgd toplevel_halt(const char *buf)
    351  1.1       cgd {
    352  1.1       cgd 
    353  1.1       cgd 	warn_ignored_args(buf, "halt");
    354  1.1       cgd 
    355  1.1       cgd 	done = 1;
    356  1.1       cgd }
    357  1.1       cgd 
    358  1.1       cgd void
    359  1.1       cgd toplevel_help(const char *buf)
    360  1.1       cgd {
    361  1.1       cgd 
    362  1.1       cgd 	warn_ignored_args(buf, "?");
    363  1.1       cgd 
    364  1.1       cgd 	printf("Standalone Test Program Commands:\n");
    365  1.1       cgd 	printf("    ?                       print help\n");
    366  1.1       cgd 	printf("    quit                    return to console\n");
    367  1.1       cgd #if 0 /* XXX notyet */
    368  1.2       cgd 	printf("    dpb startaddr [count]   display physical memory "
    369  1.2       cgd 	    "(8-bit units)\n");
    370  1.2       cgd 	printf("    dpw startaddr [count]   display physical memory "
    371  1.2       cgd 	    "(16-bit units)\n");
    372  1.2       cgd 	printf("    dpl startaddr [count]   display physical memory "
    373  1.2       cgd 	    "(32-bit units)\n");
    374  1.2       cgd 	printf("    dpq startaddr [count]   display physical memory "
    375  1.2       cgd 	    "(64-bit units)\n");
    376  1.2       cgd 	printf("    dvb startaddr [count]   display virtual memory "
    377  1.2       cgd 	    "(8-bit units)\n");
    378  1.2       cgd 	printf("    dvw startaddr [count]   display virtual memory "
    379  1.2       cgd 	    "(16-bit units)\n");
    380  1.2       cgd 	printf("    dvl startaddr [count]   display virtual memory "
    381  1.2       cgd 	    "(32-bit units)\n");
    382  1.2       cgd 	printf("    dvq startaddr [count]   display virtual memory "
    383  1.2       cgd 	    "(64-bit units)\n");
    384  1.1       cgd #endif
    385  1.1       cgd 	printf("    show args               show test program arguments\n");
    386  1.1       cgd 	printf("    show bootinfo           show bootstrap bootinfo\n");
    387  1.1       cgd #if 0 /* XXX notyet */
    388  1.1       cgd 	printf("    show pt [startaddr [endaddr]]\n");
    389  1.1       cgd 	printf("                            show page tables\n");
    390  1.1       cgd 	printf("    show rpb                show the HWRPB\n");
    391  1.1       cgd 	printf("\n");
    392  1.1       cgd 	printf("If optional \"count\" argument is omitted, 1 is used.\n");
    393  1.1       cgd 	printf("If optional \"startaddr\" argument is omitted, "
    394  1.1       cgd 	    "0x0 is used.\n");
    395  1.1       cgd 	printf("If optional \"endaddr\" argument is omitted, "
    396  1.1       cgd 	    "0xffffffffffffffff is used.\n");
    397  1.1       cgd #endif
    398  1.1       cgd }
    399  1.1       cgd 
    400  1.1       cgd void
    401  1.1       cgd toplevel_show(const char *buf)
    402  1.1       cgd {
    403  1.3      yamt 	static const struct cmdtab show_cmds[] = {
    404  1.1       cgd 	    {	"args",		show_args,	},
    405  1.1       cgd 	    {	"bootinfo",	show_bootinfo,	},
    406  1.1       cgd #if 0 /* XXX notyet */
    407  1.1       cgd 	    {	"pt",		show_pt,	},
    408  1.1       cgd 	    {	"rpb",		show_rpb,	},
    409  1.1       cgd #endif
    410  1.1       cgd 	    {	NULL,				},
    411  1.1       cgd 	};
    412  1.1       cgd 
    413  1.1       cgd 	if (dispatch_cmd(buf, show_cmds) == DISPATCH_CMD_NOCMD) {
    414  1.1       cgd 		printf("no subcommand given.  allowed subcommands:\n");
    415  1.1       cgd 		print_cmds(show_cmds, NULL, 0);
    416  1.1       cgd 	}
    417  1.1       cgd }
    418  1.1       cgd 
    419  1.1       cgd 
    420  1.1       cgd /*
    421  1.1       cgd  * Show Commands
    422  1.1       cgd  */
    423  1.1       cgd 
    424  1.1       cgd void
    425  1.1       cgd show_args(const char *buf)
    426  1.1       cgd {
    427  1.1       cgd 
    428  1.1       cgd 	warn_ignored_args(buf, "show args");
    429  1.1       cgd 
    430  1.1       cgd 	printf("first free page frame number:       0x%lx\n", arg_pfn);
    431  1.1       cgd 	printf("page table base page frame number:  0x%lx\n", arg_ptb);
    432  1.1       cgd 	printf("bootinfo magic number:              0x%lx\n", arg_bim);
    433  1.1       cgd 	printf("bootinfo pointer:                   0x%lx\n", arg_bip);
    434  1.1       cgd 	printf("bootinfo version:                   0x%lx\n", arg_biv);
    435  1.1       cgd }
    436  1.1       cgd 
    437  1.1       cgd void
    438  1.1       cgd show_bootinfo(const char *buf)
    439  1.1       cgd {
    440  1.1       cgd 	u_long biv, bip;
    441  1.1       cgd 
    442  1.1       cgd 	warn_ignored_args(buf, "show bootinfo");
    443  1.1       cgd 
    444  1.1       cgd 	if (arg_bim != BOOTINFO_MAGIC) {
    445  1.1       cgd 		printf("bootinfo magic number not present; no bootinfo\n");
    446  1.1       cgd 		return;
    447  1.1       cgd 	}
    448  1.1       cgd 
    449  1.1       cgd 	bip = arg_bip;
    450  1.1       cgd 	biv = arg_biv;
    451  1.1       cgd 	if (biv == 0) {
    452  1.1       cgd 		biv = *(u_long *)bip;
    453  1.1       cgd 		bip += 8;
    454  1.1       cgd 	}
    455  1.1       cgd 
    456  1.1       cgd 	printf("bootinfo version: %d\n", biv);
    457  1.1       cgd 	printf("bootinfo pointer: %p\n", (void *)bip);
    458  1.1       cgd 	printf("bootinfo data:\n");
    459  1.1       cgd 
    460  1.1       cgd 	switch (biv) {
    461  1.1       cgd 	case 1: {
    462  1.1       cgd 		const struct bootinfo_v1 *v1p;
    463  1.1       cgd 		int i;
    464  1.1       cgd 
    465  1.1       cgd 		v1p = (const struct bootinfo_v1 *)bip;
    466  1.1       cgd 		printf("    ssym:          0x%lx\n", v1p->ssym);
    467  1.1       cgd 		printf("    esym:          0x%lx\n", v1p->esym);
    468  1.1       cgd 		printf("    boot flags:    \"");
    469  1.1       cgd 		print_stringarray(v1p->boot_flags, sizeof v1p->boot_flags);
    470  1.1       cgd 		printf("\"\n");
    471  1.1       cgd 		printf("    booted kernel: \"", v1p->esym);
    472  1.1       cgd 		print_stringarray(v1p->booted_kernel,
    473  1.1       cgd 		    sizeof v1p->booted_kernel);
    474  1.1       cgd 		printf("\"\n");
    475  1.1       cgd 		printf("    hwrpb:         %p\n", v1p->hwrpb);
    476  1.1       cgd 		printf("    hwrpbsize:     0x%lx\n", v1p->hwrpbsize);
    477  1.1       cgd 		printf("    cngetc:        %p\n", v1p->cngetc);
    478  1.1       cgd 		printf("    cnputc:        %p\n", v1p->cnputc);
    479  1.1       cgd 		printf("    cnpollc:       %p\n", v1p->cnpollc);
    480  1.1       cgd 		for (i = 0; i < (sizeof v1p->pad / sizeof v1p->pad[0]); i++) {
    481  1.1       cgd 			printf("    pad[%d]:        0x%lx\n", i, v1p->pad[i]);
    482  1.1       cgd 		}
    483  1.1       cgd 		break;
    484  1.1       cgd 	}
    485  1.1       cgd 	default:
    486  1.1       cgd 		printf("    unknown bootinfo version, cannot print data\n");
    487  1.1       cgd 		break;
    488  1.1       cgd 	}
    489  1.1       cgd }
    490  1.1       cgd 
    491  1.1       cgd void
    492  1.1       cgd show_pt(const char *buf)
    493  1.1       cgd {
    494  1.1       cgd 
    495  1.1       cgd 	/* has additional args! */
    496  1.1       cgd 	printf("\"show pt\" not yet implemented\n");
    497  1.1       cgd }
    498  1.1       cgd 
    499  1.1       cgd void
    500  1.1       cgd show_rpb(const char *buf)
    501  1.1       cgd {
    502  1.1       cgd 
    503  1.1       cgd 	warn_ignored_args(buf, "show pt");
    504  1.1       cgd 
    505  1.1       cgd 	printf("\"show rpb\" not yet implemented\n");
    506  1.1       cgd }
    507