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

Re: [Xen-devel] [PATCH v2 6/6] multiboot2: Do not pass memory maps to image if EFI boot services are enabled



On Mon, Jul 20, 2015 at 04:35:54PM +0200, Daniel Kiper wrote:
> Do not pass memory maps to image if it asked for EFI boot services. Maps are
> usually invalid in that case and they can confuse potential user. Image should
> get memory map itself just before ExitBootServices() call.

Can we point to some commits in Linux or Xen in which these situations
arose? 

Wait, I think there even was one commit in grub.

Aha:

ommit e75fdee420a7ad95e9a465c9699adc2e2e970440
Author: Vladimir 'phcoder' Serbinenko <phcoder@xxxxxxxxx>
Date:   Tue Mar 26 11:34:56 2013 +0100

        * grub-core/kern/efi/mm.c (grub_efi_finish_boot_services):
        Try terminating EFI services several times due to quirks in some
        implementations.

Otherwise:

Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>

> 
> Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
> ---
>  grub-core/loader/multiboot_mbi2.c |   71 
> ++++++++++++++++++-------------------
>  1 file changed, 35 insertions(+), 36 deletions(-)
> 
> diff --git a/grub-core/loader/multiboot_mbi2.c 
> b/grub-core/loader/multiboot_mbi2.c
> index 7ac64ec..26e955c 100644
> --- a/grub-core/loader/multiboot_mbi2.c
> +++ b/grub-core/loader/multiboot_mbi2.c
> @@ -431,7 +431,7 @@ static grub_size_t
>  grub_multiboot_get_mbi_size (void)
>  {
>  #ifdef GRUB_MACHINE_EFI
> -  if (!efi_mmap_size)
> +  if (!keep_bs && !efi_mmap_size)
>      find_efi_mmap_size ();    
>  #endif
>    return 2 * sizeof (grub_uint32_t) + sizeof (struct multiboot_tag)
> @@ -805,12 +805,13 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
>        }
>    }
>  
> -  {
> -    struct multiboot_tag_mmap *tag = (struct multiboot_tag_mmap *) ptrorig;
> -    grub_fill_multiboot_mmap (tag);
> -    ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN)
> -      / sizeof (grub_properly_aligned_t);
> -  }
> +  if (!keep_bs)
> +    {
> +      struct multiboot_tag_mmap *tag = (struct multiboot_tag_mmap *) ptrorig;
> +      grub_fill_multiboot_mmap (tag);
> +      ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN)
> +     / sizeof (grub_properly_aligned_t);
> +    }
>  
>    {
>      struct multiboot_tag_elf_sections *tag
> @@ -826,18 +827,19 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
>        / sizeof (grub_properly_aligned_t);
>    }
>  
> -  {
> -    struct multiboot_tag_basic_meminfo *tag
> -      = (struct multiboot_tag_basic_meminfo *) ptrorig;
> -    tag->type = MULTIBOOT_TAG_TYPE_BASIC_MEMINFO;
> -    tag->size = sizeof (struct multiboot_tag_basic_meminfo); 
> +  if (!keep_bs)
> +    {
> +      struct multiboot_tag_basic_meminfo *tag
> +     = (struct multiboot_tag_basic_meminfo *) ptrorig;
> +      tag->type = MULTIBOOT_TAG_TYPE_BASIC_MEMINFO;
> +      tag->size = sizeof (struct multiboot_tag_basic_meminfo);
>  
> -    /* Convert from bytes to kilobytes.  */
> -    tag->mem_lower = grub_mmap_get_lower () / 1024;
> -    tag->mem_upper = grub_mmap_get_upper () / 1024;
> -    ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN)
> -       / sizeof (grub_properly_aligned_t);
> -  }
> +      /* Convert from bytes to kilobytes.  */
> +      tag->mem_lower = grub_mmap_get_lower () / 1024;
> +      tag->mem_upper = grub_mmap_get_upper () / 1024;
> +      ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN)
> +     / sizeof (grub_properly_aligned_t);
> +    }
>  
>    {
>      struct grub_net_network_level_interface *net;
> @@ -936,27 +938,24 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
>      grub_efi_uintn_t efi_desc_size;
>      grub_efi_uint32_t efi_desc_version;
>  
> -    tag->type = MULTIBOOT_TAG_TYPE_EFI_MMAP;
> -    tag->size = sizeof (*tag) + efi_mmap_size;
> -
>      if (!keep_bs)
> -      err = grub_efi_finish_boot_services (&efi_mmap_size, tag->efi_mmap, 
> NULL,
> -                                        &efi_desc_size, &efi_desc_version);
> -    else
>        {
> -     if (grub_efi_get_memory_map (&efi_mmap_size, (void *) tag->efi_mmap,
> -                                  NULL,
> -                                  &efi_desc_size, &efi_desc_version) <= 0)
> -       err = grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
> +     tag->type = MULTIBOOT_TAG_TYPE_EFI_MMAP;
> +     tag->size = sizeof (*tag) + efi_mmap_size;
> +
> +     err = grub_efi_finish_boot_services (&efi_mmap_size, tag->efi_mmap, 
> NULL,
> +                                          &efi_desc_size, &efi_desc_version);
> +
> +     if (err)
> +       return err;
> +
> +     tag->descr_size = efi_desc_size;
> +     tag->descr_vers = efi_desc_version;
> +     tag->size = sizeof (*tag) + efi_mmap_size;
> +
> +     ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN)
> +       / sizeof (grub_properly_aligned_t);
>        }
> -    if (err)
> -      return err;
> -    tag->descr_size = efi_desc_size;
> -    tag->descr_vers = efi_desc_version;
> -    tag->size = sizeof (*tag) + efi_mmap_size;
> -
> -    ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN)
> -      / sizeof (grub_properly_aligned_t);
>    }
>  
>    if (keep_bs)
> -- 
> 1.7.10.4
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.