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>
This commit is contained in:
parent
566a03a623
commit
69e0a67bfb
1 changed files with 23 additions and 3 deletions
26
util/setup.c
26
util/setup.c
|
@ -137,6 +137,9 @@ struct blocklists
|
||||||
struct grub_boot_blocklist *first_block, *block;
|
struct grub_boot_blocklist *first_block, *block;
|
||||||
#ifdef GRUB_SETUP_BIOS
|
#ifdef GRUB_SETUP_BIOS
|
||||||
grub_uint16_t current_segment;
|
grub_uint16_t current_segment;
|
||||||
|
#endif
|
||||||
|
#ifdef GRUB_SETUP_SPARC64
|
||||||
|
grub_uint64_t gpt_offset;
|
||||||
#endif
|
#endif
|
||||||
grub_uint16_t last_length;
|
grub_uint16_t last_length;
|
||||||
grub_disk_addr_t first_sector;
|
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;
|
struct grub_boot_blocklist *prev = bl->block + 1;
|
||||||
grub_uint64_t seclen;
|
grub_uint64_t seclen;
|
||||||
|
|
||||||
|
#ifdef GRUB_SETUP_SPARC64
|
||||||
|
sector -= bl->gpt_offset;
|
||||||
|
#endif
|
||||||
|
|
||||||
grub_util_info ("saving <%" GRUB_HOST_PRIuLONG_LONG ",%u,%u>",
|
grub_util_info ("saving <%" GRUB_HOST_PRIuLONG_LONG ",%u,%u>",
|
||||||
(unsigned long long) sector, offset, length);
|
(unsigned long long) sector, offset, length);
|
||||||
|
|
||||||
|
@ -662,6 +669,16 @@ unable_to_embed:
|
||||||
|
|
||||||
bl.block = bl.first_block;
|
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,
|
grub_install_get_blocklist (root_dev, core_path, core_img, core_size,
|
||||||
save_blocklists, &bl);
|
save_blocklists, &bl);
|
||||||
|
|
||||||
|
@ -721,15 +738,18 @@ unable_to_embed:
|
||||||
{
|
{
|
||||||
char *buf, *ptr = core_img;
|
char *buf, *ptr = core_img;
|
||||||
size_t len = core_size;
|
size_t len = core_size;
|
||||||
grub_uint64_t blk;
|
grub_uint64_t blk, offset = 0;
|
||||||
grub_partition_t container = core_dev->disk->partition;
|
grub_partition_t container = core_dev->disk->partition;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
|
|
||||||
core_dev->disk->partition = 0;
|
core_dev->disk->partition = 0;
|
||||||
|
#ifdef GRUB_SETUP_SPARC64
|
||||||
|
offset = bl.gpt_offset;
|
||||||
|
#endif
|
||||||
|
|
||||||
buf = xmalloc (core_size);
|
buf = xmalloc (core_size);
|
||||||
blk = bl.first_sector;
|
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)
|
if (err)
|
||||||
grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name,
|
grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name,
|
||||||
grub_errmsg);
|
grub_errmsg);
|
||||||
|
@ -748,7 +768,7 @@ unable_to_embed:
|
||||||
if (cur > len)
|
if (cur > len)
|
||||||
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)
|
if (err)
|
||||||
grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name,
|
grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name,
|
||||||
grub_errmsg);
|
grub_errmsg);
|
||||||
|
|
Loading…
Reference in a new issue