Try to preserve the fdisk table in the primary bootstrap, should it

already exist.

Mention the cases where this doesn't work in the BUGS section of the
man page.
This commit is contained in:
Joerg Wunsch 1996-02-03 21:14:09 +00:00
parent 017ef5fdc2
commit d70e4e53de
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=13892
4 changed files with 94 additions and 0 deletions

View File

@ -362,3 +362,23 @@ will not install bootstrap code that overlaps it.
When a disk name is given without a full pathname,
the constructed device name uses the ``a'' partition on the tahoe,
the ``c'' partition on all others.
.Pp
For the i386 architecture, the primary bootstrap sector contains
an embedded
.Em fdisk
table.
.Nm Disklabel
takes care to not clobber it when installing a bootstrap only
.Pq Fl B ,
or when editing an existing label
.Pq Fl e ,
but it unconditionally writes the primary bootstrap program onto
the disk for
.Fl w
or
.Fl R ,
thus replacing the
.Em fdisk
table by the dummy one in the bootstrap program. This is only of
concern if the disk is fully dedicated, so that the BSD disklabel
starts at absolute block 0 on the disk.

View File

@ -547,6 +547,10 @@ makebootarea(boot, dp, f)
#if NUMBOOT == 1
struct stat sb;
#endif
#ifdef __i386__
char *tmpbuf;
int i, found;
#endif /* i386 */
#endif
/* XXX */
@ -628,9 +632,32 @@ makebootarea(boot, dp, f)
if (b < 0)
Perror(xxboot);
#if NUMBOOT > 1
#ifdef __i386__
/*
* XXX Botch alert.
* The i386 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.)
*/
if ((tmpbuf = (char *)malloc((int)dp->d_secsize)) == 0)
Perror(xxboot);
memcpy((void *)tmpbuf, (void *)boot, (int)dp->d_secsize);
#endif /* i386 */
if (read(b, boot, (int)dp->d_secsize) < 0)
Perror(xxboot);
(void)close(b);
#ifdef __i386__
for (i = DOSPARTOFF, found = 0;
!found && i < 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));
free(tmpbuf);
#endif /* i386 */
b = open(bootxx, O_RDONLY);
if (b < 0)
Perror(bootxx);

View File

@ -362,3 +362,23 @@ will not install bootstrap code that overlaps it.
When a disk name is given without a full pathname,
the constructed device name uses the ``a'' partition on the tahoe,
the ``c'' partition on all others.
.Pp
For the i386 architecture, the primary bootstrap sector contains
an embedded
.Em fdisk
table.
.Nm Disklabel
takes care to not clobber it when installing a bootstrap only
.Pq Fl B ,
or when editing an existing label
.Pq Fl e ,
but it unconditionally writes the primary bootstrap program onto
the disk for
.Fl w
or
.Fl R ,
thus replacing the
.Em fdisk
table by the dummy one in the bootstrap program. This is only of
concern if the disk is fully dedicated, so that the BSD disklabel
starts at absolute block 0 on the disk.

View File

@ -547,6 +547,10 @@ makebootarea(boot, dp, f)
#if NUMBOOT == 1
struct stat sb;
#endif
#ifdef __i386__
char *tmpbuf;
int i, found;
#endif /* i386 */
#endif
/* XXX */
@ -628,9 +632,32 @@ makebootarea(boot, dp, f)
if (b < 0)
Perror(xxboot);
#if NUMBOOT > 1
#ifdef __i386__
/*
* XXX Botch alert.
* The i386 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.)
*/
if ((tmpbuf = (char *)malloc((int)dp->d_secsize)) == 0)
Perror(xxboot);
memcpy((void *)tmpbuf, (void *)boot, (int)dp->d_secsize);
#endif /* i386 */
if (read(b, boot, (int)dp->d_secsize) < 0)
Perror(xxboot);
(void)close(b);
#ifdef __i386__
for (i = DOSPARTOFF, found = 0;
!found && i < 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));
free(tmpbuf);
#endif /* i386 */
b = open(bootxx, O_RDONLY);
if (b < 0)
Perror(bootxx);