diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2008-01-24 22:23:22 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2008-01-24 22:23:22 +0000 |
| commit | 690c0ab6a832e78e99afa9dcf3c4bccaac34fa5e (patch) | |
| tree | 60d1a694281e476f7227c2582b2e5b9d1f77a3b2 /sbin | |
| parent | 94ed9b290fba911365b80010f7a0df20de887b4a (diff) | |
Notes
Diffstat (limited to 'sbin')
| -rw-r--r-- | sbin/gpt/Makefile | 4 | ||||
| -rw-r--r-- | sbin/gpt/add.c | 76 | ||||
| -rw-r--r-- | sbin/gpt/gpt.8 | 45 | ||||
| -rw-r--r-- | sbin/gpt/gpt.c | 1 | ||||
| -rw-r--r-- | sbin/gpt/gpt.h | 2 | ||||
| -rw-r--r-- | sbin/gpt/show.c | 3 |
6 files changed, 95 insertions, 36 deletions
diff --git a/sbin/gpt/Makefile b/sbin/gpt/Makefile index cfae78d03cf2..b619b00f3002 100644 --- a/sbin/gpt/Makefile +++ b/sbin/gpt/Makefile @@ -1,8 +1,8 @@ # $FreeBSD$ PROG= gpt -SRCS= add.c create.c destroy.c gpt.c label.c map.c migrate.c recover.c \ - remove.c show.c +SRCS= add.c boot.c create.c destroy.c gpt.c label.c map.c migrate.c \ + recover.c remove.c show.c WARNS?= 4 MAN= gpt.8 diff --git a/sbin/gpt/add.c b/sbin/gpt/add.c index 348989fb7e2a..b2c20a0302b9 100644 --- a/sbin/gpt/add.c +++ b/sbin/gpt/add.c @@ -39,9 +39,9 @@ __FBSDID("$FreeBSD$"); #include "map.h" #include "gpt.h" -static uuid_t type; -static off_t block, size; -static unsigned int entry; +static uuid_t add_type; +static off_t add_block, add_size; +static unsigned int add_entry; static void usage_add(void) @@ -53,8 +53,8 @@ usage_add(void) exit(1); } -static void -add(int fd) +map_t * +gpt_add_part(int fd, uuid_t type, off_t start, off_t size, unsigned int *entry) { map_t *gpt, *tpg; map_t *tbl, *lbt; @@ -67,38 +67,38 @@ add(int fd) if (gpt == NULL) { warnx("%s: error: no primary GPT header; run create or recover", device_name); - return; + return (NULL); } tpg = map_find(MAP_TYPE_SEC_GPT_HDR); if (tpg == NULL) { warnx("%s: error: no secondary GPT header; run recover", device_name); - return; + return (NULL); } tbl = map_find(MAP_TYPE_PRI_GPT_TBL); lbt = map_find(MAP_TYPE_SEC_GPT_TBL); if (tbl == NULL || lbt == NULL) { warnx("%s: error: run recover -- trust me", device_name); - return; + return (NULL); } hdr = gpt->map_data; - if (entry > le32toh(hdr->hdr_entries)) { + if (*entry > le32toh(hdr->hdr_entries)) { warnx("%s: error: index %u out of range (%u max)", device_name, - entry, le32toh(hdr->hdr_entries)); - return; + *entry, le32toh(hdr->hdr_entries)); + return (NULL); } - if (entry > 0) { - i = entry - 1; + if (*entry > 0) { + i = *entry - 1; ent = (void*)((char*)tbl->map_data + i * le32toh(hdr->hdr_entsz)); if (!uuid_is_nil(&ent->ent_type, NULL)) { warnx("%s: error: entry at index %u is not free", - device_name, entry); - return; + device_name, *entry); + return (NULL); } } else { /* Find empty slot in GPT table. */ @@ -111,14 +111,14 @@ add(int fd) if (i == le32toh(hdr->hdr_entries)) { warnx("%s: error: no available table entries", device_name); - return; + return (NULL); } } - map = map_alloc(block, size); + map = map_alloc(start, size); if (map == NULL) { warnx("%s: error: no space available on device", device_name); - return; + return (NULL); } le_uuid_enc(&ent->ent_type, &type); @@ -148,7 +148,19 @@ add(int fd) gpt_write(fd, lbt); gpt_write(fd, tpg); - printf("%sp%u added\n", device_name, i + 1); + *entry = i + 1; + + return (map); +} + +static void +add(int fd) +{ + + if (gpt_add_part(fd, add_type, add_block, add_size, &add_entry) != 0) + return; + + printf("%sp%u added\n", device_name, add_entry); } int @@ -161,30 +173,30 @@ cmd_add(int argc, char *argv[]) while ((ch = getopt(argc, argv, "b:i:s:t:")) != -1) { switch(ch) { case 'b': - if (block > 0) + if (add_block > 0) usage_add(); - block = strtoll(optarg, &p, 10); - if (*p != 0 || block < 1) + add_block = strtoll(optarg, &p, 10); + if (*p != 0 || add_block < 1) usage_add(); break; case 'i': - if (entry > 0) + if (add_entry > 0) usage_add(); - entry = strtol(optarg, &p, 10); - if (*p != 0 || entry < 1) + add_entry = strtol(optarg, &p, 10); + if (*p != 0 || add_entry < 1) usage_add(); break; case 's': - if (size > 0) + if (add_size > 0) usage_add(); - size = strtoll(optarg, &p, 10); - if (*p != 0 || size < 1) + add_size = strtoll(optarg, &p, 10); + if (*p != 0 || add_size < 1) usage_add(); break; case 't': - if (!uuid_is_nil(&type, NULL)) + if (!uuid_is_nil(&add_type, NULL)) usage_add(); - if (parse_uuid(optarg, &type) != 0) + if (parse_uuid(optarg, &add_type) != 0) usage_add(); break; default: @@ -196,9 +208,9 @@ cmd_add(int argc, char *argv[]) usage_add(); /* Create UFS partitions by default. */ - if (uuid_is_nil(&type, NULL)) { + if (uuid_is_nil(&add_type, NULL)) { uuid_t ufs = GPT_ENT_TYPE_FREEBSD_UFS; - type = ufs; + add_type = ufs; } while (optind < argc) { diff --git a/sbin/gpt/gpt.8 b/sbin/gpt/gpt.8 index 13f9223257f1..7e5413905698 100644 --- a/sbin/gpt/gpt.8 +++ b/sbin/gpt/gpt.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 22, 2006 +.Dd October 24, 2007 .Os .Dt GPT 8 .Sh NAME @@ -130,10 +130,51 @@ option allows the user to specify the partition type. The type is given as an UUID, but .Nm accepts -.Cm efi , swap , ufs , hfs , linux +.Cm boot , efi , swap , ufs , hfs , linux and .Cm windows as aliases for the most commonly used partition types. +.\" ==== boot ==== +.It Xo +.Nm +.Ic boot +.Op Fl b Ar pmbr +.Op Fl g Ar gptboot +.Op Fl s Ar count +.Ar device ... +.Xc +The +.Ic boot +command allows the user to make a GPT labeled disk bootable via the BIOS +bootstrap on i386 and amd64 machines. +By default, +the +.Pa /boot/pmbr +boot loader is installed into the PMBR and the +.Pa /boot/gptboot +boot loader is installed into the first boot partition. +If no boot partition exists and there is available space, +a boot partition will be created. +.Pp +The +.Fl b Ar pmbr +option allows the user to specify an alternate path for the PMBR boot loader. +.Pp +The +.Fl g Ar gptboot +option allows the user to specify an alternate path for the GPT boot loader +that is installed into the boot partition. +.Pp +The +.Fl s Ar count +option allows the user to specify the size in sectors of the boot partition +if one does not already exist. +A boot partition must be at least 16 kilobytes. +By default, +a size of 64 kilobytes is used. +Note that the PMBR boot loader will load the entire boot partition into +memory. +As a result, the boot partition may not exceed 545 kilobytes. .\" ==== create ==== .It Nm Ic create Oo Fl fp Oc Ar device ... The diff --git a/sbin/gpt/gpt.c b/sbin/gpt/gpt.c index 2aa1015378cc..6085ed2addc4 100644 --- a/sbin/gpt/gpt.c +++ b/sbin/gpt/gpt.c @@ -615,6 +615,7 @@ static struct { const char *name; } cmdsw[] = { { cmd_add, "add" }, + { cmd_boot, "boot" }, { cmd_create, "create" }, { cmd_destroy, "destroy" }, { NULL, "help" }, diff --git a/sbin/gpt/gpt.h b/sbin/gpt/gpt.h index 6b1b1a287440..857eaf0901d7 100644 --- a/sbin/gpt/gpt.h +++ b/sbin/gpt/gpt.h @@ -67,6 +67,7 @@ extern u_int secsz; extern int readonly, verbose; uint32_t crc32(const void *, size_t); +map_t *gpt_add_part(int, uuid_t, off_t, off_t, unsigned int *); void gpt_close(int); int gpt_open(const char *); void* gpt_read(int, off_t, size_t); @@ -76,6 +77,7 @@ uint8_t *utf16_to_utf8(uint16_t *); void utf8_to_utf16(const uint8_t *, uint16_t *, size_t); int cmd_add(int, char *[]); +int cmd_boot(int, char *[]); int cmd_create(int, char *[]); int cmd_destroy(int, char *[]); int cmd_label(int, char *[]); diff --git a/sbin/gpt/show.c b/sbin/gpt/show.c index 43fd6eae3ee3..5d0ee2e971bc 100644 --- a/sbin/gpt/show.c +++ b/sbin/gpt/show.c @@ -54,6 +54,7 @@ usage_show(void) static const char * friendly(uuid_t *t) { + static uuid_t boot = GPT_ENT_TYPE_FREEBSD_BOOT; static uuid_t efi_slice = GPT_ENT_TYPE_EFI; static uuid_t mslinux = GPT_ENT_TYPE_MS_BASIC_DATA; static uuid_t freebsd = GPT_ENT_TYPE_FREEBSD; @@ -71,6 +72,8 @@ friendly(uuid_t *t) if (uuid_equal(t, &efi_slice, NULL)) return ("EFI System"); + if (uuid_equal(t, &boot, NULL)) + return ("FreeBSD boot"); if (uuid_equal(t, &swap, NULL)) return ("FreeBSD swap"); if (uuid_equal(t, &ufs, NULL)) |
