Drop the silly notion that i386 has two bootstrap files now that sys/boot

creates a single file named just "boot".

Apart from the fact that the option "-s" is now gone and that "-b" should
be pointed at /boot/boot instead of /boot/boot1, this patch should be
a no-op.
This commit is contained in:
phk 2003-01-26 14:35:53 +00:00
parent f48c20899a
commit 4865a58cd6
4 changed files with 70 additions and 326 deletions

View File

@ -65,8 +65,7 @@
.Nm
.Fl B
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk
.Oo Ar disktype/auto Oc
@ -75,8 +74,7 @@
.Fl B
.Op Fl n
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk Ar disktype/auto
.Oo Ar packid Oc
@ -85,8 +83,7 @@
.Fl B
.Op Fl n
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk Ar protofile
.Oo Ar disktype/auto Oc
@ -330,8 +327,7 @@ bootblocks in the slice.
.Nm
.Fl B
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk
.Oo Ar disktype Oc
@ -349,8 +345,7 @@ This command is typically run on a slice such as
.Fl B
.Op Fl n
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk Ar disktype
.Oo Ar packid Oc
@ -372,8 +367,7 @@ disklabel that would have been written will be printed to stdout.
.Fl B
.Op Fl n
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk Ar protofile
.Oo Ar disktype Oc
@ -423,12 +417,8 @@ parameters of the
.Xr disktab 5
entry for the disk if the disktab entry exists and includes those parameters.
.It
Otherwise, the default boot image names are used:
.Pa /boot/boot1
and
.Pa /boot/boot2
for the standard stage1 and stage2 boot images (details may vary
on architectures like the Alpha, where only a single-stage boot is used).
Otherwise, the default boot image name are used:
.Pa /boot/boot .
.El
.Ss Initializing/Formatting a bootable disk from scratch
.Pp
@ -743,21 +733,17 @@ partition sizes.
Install a new bootstrap on
.Pa da0s1 .
The boot code comes from
.Pa /boot/boot1
and possibly
.Pa /boot/boot2 .
.Pa /boot/boot .
On-disk and in-core labels are unchanged.
.Pp
.Dl disklabel -w -B /dev/da0s1 -b newboot1 -s newboot2 da2212
.Dl disklabel -w -B /dev/da0s1 -b newboot da2212
.Pp
Install a new label and bootstrap.
The label is derived from disktab information for
.Dq da2212
and installed both in-core and on-disk.
The bootstrap code comes from the files
.Pa /boot/newboot1
and
.Pa /boot/newboot2 .
.Pa /boot/newboot
.Pp
.Dl dd if=/dev/zero of=/dev/da0 bs=512 count=32
.Dl fdisk -BI da0

View File

@ -105,9 +105,7 @@ __FBSDID("$FreeBSD$");
#define BIG_NEWFS_CPG 64U
#if defined(__i386__)
#define NUMBOOT 2
#elif defined(__alpha__)
#define NUMBOOT 1
#else
#error I do not know about this architecture, and shall probably not be compiled for it.
#endif
@ -125,7 +123,6 @@ char *word(char *);
int getasciilabel(FILE *, struct disklabel *);
int getasciipartspec(char *, struct disklabel *, int, int);
int checklabel(struct disklabel *);
void setbootflag(struct disklabel *);
void Warning(const char *, ...) __printflike(1, 2);
void usage(void);
struct disklabel *getvirginlabel(void);
@ -150,12 +147,8 @@ char part_offset_type[MAX_NUM_PARTS];
int part_set[MAX_NUM_PARTS];
int installboot; /* non-zero if we should install a boot program */
char *bootbuf; /* pointer to buffer with remainder of boot prog */
int bootsize; /* size of remaining boot program */
char *xxboot; /* primary boot */
char *bootxx; /* secondary boot */
char boot0[MAXPATHLEN];
char boot1[MAXPATHLEN];
enum {
UNSPEC, EDIT, READ, RESTORE, WRITE, WRITEBOOT
@ -182,11 +175,6 @@ main(int argc, char *argv[])
case 'b':
xxboot = optarg;
break;
#if NUMBOOT > 1
case 's':
bootxx = optarg;
break;
#endif
case 'n':
disable_write = 1;
break;
@ -221,7 +209,7 @@ main(int argc, char *argv[])
} else {
if (op == UNSPEC)
op = READ;
xxboot = bootxx = 0;
xxboot = 0;
}
if (argc < 1)
usage();
@ -354,7 +342,6 @@ writelabel(int f, const char *boot, struct disklabel *lp)
return (0);
}
setbootflag(lp);
lp->d_magic = DISKMAGIC;
lp->d_magic2 = DISKMAGIC;
lp->d_checksum = 0;
@ -394,13 +381,6 @@ writelabel(int f, const char *boot, struct disklabel *lp)
warn("write");
return (1);
}
/*
* Output the remainder of the disklabel
*/
if (bootbuf && write(f, bootbuf, bootsize) != bootsize) {
warn("write");
return(1);
}
return (0);
}
@ -483,7 +463,7 @@ makebootarea(char *boot, struct disklabel *dp, int f)
#endif
#ifdef __i386__
char *tmpbuf;
int i, found;
int i, found, dps;
#endif
/* XXX */
@ -511,7 +491,7 @@ makebootarea(char *boot, struct disklabel *dp, int f)
* We are installing a boot program. Determine the name(s) and
* read them into the appropriate places in the boot area.
*/
if (!xxboot || !bootxx) {
if (!xxboot) {
dkbasename = np;
if ((p = rindex(dkname, '/')) == NULL)
p = dkname;
@ -522,36 +502,22 @@ makebootarea(char *boot, struct disklabel *dp, int f)
*np++ = '\0';
if (!xxboot) {
(void)sprintf(boot0, "%s/boot1", _PATH_BOOTDIR);
(void)sprintf(boot0, "%s/boot", _PATH_BOOTDIR);
xxboot = boot0;
}
#if NUMBOOT > 1
if (!bootxx) {
(void)sprintf(boot1, "%s/boot2", _PATH_BOOTDIR);
bootxx = boot1;
}
#endif
}
/*
* Strange rules:
* 1. One-piece bootstrap (hp300/hp800)
* 1. One-piece bootstrap (alpha)
* up to d_bbsize bytes of ``xxboot'' go in bootarea, the rest
* is remembered and written later following the bootarea.
* 2. Two-piece bootstraps (i386)
* up to d_secsize bytes of ``xxboot'' go in first d_secsize
* bytes of bootarea, remaining d_bbsize-d_secsize filled
* from ``bootxx''.
*/
b = open(xxboot, O_RDONLY);
if (b < 0)
err(4, "%s", xxboot);
#if NUMBOOT > 1
if (fstat(b, &sb) != 0)
err(4, "%s", xxboot);
#ifdef __i386__
if (sb.st_size > BBSIZE)
errx(4, "%s too large", xxboot);
/*
* XXX Botch alert.
* The i386 has the so-called fdisk table embedded into the
* The i386/PC98 has the so-called fdisk table embedded into the
* primary bootstrap. We take care to not clobber it, but
* only if it does already contain some data. (Otherwise,
* the xxboot provides a template.)
@ -559,75 +525,45 @@ makebootarea(char *boot, struct disklabel *dp, int f)
if ((tmpbuf = (char *)malloc((int)dp->d_secsize)) == 0)
err(4, "%s", xxboot);
memcpy((void *)tmpbuf, (void *)boot, (int)dp->d_secsize);
#endif /* __i386__ */
if (read(b, boot, (int)dp->d_secsize) < 0)
if (read(b, boot, BBSIZE) < 0)
err(4, "%s", xxboot);
(void)close(b);
/* XXX: rely on some very precise overlaps in definitions */
#ifdef PC98
dps = sizeof(struct pc98_partition);
#else
dps = sizeof(struct dos_partition);
#endif
for (i = DOSPARTOFF, found = 0;
!found && i < (int)(DOSPARTOFF + NDOSPART * sizeof(struct pc98_partition));
!found && i < (int)(DOSPARTOFF + NDOSPART * dps);
i++)
found = tmpbuf[i] != 0;
if (found)
memcpy((void *)&boot[DOSPARTOFF],
(void *)&tmpbuf[DOSPARTOFF],
NDOSPART * sizeof(struct pc98_partition));
free(tmpbuf);
#elif defined(__i386__)
for (i = DOSPARTOFF, found = 0;
!found && i < (int)(DOSPARTOFF + NDOSPART*sizeof(struct dos_partition));
i++)
found = tmpbuf[i] != 0;
if (found)
memcpy((void *)&boot[DOSPARTOFF],
(void *)&tmpbuf[DOSPARTOFF],
NDOSPART * sizeof(struct dos_partition));
NDOSPART * dps);
free(tmpbuf);
#endif /* __i386__ */
b = open(bootxx, O_RDONLY);
if (b < 0)
err(4, "%s", bootxx);
if (fstat(b, &sb) != 0)
err(4, "%s", bootxx);
if (dp->d_secsize + sb.st_size > dp->d_bbsize)
errx(4, "%s too large", bootxx);
if (read(b, &boot[dp->d_secsize],
(int)(dp->d_bbsize-dp->d_secsize)) < 0)
err(4, "%s", bootxx);
#else /* !(NUMBOOT > 1) */
#ifdef __alpha__
if (sb.st_size > BBSIZE - dp->d_secsize)
errx(4, "%s too large", xxboot);
/*
* On the alpha, the primary bootstrap starts at the
* second sector of the boot area. The first sector
* contains the label and must be edited to contain the
* size and location of the primary bootstrap.
*/
n = read(b, boot + dp->d_secsize, (int)dp->d_bbsize);
n = read(b, boot + dp->d_secsize, BBSIZE - dp->d_secsize);
if (n < 0)
err(4, "%s", xxboot);
bootinfo = (u_long *)(boot + 480);
bootinfo[0] = (n + dp->d_secsize - 1) / dp->d_secsize;
bootinfo[1] = 1; /* start at sector 1 */
bootinfo[2] = 0; /* flags (must be zero) */
#else /* !__alpha__ */
if (read(b, boot, (int)dp->d_bbsize) < 0)
err(4, "%s", xxboot);
#endif /* __alpha__ */
if (fstat(b, &sb) != 0)
err(4, "%s", xxboot);
bootsize = (int)sb.st_size - dp->d_bbsize;
if (bootsize > 0) {
/* XXX assume d_secsize is a power of two */
bootsize = (bootsize + dp->d_secsize-1) & ~(dp->d_secsize-1);
bootbuf = (char *)malloc((size_t)bootsize);
if (bootbuf == 0)
err(4, "%s", xxboot);
if (read(b, bootbuf, bootsize) < 0) {
free(bootbuf);
err(4, "%s", xxboot);
}
}
#endif /* NUMBOOT > 1 */
(void)close(b);
/*
* Make sure no part of the bootstrap is written in the area
@ -1549,47 +1485,6 @@ getvirginlabel(void)
return (&loclab);
}
/*
* If we are installing a boot program that doesn't fit in d_bbsize
* we need to mark those partitions that the boot overflows into.
* This allows newfs to prevent creation of a file system where it might
* clobber bootstrap code.
*/
void
setbootflag(struct disklabel *lp)
{
struct partition *pp;
int i, errors = 0;
char part;
u_long boffset;
if (bootbuf == 0)
return;
boffset = bootsize / lp->d_secsize;
for (i = 0; i < lp->d_npartitions; i++) {
part = 'a' + i;
pp = &lp->d_partitions[i];
if (pp->p_size == 0)
continue;
if (boffset <= pp->p_offset) {
if (pp->p_fstype == FS_BOOT)
pp->p_fstype = FS_UNUSED;
} else if (pp->p_fstype != FS_BOOT) {
if (pp->p_fstype != FS_UNUSED) {
fprintf(stderr,
"boot overlaps used partition %c\n",
part);
errors++;
} else {
pp->p_fstype = FS_BOOT;
Warning("boot overlaps partition %c, %s",
part, "marked as FS_BOOT");
}
}
}
if (errors)
errx(4, "cannot install boot program");
}
/*VARARGS1*/
void
@ -1616,21 +1511,12 @@ usage(void)
"\t\t(to edit label)",
" disklabel -R [-r] [-n] disk protofile",
"\t\t(to restore label with existing boot program)",
#if NUMBOOT > 1
" disklabel -B [-n] [ -b boot1 [ -s boot2 ] ] disk [ type ]",
"\t\t(to install boot program with existing label)",
" disklabel -w -B [-n] [ -b boot1 [ -s boot2 ] ] disk type [ packid ]",
"\t\t(to write label and boot program)",
" disklabel -R -B [-n] [ -b boot1 [ -s boot2 ] ] disk protofile [ type ]",
"\t\t(to restore label and boot program)"
#else
" disklabel -B [-n] [ -b bootprog ] disk [ type ]",
"\t\t(to install boot program with existing on-disk label)",
" disklabel -w -B [-n] [ -b bootprog ] disk type [ packid ]",
"\t\t(to write label and install boot program)",
" disklabel -R -B [-n] [ -b bootprog ] disk protofile [ type ]",
"\t\t(to restore label and install boot program)"
#endif
);
exit(1);
}

