Commit 69e0a67b authored by Eric Snowberg's avatar Eric Snowberg Committed by Daniel Kiper

sparc64: Add blocklist GPT support for SPARC

Add block-list GPT support for SPARC.  The OBP "load" and "boot" methods
are partition aware and neither command can see the partition table. Also
neither command can address the entire physical disk. When the install
happens, grub generates the block-list entries based on the beginning of the
physical disk, not the beginning of the partition. This patch fixes the
block-list entries so they match what OBP expects during boot for a GPT disk.

T5 and above now supports GPT as well as VTOC.

This patch has been tested on T5-2 and newer SPARC systems.
Signed-off-by: default avatarEric Snowberg <>
Reviewed-by: default avatarDaniel Kiper <>
parent 566a03a6
......@@ -137,6 +137,9 @@ struct blocklists
struct grub_boot_blocklist *first_block, *block;
grub_uint16_t current_segment;
grub_uint64_t gpt_offset;
grub_uint16_t last_length;
grub_disk_addr_t first_sector;
......@@ -151,6 +154,10 @@ save_blocklists (grub_disk_addr_t sector, unsigned offset, unsigned length,
struct grub_boot_blocklist *prev = bl->block + 1;
grub_uint64_t seclen;
sector -= bl->gpt_offset;
grub_util_info ("saving <%" GRUB_HOST_PRIuLONG_LONG ",%u,%u>",
(unsigned long long) sector, offset, length);
......@@ -662,6 +669,16 @@ unable_to_embed:
bl.block = bl.first_block;
grub_partition_t container = root_dev->disk->partition;
bl.gpt_offset = 0;
if (grub_strstr (container->partmap->name, "gpt"))
bl.gpt_offset = grub_partition_get_start (container);
grub_install_get_blocklist (root_dev, core_path, core_img, core_size,
save_blocklists, &bl);
......@@ -721,15 +738,18 @@ unable_to_embed:
char *buf, *ptr = core_img;
size_t len = core_size;
grub_uint64_t blk;
grub_uint64_t blk, offset = 0;
grub_partition_t container = core_dev->disk->partition;
grub_err_t err;
core_dev->disk->partition = 0;
offset = bl.gpt_offset;
buf = xmalloc (core_size);
blk = bl.first_sector;
err = grub_disk_read (core_dev->disk, blk, 0, GRUB_DISK_SECTOR_SIZE, buf);
err = grub_disk_read (core_dev->disk, blk + offset, 0, GRUB_DISK_SECTOR_SIZE, buf);
if (err)
grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name,
......@@ -748,7 +768,7 @@ unable_to_embed:
if (cur > len)
cur = len;
err = grub_disk_read (core_dev->disk, blk, 0, cur, buf);
err = grub_disk_read (core_dev->disk, blk + offset, 0, cur, buf);
if (err)
grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name,
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment