summaryrefslogtreecommitdiffstats
path: root/sbin/gpt/create.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/gpt/create.c')
-rw-r--r--sbin/gpt/create.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/sbin/gpt/create.c b/sbin/gpt/create.c
index ec2b121..e9ac8ce 100644
--- a/sbin/gpt/create.c
+++ b/sbin/gpt/create.c
@@ -58,6 +58,7 @@ create(int fd)
map_t *gpt, *tpg;
map_t *tbl, *lbt;
map_t *map;
+ struct mbr *mbr;
struct gpt_hdr *hdr;
struct gpt_ent *ent;
unsigned int i;
@@ -67,6 +68,40 @@ create(int fd)
warnx("%s: error: device already contains a GPT", device_name);
return;
}
+ if (map_find(MAP_TYPE_MBR) != NULL) {
+ warnx("%s: error: device contains a MBR", device_name);
+ return;
+ }
+
+ /*
+ * Create PMBR.
+ */
+ if (map_find(MAP_TYPE_PMBR) == NULL) {
+ if (map_free(0LL, 1LL) == 0) {
+ warnx("%s: error: no room for the PMBR", device_name);
+ return;
+ }
+ mbr = gpt_read(fd, 0LL, 1);
+ bzero(mbr, sizeof(*mbr));
+ mbr->mbr_sig = MBR_SIG;
+ mbr->mbr_part[0].part_shd = 0xff;
+ mbr->mbr_part[0].part_ssect = 0xff;
+ mbr->mbr_part[0].part_scyl = 0xff;
+ mbr->mbr_part[0].part_typ = 0xee;
+ mbr->mbr_part[0].part_ehd = 0xff;
+ mbr->mbr_part[0].part_esect = 0xff;
+ mbr->mbr_part[0].part_ecyl = 0xff;
+ mbr->mbr_part[0].part_start_lo = 1;
+ if (mediasz > 0xffffffff) {
+ mbr->mbr_part[0].part_size_lo = 0xffff;
+ mbr->mbr_part[0].part_size_hi = 0xffff;
+ } else {
+ mbr->mbr_part[0].part_size_lo = mediasz & 0xffff;
+ mbr->mbr_part[0].part_size_hi = mediasz >> 16;
+ }
+ map = map_add(0LL, 1LL, MAP_TYPE_PMBR, mbr);
+ gpt_write(fd, map);
+ }
/* Get the amount of free space after the MBR */
blocks = map_free(1LL, 0LL);
OpenPOWER on IntegriCloud