95 lines
3.1 KiB
Diff
95 lines
3.1 KiB
Diff
|
From 69e0a67bfb419a8d6c905fb23330a8afc2435de6 Mon Sep 17 00:00:00 2001
|
||
|
From: Eric Snowberg <eric.snowberg@oracle.com>
|
||
|
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 <eric.snowberg@oracle.com>
|
||
|
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||
|
---
|
||
|
util/setup.c | 26 +++++++++++++++++++++++---
|
||
|
1 file changed, 23 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/util/setup.c b/util/setup.c
|
||
|
index 8aa5a39a794..80363075d34 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);
|