View File

@ -65,8 +65,7 @@
.Nm
.Fl B
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk
.Oo Ar disktype/auto Oc
@ -75,8 +74,7 @@
.Fl B
.Op Fl n
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk Ar disktype/auto
.Oo Ar packid Oc
@ -85,8 +83,7 @@
.Fl B
.Op Fl n
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk Ar protofile
.Oo Ar disktype/auto Oc
@ -330,8 +327,7 @@ bootblocks in the slice.
.Nm
.Fl B
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk
.Oo Ar disktype Oc
@ -349,8 +345,7 @@ This command is typically run on a slice such as
.Fl B
.Op Fl n
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk Ar disktype
.Oo Ar packid Oc
@ -372,8 +367,7 @@ disklabel that would have been written will be printed to stdout.
.Fl B
.Op Fl n
.Oo
.Fl b Ar boot1
.Fl s Ar boot2
.Fl b Ar boot
.Oc
.Ar disk Ar protofile
.Oo Ar disktype Oc
@ -423,12 +417,8 @@ parameters of the
.Xr disktab 5
entry for the disk if the disktab entry exists and includes those parameters.
.It
Otherwise, the default boot image names are used:
.Pa /boot/boot1
and
.Pa /boot/boot2
for the standard stage1 and stage2 boot images (details may vary
on architectures like the Alpha, where only a single-stage boot is used).
Otherwise, the default boot image name are used:
.Pa /boot/boot .
.El
.Ss Initializing/Formatting a bootable disk from scratch
.Pp
@ -743,21 +733,17 @@ partition sizes.
Install a new bootstrap on
.Pa da0s1 .
The boot code comes from
.Pa /boot/boot1
and possibly
.Pa /boot/boot2 .
.Pa /boot/boot .
On-disk and in-core labels are unchanged.
.Pp
.Dl disklabel -w -B /dev/da0s1 -b newboot1 -s newboot2 da2212
.Dl disklabel -w -B /dev/da0s1 -b newboot da2212
.Pp
Install a new label and bootstrap.
The label is derived from disktab information for
.Dq da2212
and installed both in-core and on-disk.
The bootstrap code comes from the files
.Pa /boot/newboot1
and
.Pa /boot/newboot2 .
.Pa /boot/newboot
.Pp
.Dl dd if=/dev/zero of=/dev/da0 bs=512 count=32
.Dl fdisk -BI da0

View File

@ -105,9 +105,7 @@ __FBSDID("$FreeBSD$");
#define BIG_NEWFS_CPG 64U
#if defined(__i386__)
#define NUMBOOT 2
#elif defined(__alpha__)
#define NUMBOOT 1
#else
#error I do not know about this architecture, and shall probably not be compiled for it.
#endif
@ -125,7 +123,6 @@ char *word(char *);
int getasciilabel(FILE *, struct disklabel *);
int getasciipartspec(char *, struct disklabel *, int, int);
int checklabel(struct disklabel *);
void setbootflag(struct disklabel *);
void Warning(const char *, ...) __printflike(1, 2);
void usage(void);
struct disklabel *getvirginlabel(void);
@ -150,12 +147,8 @@ char part_offset_type[MAX_NUM_PARTS];
int part_set[MAX_NUM_PARTS];
int installboot; /* non-zero if we should install a boot program */
char *bootbuf; /* pointer to buffer with remainder of boot prog */
int bootsize; /* size of remaining boot program */
char *xxboot; /* primary boot */
char *bootxx; /* secondary boot */
char boot0[MAXPATHLEN];
char boot1[MAXPATHLEN];
enum {
UNSPEC, EDIT, READ, RESTORE, WRITE, WRITEBOOT
@ -182,11 +175,6 @@ main(int argc, char *argv[])
case 'b':
xxboot = optarg;
break;
#if NUMBOOT > 1
case 's':
bootxx = optarg;
break;
#endif
case 'n':
disable_write = 1;
break;
@ -221,7 +209,7 @@ main(int argc, char *argv[])
} else {
if (op == UNSPEC)
op = READ;
xxboot = bootxx = 0;
xxboot = 0;
}
if (argc < 1)
usage();
@ -354,7 +342,6 @@ writelabel(int f, const char *boot, struct disklabel *lp)
return (0);
}
setbootflag(lp);
lp->d_magic = DISKMAGIC;
lp->d_magic2 = DISKMAGIC;
lp->d_checksum = 0;
@ -394,13 +381,6 @@ writelabel(int f, const char *boot, struct disklabel *lp)
warn("write");
return (1);
}
/*
* Output the remainder of the disklabel
*/
if (bootbuf && write(f, bootbuf, bootsize) != bootsize) {
warn("write");
return(1);
}
return (0);
}
@ -483,7 +463,7 @@ makebootarea(char *boot, struct disklabel *dp, int f)
#endif
#ifdef __i386__
char *tmpbuf;
int i, found;
int i, found, dps;
#endif
/* XXX */
@ -511,7 +491,7 @@ makebootarea(char *boot, struct disklabel *dp, int f)
* We are installing a boot program. Determine the name(s) and
* read them into the appropriate places in the boot area.
*/
if (!xxboot || !bootxx) {
if (!xxboot) {
dkbasename = np;
if ((p = rindex(dkname, '/')) == NULL)
p = dkname;
@ -522,36 +502,22 @@ makebootarea(char *boot, struct disklabel *dp, int f)
*np++ = '\0';
if (!xxboot) {
(void)sprintf(boot0, "%s/boot1", _PATH_BOOTDIR);
(void)sprintf(boot0, "%s/boot", _PATH_BOOTDIR);
xxboot = boot0;
}
#if NUMBOOT > 1
if (!bootxx) {
(void)sprintf(boot1, "%s/boot2", _PATH_BOOTDIR);
bootxx = boot1;
}
#endif
}
/*
* Strange rules:
* 1. One-piece bootstrap (hp300/hp800)
* 1. One-piece bootstrap (alpha)
* up to d_bbsize bytes of ``xxboot'' go in bootarea, the rest
* is remembered and written later following the bootarea.
* 2. Two-piece bootstraps (i386)
* up to d_secsize bytes of ``xxboot'' go in first d_secsize
* bytes of bootarea, remaining d_bbsize-d_secsize filled
* from ``bootxx''.
*/
b = open(xxboot, O_RDONLY);
if (b < 0)
err(4, "%s", xxboot);
#if NUMBOOT > 1
if (fstat(b, &sb) != 0)
err(4, "%s", xxboot);
#ifdef __i386__
if (sb.st_size > BBSIZE)
errx(4, "%s too large", xxboot);
/*
* XXX Botch alert.
* The i386 has the so-called fdisk table embedded into the
* The i386/PC98 has the so-called fdisk table embedded into the
* primary bootstrap. We take care to not clobber it, but
* only if it does already contain some data. (Otherwise,
* the xxboot provides a template.)
@ -559,75 +525,45 @@ makebootarea(char *boot, struct disklabel *dp, int f)
if ((tmpbuf = (char *)malloc((int)dp->d_secsize)) == 0)
err(4, "%s", xxboot);
memcpy((void *)tmpbuf, (void *)boot, (int)dp->d_secsize);
#endif /* __i386__ */
if (read(b, boot, (int)dp->d_secsize) < 0)
if (read(b, boot, BBSIZE) < 0)
err(4, "%s", xxboot);
(void)close(b);
/* XXX: rely on some very precise overlaps in definitions */
#ifdef PC98
dps = sizeof(struct pc98_partition);
#else
dps = sizeof(struct dos_partition);
#endif
for (i = DOSPARTOFF, found = 0;
!found && i < (int)(DOSPARTOFF + NDOSPART * sizeof(struct pc98_partition));
!found && i < (int)(DOSPARTOFF + NDOSPART * dps);
i++)
found = tmpbuf[i] != 0;
if (found)
memcpy((void *)&boot[DOSPARTOFF],
(void *)&tmpbuf[DOSPARTOFF],
NDOSPART * sizeof(struct pc98_partition));
free(tmpbuf);
#elif defined(__i386__)
for (i = DOSPARTOFF, found = 0;
!found && i < (int)(DOSPARTOFF + NDOSPART*sizeof(struct dos_partition));
i++)
found = tmpbuf[i] != 0;
if (found)
memcpy((void *)&boot[DOSPARTOFF],
(void *)&tmpbuf[DOSPARTOFF],
NDOSPART * sizeof(struct dos_partition));
NDOSPART * dps);
free(tmpbuf);
#endif /* __i386__ */
b = open(bootxx, O_RDONLY);
if (b < 0)
err(4, "%s", bootxx);
if (fstat(b, &sb) != 0)
err(4, "%s", bootxx);
if (dp->d_secsize + sb.st_size > dp->d_bbsize)
errx(4, "%s too large", bootxx);
if (read(b, &boot[dp->d_secsize],
(int)(dp->d_bbsize-dp->d_secsize)) < 0)
err(4, "%s", bootxx);
#else /* !(NUMBOOT > 1) */
#ifdef __alpha__
if (sb.st_size > BBSIZE - dp->d_secsize)
errx(4, "%s too large", xxboot);
/*
* On the alpha, the primary bootstrap starts at the
* second sector of the boot area. The first sector
* contains the label and must be edited to contain the
* size and location of the primary bootstrap.
*/
n = read(b, boot + dp->d_secsize, (int)dp->d_bbsize);
n = read(b, boot + dp->d_secsize, BBSIZE - dp->d_secsize);
if (n < 0)
err(4, "%s", xxboot);
bootinfo = (u_long *)(boot + 480);
bootinfo[0] = (n + dp->d_secsize - 1) / dp->d_secsize;
bootinfo[1] = 1; /* start at sector 1 */
bootinfo[2] = 0; /* flags (must be zero) */
#else /* !__alpha__ */
if (read(b, boot, (int)dp->d_bbsize) < 0)
err(4, "%s", xxboot);
#endif /* __alpha__ */
if (fstat(b, &sb) != 0)
err(4, "%s", xxboot);
bootsize = (int)sb.st_size - dp->d_bbsize;
if (bootsize > 0) {
/* XXX assume d_secsize is a power of two */
bootsize = (bootsize + dp->d_secsize-1) & ~(dp->d_secsize-1);
bootbuf = (char *)malloc((size_t)bootsize);
if (bootbuf == 0)
err(4, "%s", xxboot);
if (read(b, bootbuf, bootsize) < 0) {
free(bootbuf);
err(4, "%s", xxboot);
}
}
#endif /* NUMBOOT > 1 */
(void)close(b);
/*
* Make sure no part of the bootstrap is written in the area
@ -1549,47 +1485,6 @@ getvirginlabel(void)
return (&loclab);
}
/*
* If we are installing a boot program that doesn't fit in d_bbsize
* we need to mark those partitions that the boot overflows into.
* This allows newfs to prevent creation of a file system where it might
* clobber bootstrap code.
*/
void
setbootflag(struct disklabel *lp)
{
struct partition *pp;
int i, errors = 0;
char part;
u_long boffset;
if (bootbuf == 0)
return;
boffset = bootsize / lp->d_secsize;
for (i = 0; i < lp->d_npartitions; i++) {
part = 'a' + i;
pp = &lp->d_partitions[i];
if (pp->p_size == 0)
continue;
if (boffset <= pp->p_offset) {
if (pp->p_fstype == FS_BOOT)
pp->p_fstype = FS_UNUSED;
} else if (pp->p_fstype != FS_BOOT) {
if (pp->p_fstype != FS_UNUSED) {
fprintf(stderr,
"boot overlaps used partition %c\n",
part);
errors++;
} else {
pp->p_fstype = FS_BOOT;
Warning("boot overlaps partition %c, %s",
part, "marked as FS_BOOT");
}
}
}
if (errors)
errx(4, "cannot install boot program");
}
/*VARARGS1*/
void
@ -1616,21 +1511,12 @@ usage(void)
"\t\t(to edit label)",
" disklabel -R [-r] [-n] disk protofile",
"\t\t(to restore label with existing boot program)",
#if NUMBOOT > 1
" disklabel -B [-n] [ -b boot1 [ -s boot2 ] ] disk [ type ]",
"\t\t(to install boot program with existing label)",
" disklabel -w -B [-n] [ -b boot1 [ -s boot2 ] ] disk type [ packid ]",
"\t\t(to write label and boot program)",
" disklabel -R -B [-n] [ -b boot1 [ -s boot2 ] ] disk protofile [ type ]",
"\t\t(to restore label and boot program)"
#else
" disklabel -B [-n] [ -b bootprog ] disk [ type ]",
"\t\t(to install boot program with existing on-disk label)",
" disklabel -w -B [-n] [ -b bootprog ] disk type [ packid ]",
"\t\t(to write label and install boot program)",
" disklabel -R -B [-n] [ -b bootprog ] disk protofile [ type ]",
"\t\t(to restore label and install boot program)"
#endif
);
exit(1);
}