grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] sparc64: Add blocklist GPT support for SPARC


From: Eric Snowberg
Subject: Re: [PATCH v2] sparc64: Add blocklist GPT support for SPARC
Date: Fri, 6 Oct 2017 14:58:30 -0600

> On Oct 6, 2017, at 8:04 AM, Daniel Kiper <address@hidden> 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 <address@hidden>
>> ---
>> 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
>> address@hidden
>> https://lists.gnu.org/mailman/listinfo/grub-devel




reply via email to

[Prev in Thread] Current Thread [Next in Thread]