From d1ff22fc5ad9fd54dcdaf70a8925d6b717b1232b Mon Sep 17 00:00:00 2001 From: Eric Snowberg Date: Thu, 11 May 2017 18:25:24 -0700 Subject: [PATCH] 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: Eric Snowberg Reviewed-by: Daniel Kiper --- util/setup.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/util/setup.c b/util/setup.c index 8aa5a39a7..80363075d 100644 --- a/util/setup.c +++ b/util/setup.c @@ -137,6 +137,9 @@ struct blocklists struct grub_boot_blocklist *first_block, *block; #ifdef GRUB_SETUP_BIOS grub_uint16_t current_segment; +#endif +#ifdef GRUB_SETUP_SPARC64 + grub_uint64_t gpt_offset; #endif 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; +#ifdef GRUB_SETUP_SPARC64 + sector -= bl->gpt_offset; +#endif + 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; +#ifdef GRUB_SETUP_SPARC64 + { + 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); + } +#endif + 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; +#ifdef GRUB_SETUP_SPARC64 + offset = bl.gpt_offset; +#endif 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, grub_errmsg); @@ -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, grub_errmsg);