summaryrefslogtreecommitdiff
path: root/sys/arch/i386/stand/installboot
diff options
context:
space:
mode:
authorMichael Shalayeff <mickey@cvs.openbsd.org>1997-08-22 20:03:18 +0000
committerMichael Shalayeff <mickey@cvs.openbsd.org>1997-08-22 20:03:18 +0000
commitae4acc0223181fad35c73b439070b649d61e569c (patch)
tree418683072e822b5aebda35b1c663d51639410972 /sys/arch/i386/stand/installboot
parent96fd99b46179fd2bbcabf1d6802d1dafc37a384c (diff)
fetch bios geometry for the boot hd
Diffstat (limited to 'sys/arch/i386/stand/installboot')
-rw-r--r--sys/arch/i386/stand/installboot/installboot.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/sys/arch/i386/stand/installboot/installboot.c b/sys/arch/i386/stand/installboot/installboot.c
index 43c3d50ac0b..3063302c72b 100644
--- a/sys/arch/i386/stand/installboot/installboot.c
+++ b/sys/arch/i386/stand/installboot/installboot.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: installboot.c,v 1.4 1997/07/17 22:47:01 mickey Exp $ */
+/* $OpenBSD: installboot.c,v 1.5 1997/08/22 20:03:17 mickey Exp $ */
/* $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */
/*
@@ -41,6 +41,13 @@
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
#include <ufs/ffs/fs.h>
+
+#include <vm/vm.h>
+#include <sys/sysctl.h>
+
+#include <machine/cpu.h>
+#include <machine/biosvar.h>
+
#include <err.h>
#include <a.out.h>
#include <fcntl.h>
@@ -64,6 +71,9 @@ u_int8_t *block_count_p; /* block count var. in prototype image */
u_int8_t *block_table_p; /* block number array in prototype image */
int maxblocknum; /* size of this array */
+#ifdef CPU_BIOSDEV
+int biosdev;
+#endif
char *loadprotoblocks __P((char *, long *));
int loadblocknums __P((char *, int));
@@ -127,6 +137,32 @@ main(argc, argv)
printf("device: %s\n", dev);
}
+#ifdef CPU_BIOSDEV
+ if (heads == -1 || nsectors == -1) {
+ int mib[3], size;
+
+ mib[0] = CTL_MACHDEP;
+ mib[1] = CPU_BIOSDEV;
+ size = sizeof(int);
+
+ if (sysctl(mib, 2, &biosdev, &size, NULL, 0) == -1)
+ err(1, "sysctl");
+
+ if (biosdev & 0x80) {
+ int geo;
+
+ mib[1] = CPU_BIOSGEOMETRY;
+ size = sizeof(int);
+
+ if (sysctl(mib, 2, &geo, &size, NULL, 0) == -1)
+ err(1, "sysctl");
+
+ heads = BIOSNHEADS(geo);
+ nsectors = BIOSNSECTS(geo);
+ }
+ }
+#endif
+
/* Load proto blocks into core */
if ((protostore = loadprotoblocks(proto, &protosize)) == NULL)
exit(1);