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.
This commit is contained in:
Jake Burkholder 2002-11-10 21:07:29 +00:00
parent 0ec091888c
commit 83702273a3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=106745

View File

@ -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;
}