summaryrefslogtreecommitdiffstats
path: root/sys/boot/common
diff options
context:
space:
mode:
Diffstat (limited to 'sys/boot/common')
-rw-r--r--sys/boot/common/disk.c12
-rw-r--r--sys/boot/common/disk.h5
2 files changed, 14 insertions, 3 deletions
diff --git a/sys/boot/common/disk.c b/sys/boot/common/disk.c
index 5711a10..0ad9e37 100644
--- a/sys/boot/common/disk.c
+++ b/sys/boot/common/disk.c
@@ -173,7 +173,13 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
rc = ENXIO;
goto out;
}
- if (dev->d_slice > 0) {
+ if (ptable_gettype(od->table) == PTABLE_BSD &&
+ dev->d_partition >= 0) {
+ /* It doesn't matter what value has d_slice */
+ rc = ptable_getpart(od->table, &part, dev->d_partition);
+ if (rc == 0)
+ dev->d_offset = part.start;
+ } else if (dev->d_slice > 0) {
/* Try to get information about partition */
rc = ptable_getpart(od->table, &part, dev->d_slice);
if (rc != 0) /* Partition doesn't exist */
@@ -247,9 +253,9 @@ disk_fmtdev(struct disk_devdesc *dev)
#ifdef LOADER_MBR_SUPPORT
cp += sprintf(cp, "s%d", dev->d_slice);
#endif
- if (dev->d_partition >= 0)
- cp += sprintf(cp, "%c", dev->d_partition + 'a');
}
+ if (dev->d_partition >= 0)
+ cp += sprintf(cp, "%c", dev->d_partition + 'a');
strcat(cp, ":");
return (buf);
}
diff --git a/sys/boot/common/disk.h b/sys/boot/common/disk.h
index dc2c3c1..4894661 100644
--- a/sys/boot/common/disk.h
+++ b/sys/boot/common/disk.h
@@ -45,6 +45,11 @@
* d_slice = MBR slice number (typically 1..4)
* d_partition = disklabel partition (typically 0..7)
*
+ * BSD disklabel partition on the true dedicated disk:
+ *
+ * d_slice = -1
+ * d_partition = disklabel partition (typically 0..7)
+ *
* GPT partition:
*
* d_slice = GPT partition number (typically 1..N)
OpenPOWER on IntegriCloud