aboutsummaryrefslogtreecommitdiff
path: root/release
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2000-07-12 18:08:27 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2000-07-12 18:08:27 +0000
commitfcb7c051337fc7ea085ccae50fd43dc693614849 (patch)
treeafd274016cc46951c1d8a14aa5c646b7f2d0a9bd /release
parentbe0fdc464622c725fe2bd900f21411ed0068f715 (diff)
downloadsrc-fcb7c051337fc7ea085ccae50fd43dc693614849.tar.gz
src-fcb7c051337fc7ea085ccae50fd43dc693614849.zip
- Support MBR boot loaders that are larger than one sector size.
- Axe the 1024 cylinder checks as they are no longer relevant.
Notes
Notes: svn path=/head/; revision=63031
Diffstat (limited to 'release')
-rw-r--r--release/sysinstall/Makefile2
-rw-r--r--release/sysinstall/disks.c49
-rw-r--r--release/sysinstall/label.c9
3 files changed, 33 insertions, 27 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);