Annotation of sys/arch/i386/stand/libsa/cmd_i386.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: cmd_i386.c,v 1.29 2006/09/18 21:14:15 mpf Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 1997-1999 Michael Shalayeff
! 5: * Copyright (c) 1997 Tobias Weingartner
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: *
! 17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 18: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
! 19: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 20: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 27: * SUCH DAMAGE.
! 28: *
! 29: */
! 30:
! 31: #include <sys/param.h>
! 32: #include <sys/reboot.h>
! 33: #include <machine/biosvar.h>
! 34: #include <sys/disklabel.h>
! 35: #include "disk.h"
! 36: #include "debug.h"
! 37: #include "biosdev.h"
! 38: #include "libsa.h"
! 39: #include <cmd.h>
! 40:
! 41:
! 42: extern const char version[];
! 43:
! 44: int Xboot(void);
! 45: int Xdiskinfo(void);
! 46: int Xmemory(void);
! 47: int Xregs(void);
! 48:
! 49: /* From gidt.S */
! 50: int bootbuf(void *, int);
! 51:
! 52: const struct cmd_table cmd_machine[] = {
! 53: { "boot", CMDT_CMD, Xboot },
! 54: { "diskinfo", CMDT_CMD, Xdiskinfo },
! 55: { "memory", CMDT_CMD, Xmemory },
! 56: #ifdef DEBUG
! 57: { "regs", CMDT_CMD, Xregs },
! 58: #endif
! 59: { NULL, 0 }
! 60: };
! 61:
! 62: int
! 63: Xdiskinfo(void)
! 64: {
! 65: #ifndef _TEST
! 66: dump_diskinfo();
! 67: #endif
! 68: return 0;
! 69: }
! 70:
! 71: #ifdef DEBUG
! 72: int
! 73: Xregs(void)
! 74: {
! 75: DUMP_REGS;
! 76: return 0;
! 77: }
! 78: #endif
! 79:
! 80: int
! 81: Xboot(void)
! 82: {
! 83: #ifndef _TEST
! 84: int dev, part, st;
! 85: bios_diskinfo_t *bd = NULL;
! 86: char buf[DEV_BSIZE], *dest = (void *)BOOTBIOS_ADDR;
! 87:
! 88: if (cmd.argc != 2) {
! 89: printf("machine boot {fd,hd}<0123>[abcd]\n");
! 90: printf("Where [0123] is the disk number,"
! 91: " and [abcd] is the partition.\n");
! 92: return 0;
! 93: }
! 94:
! 95: /* Check arg */
! 96: if (cmd.argv[1][0] != 'f' && cmd.argv[1][0] != 'h')
! 97: goto bad;
! 98: if (cmd.argv[1][1] != 'd')
! 99: goto bad;
! 100: if (cmd.argv[1][2] < '0' || cmd.argv[1][2] > '3')
! 101: goto bad;
! 102: if ((cmd.argv[1][3] < 'a' || cmd.argv[1][3] > 'd') &&
! 103: cmd.argv[1][3] != '\0')
! 104: goto bad;
! 105:
! 106: printf("Booting from %s ", cmd.argv[1]);
! 107:
! 108: dev = (cmd.argv[1][0] == 'h')?0x80:0;
! 109: dev += (cmd.argv[1][2] - '0');
! 110: part = (cmd.argv[1][3] - 'a');
! 111:
! 112: if (part > 0)
! 113: printf("[%x,%d]\n", dev, part);
! 114: else
! 115: printf("[%x]\n", dev);
! 116:
! 117: /* Read boot sector from device */
! 118: bd = bios_dklookup(dev);
! 119: st = biosd_io(F_READ, bd, 0, 1, buf);
! 120: if (st)
! 121: goto bad;
! 122:
! 123: /* Frob boot flag in buffer from HD */
! 124: if ((dev & 0x80) && (part > 0)){
! 125: int i, j;
! 126:
! 127: for (i = 0, j = DOSPARTOFF; i < 4; i++, j += 16)
! 128: if (part == i)
! 129: buf[j] |= 0x80;
! 130: else
! 131: buf[j] &= ~0x80;
! 132: }
! 133:
! 134: /* Load %dl, ljmp */
! 135: bcopy(buf, dest, DEV_BSIZE);
! 136: bootbuf(dest, dev);
! 137:
! 138: bad:
! 139: printf("Invalid device!\n");
! 140: #endif
! 141: return 0;
! 142: }
! 143:
! 144: int
! 145: Xmemory(void)
! 146: {
! 147: if (cmd.argc >= 2) {
! 148: int i;
! 149: /* parse the memory specs */
! 150:
! 151: for (i = 1; i < cmd.argc; i++) {
! 152: char *p;
! 153: long long addr, size;
! 154:
! 155: p = cmd.argv[i];
! 156:
! 157: size = strtoll(p + 1, &p, 0);
! 158: if (*p && *p == '@')
! 159: addr = strtoll(p + 1, NULL, 0);
! 160: else
! 161: addr = 0;
! 162: if (addr == 0 && (*p != '@' || size == 0)) {
! 163: printf("bad language\n");
! 164: return 0;
! 165: } else {
! 166: switch (cmd.argv[i][0]) {
! 167: case '-':
! 168: mem_delete(addr, addr + size);
! 169: break;
! 170: case '+':
! 171: mem_add(addr, addr + size);
! 172: break;
! 173: default :
! 174: printf("bad OP\n");
! 175: return 0;
! 176: }
! 177: }
! 178: }
! 179: }
! 180:
! 181: dump_biosmem(NULL);
! 182:
! 183: return 0;
! 184: }
CVSweb