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: Daniel Kiper
Subject: Re: [PATCH v2] sparc64: Add blocklist GPT support for SPARC
Date: Fri, 6 Oct 2017 16:04:21 +0200
User-agent: Mutt/1.3.28i

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...

Daniel

>    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);
> --
> 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]