xref: /openbsd/sys/arch/i386/stand/libsa/cmd_i386.c (revision bb6df16f)
1*bb6df16fSweingart /*	$OpenBSD: cmd_i386.c,v 1.18 1997/10/25 02:07:09 weingart Exp $	*/
2f74c92d6Smickey 
3f74c92d6Smickey /*
4f74c92d6Smickey  * Copyright (c) 1997 Michael Shalayeff, Tobias Weingartner
5f74c92d6Smickey  * All rights reserved.
6f74c92d6Smickey  *
7f74c92d6Smickey  * Redistribution and use in source and binary forms, with or without
8f74c92d6Smickey  * modification, are permitted provided that the following conditions
9f74c92d6Smickey  * are met:
10f74c92d6Smickey  * 1. Redistributions of source code must retain the above copyright
11f74c92d6Smickey  *    notice, this list of conditions and the following disclaimer.
12f74c92d6Smickey  * 2. Redistributions in binary form must reproduce the above copyright
13f74c92d6Smickey  *    notice, this list of conditions and the following disclaimer in the
14f74c92d6Smickey  *    documentation and/or other materials provided with the distribution.
15f74c92d6Smickey  * 3. All advertising materials mentioning features or use of this software
16f74c92d6Smickey  *    must display the following acknowledgement:
17f74c92d6Smickey  *	This product includes software developed by Michael Shalayeff.
18f74c92d6Smickey  * 4. The name of the author may not be used to endorse or promote products
19f74c92d6Smickey  *    derived from this software without specific prior written permission.
20f74c92d6Smickey  *
21f74c92d6Smickey  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22f74c92d6Smickey  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23f74c92d6Smickey  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24f74c92d6Smickey  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25f74c92d6Smickey  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26f74c92d6Smickey  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27f74c92d6Smickey  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28f74c92d6Smickey  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29f74c92d6Smickey  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30f74c92d6Smickey  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31f74c92d6Smickey  * SUCH DAMAGE.
32f74c92d6Smickey  *
33f74c92d6Smickey  */
34f74c92d6Smickey 
35f74c92d6Smickey #include <sys/param.h>
3656427238Sweingart #include <sys/disklabel.h>
3739023d55Sweingart #include <machine/biosvar.h>
38484dd08aSmickey #include "debug.h"
3939023d55Sweingart #include "biosdev.h"
40f74c92d6Smickey #include "libsa.h"
41f74c92d6Smickey #include <cmd.h>
42f74c92d6Smickey 
43f74c92d6Smickey static int Xdiskinfo __P((void));
44484dd08aSmickey static int Xregs __P((void));
4556427238Sweingart static int Xboot __P((void));
4656427238Sweingart static int Xmemory __P((void));
4756427238Sweingart 
4856427238Sweingart /* From gidt.S */
4956427238Sweingart int bootbuf __P((int, int));
5056427238Sweingart 
51f74c92d6Smickey const struct cmd_table cmd_machine[] = {
52f74c92d6Smickey 	{ "diskinfo", CMDT_CMD, Xdiskinfo },
53484dd08aSmickey 	{ "regs",     CMDT_CMD, Xregs },
5456427238Sweingart 	{ "boot",     CMDT_CMD, Xboot },
5556427238Sweingart 	{ "memory",   CMDT_CMD, Xmemory },
56f74c92d6Smickey 	{ NULL, 0 }
57f74c92d6Smickey };
58f74c92d6Smickey 
59f74c92d6Smickey static int
60f74c92d6Smickey Xdiskinfo()
61f74c92d6Smickey {
6239023d55Sweingart 	int i;
6339023d55Sweingart 
647f850a97Smickey 	printf(
657f850a97Smickey 	    "Disk\tBIOS#\tBSD#\t\tCyls\tHeads\tSecs\tFlags\tChecksum(%d)\n",
667f850a97Smickey 	    bios_cksumlen);
6756427238Sweingart 	for(i = 0; bios_diskinfo[i].bios_number != -1 && i < 10; i++){
6856427238Sweingart 		int d = bios_diskinfo[i].bios_number;
6956427238Sweingart 
707f850a97Smickey 		printf(
717f850a97Smickey 		    "%cd%d\t0x%x\t0x%x\t%d\t%d\t%d\t0x%x\t0x%x\n",
7256427238Sweingart 		    (d & 0x80)?'h':'f', (d & 0x80)?d - 128:d, d,
737f850a97Smickey 		    bios_diskinfo[i].bsd_dev, bios_diskinfo[i].bios_cylinders,
747f850a97Smickey 		    bios_diskinfo[i].bios_heads, bios_diskinfo[i].bios_sectors,
757f850a97Smickey 		    bios_diskinfo[i].flags, bios_diskinfo[i].checksum);
7639023d55Sweingart 	}
7739023d55Sweingart 
78f74c92d6Smickey 	return 0;
79f74c92d6Smickey }
80f74c92d6Smickey 
81484dd08aSmickey static int
82484dd08aSmickey Xregs()
83484dd08aSmickey {
84484dd08aSmickey 	DUMP_REGS;
85484dd08aSmickey 	return 0;
86484dd08aSmickey }
8756427238Sweingart 
8856427238Sweingart static int
8956427238Sweingart Xboot()
9056427238Sweingart {
9156427238Sweingart 	int dev, part, st;
9256427238Sweingart 	char *buf = (void *)0x7c00;
9356427238Sweingart 
9456427238Sweingart 	if(cmd.argc != 2) {
9556427238Sweingart 		printf("machine boot {fd,hd}[0123][abcd]\n");
9656427238Sweingart 		return 0;
9756427238Sweingart 	}
9856427238Sweingart 
9956427238Sweingart 	/* Check arg */
10056427238Sweingart 	if(cmd.argv[1][0] != 'f' && cmd.argv[1][0] != 'h')
10156427238Sweingart 		goto bad;
10256427238Sweingart 	if(cmd.argv[1][1] != 'd')
10356427238Sweingart 		goto bad;
10456427238Sweingart 	if(cmd.argv[1][2] < '0' || cmd.argv[1][2] > '3')
10556427238Sweingart 		goto bad;
10656427238Sweingart 	if(cmd.argv[1][3] < 'a' || cmd.argv[1][3] > 'd')
10756427238Sweingart 		goto bad;
10856427238Sweingart 
10956427238Sweingart 	printf("Booting from %s ", cmd.argv[1]);
11056427238Sweingart 
11156427238Sweingart 	dev = (cmd.argv[1][0] == 'h')?0x80:0;
11256427238Sweingart 	dev += (cmd.argv[1][2] - '0');
11356427238Sweingart 	part = (cmd.argv[1][3] - 'a');
11456427238Sweingart 
11556427238Sweingart 	printf("[%x,%d]\n", dev, part);
11656427238Sweingart 
11756427238Sweingart 	/* Read boot sector from device */
118b9a05c75Smickey 	st = biosd_io(F_READ, dev, 0, 0, 1, 1, buf);
11956427238Sweingart 	if(st) goto bad;
12056427238Sweingart 
12156427238Sweingart 	/* Frob boot flag in buffer from HD */
12256427238Sweingart 	if(dev & 0x80){
12356427238Sweingart 		int i, j;
12456427238Sweingart 
12556427238Sweingart 		for(i = 0, j = DOSPARTOFF; i < 4; i++, j += 16)
12656427238Sweingart 			if(part == i)
12756427238Sweingart 				buf[j] = 0x80;
12856427238Sweingart 			else
12956427238Sweingart 				buf[j] = 0x00;
13056427238Sweingart 	}
13156427238Sweingart 
13256427238Sweingart 	printf("%x %x %x %x %x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);
13356427238Sweingart 
13456427238Sweingart 	/* Load %dl, ljmp */
13556427238Sweingart 	bootbuf(dev, part);
13656427238Sweingart 
13756427238Sweingart bad:
13856427238Sweingart 	printf("Invalid device!\n");
13956427238Sweingart 	return 0;
14056427238Sweingart }
14156427238Sweingart 
142*bb6df16fSweingart static int
14356427238Sweingart Xmemory()
14456427238Sweingart {
1451fd86601Sweingart 	bios_memmap_t *tm = memory_map;
146*bb6df16fSweingart 	int count, total = 0;
14756427238Sweingart 
148*bb6df16fSweingart 	for(count = 0; tm[count].type != BIOS_MAP_END; count++){
149*bb6df16fSweingart 		printf("Region %d: type %u at 0x%lx for %luKB\n", count,
150*bb6df16fSweingart 			tm[count].type, (long)tm[count].addr, (long)tm[count].size);
151*bb6df16fSweingart 
152*bb6df16fSweingart 		if(tm[count].type == BIOS_MAP_FREE)
153*bb6df16fSweingart 			total += tm[count].size;
15456427238Sweingart 	}
15556427238Sweingart 
156*bb6df16fSweingart 	printf("Low ram: %dKB  High ram: %dKB\n", cnvmem, extmem);
157*bb6df16fSweingart 	printf("Total free memory: %dKB\n", total);
15856427238Sweingart 
15956427238Sweingart 	return 0;
16056427238Sweingart }
161