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