Module Name:    src
Committed By:   jmcneill
Date:           Sun Sep 13 22:45:27 UTC 2009

Modified Files:
        src/sys/arch/i386/stand/boot: boot2.c
        src/sys/arch/i386/stand/lib: biosdisk.c libi386.h

Log Message:
Make the 'dev' command print out a list of known boot devices based on
information from the BIOS in addition to the currently selected default
partition. Handy when you don't know where to boot from. Here's a demo:

  type "?" or "help" for help.
  > dev
  disk hd0 size 3815 MB
    hd0a(4.2BSD) hd0b(swap)
  disk cd0
    cd0a(unknown)
  default hd0a
  >


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/sys/arch/i386/stand/boot/boot2.c
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/i386/stand/lib/biosdisk.c
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/i386/stand/lib/libi386.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/i386/stand/boot/boot2.c
diff -u src/sys/arch/i386/stand/boot/boot2.c:1.44 src/sys/arch/i386/stand/boot/boot2.c:1.45
--- src/sys/arch/i386/stand/boot/boot2.c:1.44	Sat Mar 21 15:01:56 2009
+++ src/sys/arch/i386/stand/boot/boot2.c	Sun Sep 13 22:45:27 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: boot2.c,v 1.44 2009/03/21 15:01:56 ad Exp $	*/
+/*	$NetBSD: boot2.c,v 1.45 2009/09/13 22:45:27 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -420,7 +420,8 @@
 	const char *file; /* dummy */
 
 	if (*arg == '\0') {
-		printf("%s%d%c:\n", default_devname, default_unit,
+		biosdisk_probe();
+		printf("default %s%d%c\n", default_devname, default_unit,
 		       'a' + default_partition);
 		return;
 	}

Index: src/sys/arch/i386/stand/lib/biosdisk.c
diff -u src/sys/arch/i386/stand/lib/biosdisk.c:1.28 src/sys/arch/i386/stand/lib/biosdisk.c:1.29
--- src/sys/arch/i386/stand/lib/biosdisk.c:1.28	Sat Jan  5 15:28:43 2008
+++ src/sys/arch/i386/stand/lib/biosdisk.c	Sun Sep 13 22:45:27 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: biosdisk.c,v 1.28 2008/01/05 15:28:43 dsl Exp $	*/
+/*	$NetBSD: biosdisk.c,v 1.29 2009/09/13 22:45:27 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 1996, 1998
@@ -63,16 +63,21 @@
  * the rights to redistribute these changes.
  */
 
+#ifndef NO_DISKLABEL
+#define FSTYPENAMES
+#endif
+
 #include <sys/types.h>
-#include <sys/disklabel.h>
 #include <sys/md5.h>
 #include <sys/param.h>
+#include <sys/disklabel.h>
 
 #include <fs/cd9660/iso.h>
 
 #include <lib/libsa/stand.h>
 #include <lib/libsa/saerrno.h>
 #include <machine/stdarg.h>
+#include <machine/cpu.h>
 
 #include "libi386.h"
 #include "biosdisk_ll.h"
@@ -292,6 +297,79 @@
 }
 #endif /* NO_DISKLABEL */
 
+void
+biosdisk_probe(void)
+{
+#ifndef NO_DISKLABEL
+	struct disklabel *lp;
+	int first, part;
+#endif
+	struct biosdisk d;
+	struct biosdisk_extinfo ed;
+	uint64_t size;
+	int i;
+
+	for (i = 0; i < MAX_BIOSDISKS + 2; i++) {
+		first = 1;
+		memset(&d, 0, sizeof(d));
+		memset(&ed, 0, sizeof(ed));
+		if (i >= MAX_BIOSDISKS)
+			d.ll.dev = 0x00 + i - MAX_BIOSDISKS;	/* fd */
+		else
+			d.ll.dev = 0x80 + i;			/* hd/cd */
+		if (set_geometry(&d.ll, &ed))
+			continue;
+		switch (d.ll.type) {
+		case BIOSDISK_TYPE_CD:
+			printf("disk cd0\n");
+			printf("  cd0a(unknown)\n");
+			break;
+		case BIOSDISK_TYPE_FD:
+			printf("disk fd%d\n", d.ll.dev & 0x7f);
+			printf("  fd%da(unknown)\n", d.ll.dev & 0x7f);
+			break;
+		case BIOSDISK_TYPE_HD:
+			printf("disk hd%d", d.ll.dev & 0x7f);
+			if (d.ll.flags & BIOSDISK_INT13EXT) {
+				printf(" size ");
+				size = ed.totsec * ed.sbytes;
+				if (size >= (10ULL * 1024 * 1024 * 1024))
+					printf("%llu GB",
+					    size / (1024 * 1024 * 1024));
+				else
+					printf("%llu MB",
+					    size / (1024 * 1024));
+			}
+			printf("\n");
+			break;
+		}
+#ifndef NO_DISKLABEL
+		if (read_label(&d) == -1)
+			break;
+		lp = (struct disklabel *)(d.buf + LABELOFFSET);
+		for (part = 0; part < lp->d_npartitions; part++) {
+			if (lp->d_partitions[part].p_size == 0)
+				continue;
+			if (lp->d_partitions[part].p_fstype == FS_UNUSED)
+				continue;
+			if (first) {
+				printf(" ");
+				first = 0;
+			}
+			printf(" hd%d%c(", d.ll.dev & 0x7f, part + 'a');
+			if (lp->d_partitions[part].p_fstype < FSMAXTYPES)
+				printf("%s",
+				  fstypenames[lp->d_partitions[part].p_fstype]);
+			else
+				printf("%d", lp->d_partitions[part].p_fstype);
+			printf(")");
+		}
+		if (first == 0)
+			printf("\n");
+#endif
+	}
+}
+
 /* Determine likely partition for possible sector number of dos
  * partition.
  */

Index: src/sys/arch/i386/stand/lib/libi386.h
diff -u src/sys/arch/i386/stand/lib/libi386.h:1.31 src/sys/arch/i386/stand/lib/libi386.h:1.32
--- src/sys/arch/i386/stand/lib/libi386.h:1.31	Sat Mar 21 15:01:56 2009
+++ src/sys/arch/i386/stand/lib/libi386.h	Sun Sep 13 22:45:27 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: libi386.h,v 1.31 2009/03/21 15:01:56 ad Exp $	*/
+/*	$NetBSD: libi386.h,v 1.32 2009/09/13 22:45:27 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 1996
@@ -122,6 +122,7 @@
 struct biosdisk_extinfo;
 void biosdisk_getextinfo(int, struct biosdisk_extinfo *);
 int get_harddrives(void);
+void biosdisk_probe(void);
 
 int pcibios_cfgread(unsigned int, int, int *);
 int pcibios_cfgwrite(unsigned int, int, int);

Reply via email to