Le mar. 15 mars 2016 19:06, Andrei Borzenkov a écrit : > 15.03.2016 19:07, Vladimir 'phcoder' Serbinenko пишет: > > Looks good. Let's give a day for others to comment. Is the second email > the > > version for commit? > > > > On Tuesday, March 15, 2016, Daniel Kiper > wrote: > > > >> Do not pass memory maps to image if it asked for EFI boot services. > >> Main reason for not providing maps is because they will likely be > >> invalid. We do a few allocations after filling them, e.g. for relocator > >> needs. Usually we do not care as we would already finish boot services. > >> If we keep boot services then it is easier to not provide maps. However, > >> if image needs memory maps and they are not provided by bootloader then > >> it should get them itself just before ExitBootServices() call. > >> > > Are there any existing users of it that rely on memory map provided by > bootloader? What if image explicitly requested non-optional memory map? > According to multiboot specification it is valid and bootloader must > either provide requested information or fail load. > I think you have a point. @Daniel, is current behavior a problem for you? Don't you just ignore the memory map in this case? > > >> Signed-off-by: Daniel Kiper > > >> Reviewed-by: Konrad Rzeszutek Wilk > > >> --- > >> v3 - suggestions/fixes: > >> - improve commit message > >> (suggested by Konrad Rzeszutek Wilk and Vladimir 'phcoder' > >> Serbinenko). > >> --- > >> 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 6c04402..ad1553b 100644 > >> --- a/grub-core/loader/multiboot_mbi2.c > >> +++ b/grub-core/loader/multiboot_mbi2.c > >> @@ -390,7 +390,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) > >> @@ -755,12 +755,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 > >> @@ -776,18 +777,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; > >> @@ -886,27 +888,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 > >> > >> > > > >