summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2010-12-07 00:44:49 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2010-12-07 00:44:49 +0000
commit281f5823f1e95cc6a64d16e6f386b170ca4dfda3 (patch)
tree17b099676200ba95500467b7daa686da092d1fb8 /sys/arch
parentc6ff01bb8cc597758e9b06095e682bae725e888c (diff)
bring src/sys/arch/amd64/amd64/dkcsum.c r1.16 over to i386:
the boot loader passes a variable that identifies the disk its booting off made up of a bunch of fields like adapter, controller, disk, and partition offsets, plus a table of all the disks it can see which includes this id and a checksum. the kernel goes through and checksums the disks and then maps that back to the id associated with that disk, and then compares some of the fields in those ids against the boot disks id to figure out which disk its on. the problem is we overflow one of those fields (the disk id one). since the other fields are set to 0 by the boot loader, this doesnt really matter that much. however, since those fields are now significant because of the overflow, we should compare them too. this prevents sd16 being matched as the boot disk after sd0 on my system with 25 disks attached. ok krw@ weingart@ ithe boot loader passes a variable that identifies the disk its booting off made up of a bunch of fields like adapter, controller, disk, and partition offsets, plus a table of all the disks it can see which includes this id and a checksum. the kernel goes through and checksums the disks and then maps that back to the id associated with that disk, and then compares some of the fields in those ids against the boot disks id to figure out which disk its on. the problem is we overflow one of those fields (the disk id one). since the other fields are set to 0 by the boot loader, this doesnt really matter that much. however, since those fields are now significant because of the overflow, we should compare them too. this prevents sd16 being matched as the boot disk after sd0 on my system with 25 disks attached. requested by deraadt@ ok krw@ weingart@
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/i386/i386/dkcsum.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/sys/arch/i386/i386/dkcsum.c b/sys/arch/i386/i386/dkcsum.c
index 61d39e8cf92..a381235654c 100644
--- a/sys/arch/i386/i386/dkcsum.c
+++ b/sys/arch/i386/i386/dkcsum.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dkcsum.c,v 1.26 2008/12/10 23:41:19 krw Exp $ */
+/* $OpenBSD: dkcsum.c,v 1.27 2010/12/07 00:44:48 dlg Exp $ */
/*-
* Copyright (c) 1997 Niklas Hallqvist. All rights reserved.
@@ -71,10 +71,13 @@ dkcsumattach(void)
#ifdef DEBUG
printf("dkcsum: bootdev=%#x\n", bootdev);
- for (bdi = bios_diskinfo; bdi->bios_number != -1; bdi++)
- if (bdi->bios_number & 0x80)
- printf("dkcsum: BIOS drive %#x checksum is %#x\n",
- bdi->bios_number, bdi->checksum);
+ for (bdi = bios_diskinfo; bdi->bios_number != -1; bdi++) {
+ if (bdi->bios_number & 0x80) {
+ printf("dkcsum: BIOS drive %#x bsd_dev=%#x "
+ "checksum=%#x\n", bdi->bios_number, bdi->bsd_dev,
+ bdi->checksum);
+ }
+ }
#endif
pribootdev = altbootdev = 0;
@@ -180,7 +183,9 @@ dkcsumattach(void)
*/
/* B_TYPE dependent hd unit counting bootblocks */
- if ((B_TYPE(bootdev) == B_TYPE(hit->bsd_dev)) &&
+ if ((B_ADAPTOR(bootdev) == B_ADAPTOR(hit->bsd_dev)) &&
+ (B_CONTROLLER(bootdev) == B_CONTROLLER(hit->bsd_dev)) &&
+ (B_TYPE(bootdev) == B_TYPE(hit->bsd_dev)) &&
(B_UNIT(bootdev) == B_UNIT(hit->bsd_dev))) {
int type, ctrl, adap, part, unit;