summaryrefslogtreecommitdiff
path: root/sys/arch/amd64
diff options
context:
space:
mode:
authorReyk Floeter <reyk@cvs.openbsd.org>2008-06-25 15:32:19 +0000
committerReyk Floeter <reyk@cvs.openbsd.org>2008-06-25 15:32:19 +0000
commitb2d60e4a17364cd0d4fa6cad7fa7ff4415ab4e69 (patch)
tree08c67b44f9857c901547755faef6aa232d3f160c /sys/arch/amd64
parent8d69526fe7791272551699d11bc09492ba95ef3e (diff)
this diff changes the bootloader to skip the CHS sanity check if LBA
(EDD) is found and OK. it will also fix chainloading into OpenBSD from grub in a few scenarios where grub doesn't report the CHS correctly but the LBA. and we don't need CHS if there is LBA. this has been in the snapshots for a while. with input from weingart@ ok deraadt@
Diffstat (limited to 'sys/arch/amd64')
-rw-r--r--sys/arch/amd64/stand/libsa/biosdev.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/sys/arch/amd64/stand/libsa/biosdev.c b/sys/arch/amd64/stand/libsa/biosdev.c
index 0e4439c8296..7358eab09f6 100644
--- a/sys/arch/amd64/stand/libsa/biosdev.c
+++ b/sys/arch/amd64/stand/libsa/biosdev.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: biosdev.c,v 1.5 2008/06/25 15:26:44 reyk Exp $ */
+/* $OpenBSD: biosdev.c,v 1.6 2008/06/25 15:32:18 reyk Exp $ */
/*
* Copyright (c) 1996 Michael Shalayeff
@@ -124,14 +124,6 @@ bios_getdiskinfo(int dev, bios_diskinfo_t *pdi)
pdi->bios_cylinders &= 0x3ff;
pdi->bios_cylinders++;
- /* Sanity check */
- if (!pdi->bios_cylinders || !pdi->bios_heads || !pdi->bios_sectors)
- return(1);
-
- /* CD-ROMs sometimes return heads == 1 */
- if (pdi->bios_heads < 2)
- return(1);
-
/* NOTE:
* This currently hangs/reboots some machines
* The IBM ThinkPad 750ED for one.
@@ -173,6 +165,18 @@ bios_getdiskinfo(int dev, bios_diskinfo_t *pdi)
} else
pdi->bios_edd = -1;
+ /* Skip sanity check for CHS options in EDD mode. */
+ if (pdi->bios_edd != -1)
+ return 0;
+
+ /* Sanity check */
+ if (!pdi->bios_cylinders || !pdi->bios_heads || !pdi->bios_sectors)
+ return(1);
+
+ /* CD-ROMs sometimes return heads == 1 */
+ if (pdi->bios_heads < 2)
+ return(1);
+
return(0);
}
@@ -410,7 +414,8 @@ bios_getdisklabel(bios_diskinfo_t *bd, struct disklabel *label)
int n = 8;
/* Sanity check */
- if(bd->bios_heads == 0 || bd->bios_sectors == 0)
+ if (bd->bios_edd == -1 &&
+ (bd->bios_heads == 0 || bd->bios_sectors == 0))
return("failed to read disklabel");
/* MBR is a harddisk thing */