diff options
author | jhb <jhb@FreeBSD.org> | 2000-07-12 18:08:27 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2000-07-12 18:08:27 +0000 |
commit | 2913657a9794149a1d43420d2ee7df734392da82 (patch) | |
tree | 7ef05cf699ae002d65dd1cc4b40589130b3b574c /usr.sbin | |
parent | b4c0d6aa68030b0d552c9dc5ca7eb8f0c83657ee (diff) | |
download | FreeBSD-src-2913657a9794149a1d43420d2ee7df734392da82.zip FreeBSD-src-2913657a9794149a1d43420d2ee7df734392da82.tar.gz |
- Support MBR boot loaders that are larger than one sector size.
- Axe the 1024 cylinder checks as they are no longer relevant.
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/sade/Makefile | 2 | ||||
-rw-r--r-- | usr.sbin/sade/disks.c | 49 | ||||
-rw-r--r-- | usr.sbin/sade/label.c | 9 | ||||
-rw-r--r-- | usr.sbin/sysinstall/Makefile | 2 | ||||
-rw-r--r-- | usr.sbin/sysinstall/disks.c | 49 | ||||
-rw-r--r-- | usr.sbin/sysinstall/label.c | 9 |
6 files changed, 66 insertions, 54 deletions
diff --git a/usr.sbin/sade/Makefile b/usr.sbin/sade/Makefile index 5bf628c..6620bc0 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 1dde2b0..a5c636a 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 460f194..db5061a 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 5bf628c..6620bc0 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 1dde2b0..a5c636a 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 460f194..db5061a 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); |