diff options
author | jake <jake@FreeBSD.org> | 2002-11-10 21:07:29 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2002-11-10 21:07:29 +0000 |
commit | 8ea3f3d908c98554ba19652da42709bb8d2d9c06 (patch) | |
tree | 36489107b5968ee1a1c75438a0aa6311fe399192 /lib/libdisk/write_sparc64_disk.c | |
parent | b10a024e8b51a395d3e56f63e807bc51e4e1eb61 (diff) | |
download | FreeBSD-src-8ea3f3d908c98554ba19652da42709bb8d2d9c06.zip FreeBSD-src-8ea3f3d908c98554ba19652da42709bb8d2d9c06.tar.gz |
Write the boot block to the first 16 sectors of all partitions, instead of
always to the first 16 sectors of the disk. The firmware reads the boot
code from a partition, defaulting to 'a' if none is specified, which only
corresponds to the first 16 sectors of the disk if 'a' is first. Solaris
often makes the swap partition first, instead of the root partition, and
users expect to be able to do the same with freebsd as well. This also
allows one to temporarily boot from another partition if the boot block
on the root partition gets scrambled somehow.
Diffstat (limited to 'lib/libdisk/write_sparc64_disk.c')
-rw-r--r-- | lib/libdisk/write_sparc64_disk.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/lib/libdisk/write_sparc64_disk.c b/lib/libdisk/write_sparc64_disk.c index bf6c248..1269a06 100644 --- a/lib/libdisk/write_sparc64_disk.c +++ b/lib/libdisk/write_sparc64_disk.c @@ -36,6 +36,15 @@ Write_Disk(const struct disk *d1) char device[64]; int fd; + strcpy(device,_PATH_DEV); + strcat(device,d1->name); + + fd = open(device,O_RDWR); + if (fd < 0) { + warn("open(%s) failed", device); + return (1); + } + sl = calloc(sizeof *sl, 1); c = d1->chunks; c2 = c->part; @@ -70,6 +79,10 @@ Write_Disk(const struct disk *d1) i = *p - 'a'; sl->sl_part[i].sdkp_cyloffset = c1->offset / secpercyl; sl->sl_part[i].sdkp_nsectors = c1->size; + for (i = 1; i < 16; i++) { + write_block(fd, c1->offset + i, d1->boot1 + (i * 512), + 512); + } } /* @@ -87,20 +100,8 @@ Write_Disk(const struct disk *d1) cksum ^= *sp1++; sl->sl_cksum = cksum; - strcpy(device,_PATH_DEV); - strcat(device,d1->name); - - fd = open(device,O_RDWR); - if (fd < 0) { - warn("open(%s) failed", device); - return (1); - } - write_block(fd, 0, sl, sizeof *sl); - for (i = 1; i < 16; i++) - write_block(fd, i, d1->boot1 + (i * 512), 512); - close(fd); return 0; } |