> On Oct 6, 2017, at 8:04 AM, Daniel Kiper <dki...@net-space.pl> wrote: > > On Thu, May 11, 2017 at 06:25:24PM -0700, Eric Snowberg wrote: >> 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 parition. 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 <eric.snowb...@oracle.com> >> --- >> Changes in v2: >> Do all GPT offset calculations in setup >> --- >> util/setup.c | 26 +++++++++++++++++++++++--- >> 1 files changed, 23 insertions(+), 3 deletions(-) >> >> diff --git a/util/setup.c b/util/setup.c >> index 8aa5a39..8036307 100644 >> --- a/util/setup.c >> +++ b/util/setup.c >> @@ -138,6 +138,9 @@ struct blocklists >> #ifdef GRUB_SETUP_BIOS >> grub_uint16_t current_segment; >> #endif >> +#ifdef GRUB_SETUP_SPARC64 >> + grub_uint64_t gpt_offset; >> +#endif > > This does not seem to be used below…
After looking into this further, I don’t see a problem... > >> 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; It is used here >> +#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; here >> + >> + if (grub_strstr (container->partmap->name, "gpt")) >> + bl.gpt_offset = grub_partition_get_start (container); here >> + } >> +#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; and here. >> +#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); >> -- >> 1.7.1 >> >> >> _______________________________________________ >> Grub-devel mailing list >> Grub-devel@gnu.org >> https://lists.gnu.org/mailman/listinfo/grub-devel _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel