diff options
| author | Joerg Wunsch <joerg@FreeBSD.org> | 1996-02-03 21:14:09 +0000 |
|---|---|---|
| committer | Joerg Wunsch <joerg@FreeBSD.org> | 1996-02-03 21:14:09 +0000 |
| commit | d70e4e53de079ac077f74cdec1cca0ee19b9dc7c (patch) | |
| tree | 3e242a1ab8c0d4f21666a97084c49520fb6183e3 /sbin/bsdlabel | |
| parent | 017ef5fdc22eb6b3693ad00f1e7e0c22884ee7e0 (diff) | |
Notes
Diffstat (limited to 'sbin/bsdlabel')
| -rw-r--r-- | sbin/bsdlabel/bsdlabel.8 | 20 | ||||
| -rw-r--r-- | sbin/bsdlabel/bsdlabel.c | 27 |
2 files changed, 47 insertions, 0 deletions
diff --git a/sbin/bsdlabel/bsdlabel.8 b/sbin/bsdlabel/bsdlabel.8 index 1cc33abe7affd..ce1b1689fb375 100644 --- a/sbin/bsdlabel/bsdlabel.8 +++ b/sbin/bsdlabel/bsdlabel.8 @@ -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. diff --git a/sbin/bsdlabel/bsdlabel.c b/sbin/bsdlabel/bsdlabel.c index cf93fc4373ff1..3de7004e0f41c 100644 --- a/sbin/bsdlabel/bsdlabel.c +++ b/sbin/bsdlabel/bsdlabel.c @@ -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); |
