From fcb7c051337fc7ea085ccae50fd43dc693614849 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 12 Jul 2000 18:08:27 +0000 Subject: [PATCH] - Support MBR boot loaders that are larger than one sector size. - Axe the 1024 cylinder checks as they are no longer relevant. --- release/sysinstall/Makefile | 2 ++ release/sysinstall/disks.c | 49 +++++++++++++++++++++++------------- release/sysinstall/label.c | 9 ------- usr.sbin/sade/Makefile | 2 ++ usr.sbin/sade/disks.c | 49 +++++++++++++++++++++++------------- usr.sbin/sade/label.c | 9 ------- usr.sbin/sysinstall/Makefile | 2 ++ usr.sbin/sysinstall/disks.c | 49 +++++++++++++++++++++++------------- usr.sbin/sysinstall/label.c | 9 ------- 9 files changed, 99 insertions(+), 81 deletions(-) diff --git a/release/sysinstall/Makefile b/release/sysinstall/Makefile index 5bf628c0371e..6620bc0fd92e 100644 --- a/release/sysinstall/Makefile +++ b/release/sysinstall/Makefile @@ -60,7 +60,9 @@ makedevs.c: Makefile rtermcap keymap.h >> makedevs.tmp .if ${MACHINE} == "i386" file2c 'u_char boot0[] = {' '};' < /boot/boot0 >> makedevs.tmp + echo "size_t boot0_size = sizeof(boot0);" >> makedevs.tmp file2c 'u_char mbr[] = {' '};' < /boot/mbr >> makedevs.tmp + echo "size_t mbr_size = sizeof(mbr);" >> makedevs.tmp .endif mv makedevs.tmp makedevs.c diff --git a/release/sysinstall/disks.c b/release/sysinstall/disks.c index 1dde2b07b970..a5c636a2eb17 100644 --- a/release/sysinstall/disks.c +++ b/release/sysinstall/disks.c @@ -164,11 +164,12 @@ print_command_summary() } #ifndef PC98 -static u_char * -getBootMgr(char *dname) +static void +getBootMgr(char *dname, u_char **bootCode, size_t *bootCodeSize) { #ifndef __alpha__ /* only meaningful on x86 */ extern u_char mbr[], boot0[]; + extern size_t mbr_size, boot0_size; char str[80]; char *cp; int i = 0; @@ -191,18 +192,21 @@ getBootMgr(char *dname) if (cp || i) { switch (BootMgr) { case 0: - return boot0; - + *bootCode = boot0; + *bootCodeSize = boot0_size; + return; case 1: - return mbr; - + *bootCode = mbr; + *bootCodeSize = mbr_size; + return; case 2: default: break; } } #endif - return NULL; + *bootCode = NULL; + *bootCodeSize = 0; } #endif @@ -234,6 +238,7 @@ diskPartition(Device *dev) char *msg = NULL; #ifndef PC98 u_char *mbrContents; + size_t mbrSize; #endif WINDOW *w = savescr(); Disk *d = (Disk *)dev->private; @@ -511,10 +516,12 @@ diskPartition(Device *dev) * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. */ if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1))) - mbrContents = getBootMgr(d->name); - else + getBootMgr(d->name, &mbrContents, &mbrSize); + else { mbrContents = NULL; - Set_Boot_Mgr(d, mbrContents); + mbrSize = 0; + } + Set_Boot_Mgr(d, mbrContents, mbrSize); #endif /* !PC98 */ if (DITEM_STATUS(diskPartitionWrite(NULL)) != DITEM_SUCCESS) @@ -548,17 +555,22 @@ diskPartition(Device *dev) * booteasy or a "standard" MBR -- both would be fatal in this case. */ #if 0 - if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL - && (mbrContents = getBootMgr(d->name)) != NULL) - Set_Boot_Mgr(d, mbrContents); + if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL) { + getBootMgr(d->name, &mbrContents, &mbrSize); + if (mbrContents != NULL) + Set_Boot_Mgr(d, mbrContents, mbrSize); + } #else /* * Don't offer to update the MBR on this disk if the first "real" chunk looks like * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. */ - if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1)) && - (mbrContents = getBootMgr(d->name)) != NULL) - Set_Boot_Mgr(d, mbrContents); + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) { + getBootMgr(d->name, &mbrContents, &mbrSize); + if (mbrContents != NULL) + Set_Boot_Mgr(d, mbrContents, mbrSize); + } #endif #endif /* !PC98 */ break; @@ -764,6 +776,7 @@ diskPartitionNonInteractive(Device *dev) int i, sz, all_disk = 0; #ifndef PC98 u_char *mbrContents; + size_t mbrSize; #endif Disk *d = (Disk *)dev->private; @@ -857,8 +870,8 @@ diskPartitionNonInteractive(Device *dev) } #ifndef PC98 if (!all_disk) { - mbrContents = getBootMgr(d->name); - Set_Boot_Mgr(d, mbrContents); + getBootMgr(d->name, &mbrContents, &mbrSize); + Set_Boot_Mgr(d, mbrContents, mbrSize); } #endif variable_set2(DISK_PARTITIONED, "yes", 0); diff --git a/release/sysinstall/label.c b/release/sysinstall/label.c index 460f19404d2a..db5061a9c18d 100644 --- a/release/sysinstall/label.c +++ b/release/sysinstall/label.c @@ -969,15 +969,6 @@ diskLabel(Device *dev) clear_wins(); break; } - if ((flags & CHUNK_IS_ROOT) && (tmp->flags & CHUNK_PAST_1024)) { - msgConfirm("This region cannot be used for your root partition as it starts\n" - "or extends past the 1024'th cylinder mark and is thus a\n" - "poor location to boot from. Please choose another\n" - "location (or smaller size) for your root partition and try again!"); - Delete_Chunk(label_chunk_info[here].c->disk, tmp); - clear_wins(); - break; - } if (type != PART_SWAP) { /* This is needed to tell the newfs -u about the size */ tmp->private_data = new_part(p->mountpoint, p->newfs, tmp->size); diff --git a/usr.sbin/sade/Makefile b/usr.sbin/sade/Makefile index 5bf628c0371e..6620bc0fd92e 100644 --- a/usr.sbin/sade/Makefile +++ b/usr.sbin/sade/Makefile @@ -60,7 +60,9 @@ makedevs.c: Makefile rtermcap keymap.h >> makedevs.tmp .if ${MACHINE} == "i386" file2c 'u_char boot0[] = {' '};' < /boot/boot0 >> makedevs.tmp + echo "size_t boot0_size = sizeof(boot0);" >> makedevs.tmp file2c 'u_char mbr[] = {' '};' < /boot/mbr >> makedevs.tmp + echo "size_t mbr_size = sizeof(mbr);" >> makedevs.tmp .endif mv makedevs.tmp makedevs.c diff --git a/usr.sbin/sade/disks.c b/usr.sbin/sade/disks.c index 1dde2b07b970..a5c636a2eb17 100644 --- a/usr.sbin/sade/disks.c +++ b/usr.sbin/sade/disks.c @@ -164,11 +164,12 @@ print_command_summary() } #ifndef PC98 -static u_char * -getBootMgr(char *dname) +static void +getBootMgr(char *dname, u_char **bootCode, size_t *bootCodeSize) { #ifndef __alpha__ /* only meaningful on x86 */ extern u_char mbr[], boot0[]; + extern size_t mbr_size, boot0_size; char str[80]; char *cp; int i = 0; @@ -191,18 +192,21 @@ getBootMgr(char *dname) if (cp || i) { switch (BootMgr) { case 0: - return boot0; - + *bootCode = boot0; + *bootCodeSize = boot0_size; + return; case 1: - return mbr; - + *bootCode = mbr; + *bootCodeSize = mbr_size; + return; case 2: default: break; } } #endif - return NULL; + *bootCode = NULL; + *bootCodeSize = 0; } #endif @@ -234,6 +238,7 @@ diskPartition(Device *dev) char *msg = NULL; #ifndef PC98 u_char *mbrContents; + size_t mbrSize; #endif WINDOW *w = savescr(); Disk *d = (Disk *)dev->private; @@ -511,10 +516,12 @@ diskPartition(Device *dev) * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. */ if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1))) - mbrContents = getBootMgr(d->name); - else + getBootMgr(d->name, &mbrContents, &mbrSize); + else { mbrContents = NULL; - Set_Boot_Mgr(d, mbrContents); + mbrSize = 0; + } + Set_Boot_Mgr(d, mbrContents, mbrSize); #endif /* !PC98 */ if (DITEM_STATUS(diskPartitionWrite(NULL)) != DITEM_SUCCESS) @@ -548,17 +555,22 @@ diskPartition(Device *dev) * booteasy or a "standard" MBR -- both would be fatal in this case. */ #if 0 - if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL - && (mbrContents = getBootMgr(d->name)) != NULL) - Set_Boot_Mgr(d, mbrContents); + if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL) { + getBootMgr(d->name, &mbrContents, &mbrSize); + if (mbrContents != NULL) + Set_Boot_Mgr(d, mbrContents, mbrSize); + } #else /* * Don't offer to update the MBR on this disk if the first "real" chunk looks like * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. */ - if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1)) && - (mbrContents = getBootMgr(d->name)) != NULL) - Set_Boot_Mgr(d, mbrContents); + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) { + getBootMgr(d->name, &mbrContents, &mbrSize); + if (mbrContents != NULL) + Set_Boot_Mgr(d, mbrContents, mbrSize); + } #endif #endif /* !PC98 */ break; @@ -764,6 +776,7 @@ diskPartitionNonInteractive(Device *dev) int i, sz, all_disk = 0; #ifndef PC98 u_char *mbrContents; + size_t mbrSize; #endif Disk *d = (Disk *)dev->private; @@ -857,8 +870,8 @@ diskPartitionNonInteractive(Device *dev) } #ifndef PC98 if (!all_disk) { - mbrContents = getBootMgr(d->name); - Set_Boot_Mgr(d, mbrContents); + getBootMgr(d->name, &mbrContents, &mbrSize); + Set_Boot_Mgr(d, mbrContents, mbrSize); } #endif variable_set2(DISK_PARTITIONED, "yes", 0); diff --git a/usr.sbin/sade/label.c b/usr.sbin/sade/label.c index 460f19404d2a..db5061a9c18d 100644 --- a/usr.sbin/sade/label.c +++ b/usr.sbin/sade/label.c @@ -969,15 +969,6 @@ diskLabel(Device *dev) clear_wins(); break; } - if ((flags & CHUNK_IS_ROOT) && (tmp->flags & CHUNK_PAST_1024)) { - msgConfirm("This region cannot be used for your root partition as it starts\n" - "or extends past the 1024'th cylinder mark and is thus a\n" - "poor location to boot from. Please choose another\n" - "location (or smaller size) for your root partition and try again!"); - Delete_Chunk(label_chunk_info[here].c->disk, tmp); - clear_wins(); - break; - } if (type != PART_SWAP) { /* This is needed to tell the newfs -u about the size */ tmp->private_data = new_part(p->mountpoint, p->newfs, tmp->size); diff --git a/usr.sbin/sysinstall/Makefile b/usr.sbin/sysinstall/Makefile index 5bf628c0371e..6620bc0fd92e 100644 --- a/usr.sbin/sysinstall/Makefile +++ b/usr.sbin/sysinstall/Makefile @@ -60,7 +60,9 @@ makedevs.c: Makefile rtermcap keymap.h >> makedevs.tmp .if ${MACHINE} == "i386" file2c 'u_char boot0[] = {' '};' < /boot/boot0 >> makedevs.tmp + echo "size_t boot0_size = sizeof(boot0);" >> makedevs.tmp file2c 'u_char mbr[] = {' '};' < /boot/mbr >> makedevs.tmp + echo "size_t mbr_size = sizeof(mbr);" >> makedevs.tmp .endif mv makedevs.tmp makedevs.c diff --git a/usr.sbin/sysinstall/disks.c b/usr.sbin/sysinstall/disks.c index 1dde2b07b970..a5c636a2eb17 100644 --- a/usr.sbin/sysinstall/disks.c +++ b/usr.sbin/sysinstall/disks.c @@ -164,11 +164,12 @@ print_command_summary() } #ifndef PC98 -static u_char * -getBootMgr(char *dname) +static void +getBootMgr(char *dname, u_char **bootCode, size_t *bootCodeSize) { #ifndef __alpha__ /* only meaningful on x86 */ extern u_char mbr[], boot0[]; + extern size_t mbr_size, boot0_size; char str[80]; char *cp; int i = 0; @@ -191,18 +192,21 @@ getBootMgr(char *dname) if (cp || i) { switch (BootMgr) { case 0: - return boot0; - + *bootCode = boot0; + *bootCodeSize = boot0_size; + return; case 1: - return mbr; - + *bootCode = mbr; + *bootCodeSize = mbr_size; + return; case 2: default: break; } } #endif - return NULL; + *bootCode = NULL; + *bootCodeSize = 0; } #endif @@ -234,6 +238,7 @@ diskPartition(Device *dev) char *msg = NULL; #ifndef PC98 u_char *mbrContents; + size_t mbrSize; #endif WINDOW *w = savescr(); Disk *d = (Disk *)dev->private; @@ -511,10 +516,12 @@ diskPartition(Device *dev) * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. */ if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1))) - mbrContents = getBootMgr(d->name); - else + getBootMgr(d->name, &mbrContents, &mbrSize); + else { mbrContents = NULL; - Set_Boot_Mgr(d, mbrContents); + mbrSize = 0; + } + Set_Boot_Mgr(d, mbrContents, mbrSize); #endif /* !PC98 */ if (DITEM_STATUS(diskPartitionWrite(NULL)) != DITEM_SUCCESS) @@ -548,17 +555,22 @@ diskPartition(Device *dev) * booteasy or a "standard" MBR -- both would be fatal in this case. */ #if 0 - if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL - && (mbrContents = getBootMgr(d->name)) != NULL) - Set_Boot_Mgr(d, mbrContents); + if ((d->chunks->part->flags & CHUNK_FORCE_ALL) != CHUNK_FORCE_ALL) { + getBootMgr(d->name, &mbrContents, &mbrSize); + if (mbrContents != NULL) + Set_Boot_Mgr(d, mbrContents, mbrSize); + } #else /* * Don't offer to update the MBR on this disk if the first "real" chunk looks like * a FreeBSD "all disk" partition, or the disk is entirely FreeBSD. */ - if (((d->chunks->part->type != freebsd) || (d->chunks->part->offset > 1)) && - (mbrContents = getBootMgr(d->name)) != NULL) - Set_Boot_Mgr(d, mbrContents); + if ((d->chunks->part->type != freebsd) || + (d->chunks->part->offset > 1)) { + getBootMgr(d->name, &mbrContents, &mbrSize); + if (mbrContents != NULL) + Set_Boot_Mgr(d, mbrContents, mbrSize); + } #endif #endif /* !PC98 */ break; @@ -764,6 +776,7 @@ diskPartitionNonInteractive(Device *dev) int i, sz, all_disk = 0; #ifndef PC98 u_char *mbrContents; + size_t mbrSize; #endif Disk *d = (Disk *)dev->private; @@ -857,8 +870,8 @@ diskPartitionNonInteractive(Device *dev) } #ifndef PC98 if (!all_disk) { - mbrContents = getBootMgr(d->name); - Set_Boot_Mgr(d, mbrContents); + getBootMgr(d->name, &mbrContents, &mbrSize); + Set_Boot_Mgr(d, mbrContents, mbrSize); } #endif variable_set2(DISK_PARTITIONED, "yes", 0); diff --git a/usr.sbin/sysinstall/label.c b/usr.sbin/sysinstall/label.c index 460f19404d2a..db5061a9c18d 100644 --- a/usr.sbin/sysinstall/label.c +++ b/usr.sbin/sysinstall/label.c @@ -969,15 +969,6 @@ diskLabel(Device *dev) clear_wins(); break; } - if ((flags & CHUNK_IS_ROOT) && (tmp->flags & CHUNK_PAST_1024)) { - msgConfirm("This region cannot be used for your root partition as it starts\n" - "or extends past the 1024'th cylinder mark and is thus a\n" - "poor location to boot from. Please choose another\n" - "location (or smaller size) for your root partition and try again!"); - Delete_Chunk(label_chunk_info[here].c->disk, tmp); - clear_wins(); - break; - } if (type != PART_SWAP) { /* This is needed to tell the newfs -u about the size */ tmp->private_data = new_part(p->mountpoint, p->newfs, tmp->size);