On Wed, Jun 29, 2016, 23:47 Eric Snowberg <[email protected]> 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 <[email protected]>
> ---
>  grub-core/osdep/linux/blocklist.c |    5 +++++
>  util/setup.c                      |   12 +++++++++---
>  2 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/grub-core/osdep/linux/blocklist.c
> b/grub-core/osdep/linux/blocklist.c
> index c77d608..caf8d4e 100644
> --- a/grub-core/osdep/linux/blocklist.c
> +++ b/grub-core/osdep/linux/blocklist.c
> @@ -58,6 +58,11 @@ grub_install_get_blocklist (grub_device_t root_dev,
>    struct fiemap fie1;
>    int fd;
>
> +#ifdef __sparc__
> +  if (grub_strstr (container->partmap->name, "gpt"))
> +    container_start = 0;
> +#endif
> +
>
This makes ifdef conditional on platform of the tool, not of the binaries
and they can be different. Also there are several implementations of
blocklist retrieving for different platform. This condition needs to be
detected and adjusted for in the caller (setup)

>    /* Write the first two sectors of the core image onto the disk.  */
>    grub_util_info ("opening the core image `%s'", core_path);
>    fd = open (core_path, O_RDONLY);
> diff --git a/util/setup.c b/util/setup.c
> index 8aa5a39..5908498 100644
> --- a/util/setup.c
> +++ b/util/setup.c
> @@ -721,15 +721,21 @@ 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
> +    {
> +      if (grub_strstr (container->partmap->name, "gpt"))
> +        offset = grub_partition_get_start (container);
> +    }
> +#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 +754,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
> [email protected]
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to