Long since resolved. Please upgrade your grub
On 24 Oct 2014 08:00, "Wang Weber" <mail.weber.w...@gmail.com> wrote:

> Hi,
>
> I am using grub-1.99 on a x86 platform. The BIOS is originated from AMI
> and customized a little by our company. When booting up Linux 3.X, I can
> see the error message "couldn't terminate EFI services".
>
> According to the colaberate debug by both SW/FW side, it is found that
> before grub calls EFI API exit_boot_services(), the internal finish_key is
> changed. See the following code and notes for details.
>
>
> Code from GRUB-1.99
> =====================================
>
>   if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf,
> &finish_key,
>                                &finish_desc_size, &finish_desc_version) <
> 0)
>     return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
>   if (outbuf && *outbuf_size < finish_mmap_size)
>     return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
>   finish_mmap_buf = grub_malloc (finish_mmap_size);
>   if (!finish_mmap_buf)
>     return grub_errno;
>   if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf,
> &finish_key,
>                                &finish_desc_size, &finish_desc_version) <=
> 0)      <== see note 1
>     return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
>   b = grub_efi_system_table->boot_services;
>   status = efi_call_2 (b->exit_boot_services,
> grub_efi_image_handle,    <== see note 2
>                        finish_key);
>   if (status != GRUB_EFI_SUCCESS)
>     return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
>
> Note 1:
> BIOS returns the memory map and the finish_key = X
>
> Note 2:
> BIOS changes the memory map and the internal finish_key becomes X+1, so
> the input finish_key does not match the interna key, the API call fails.
>
> ======================================
>
>
> Since the BIOS core is from AMI we cannot correct the FW behavior so we
> did a small modification to the GRUB (see below). We retry the exit boot
> service API and this solves the problem.
> Please consider if this modification is reasonable for future grub
> releases.
>
> PS. I also checked the latest grub-2.00 code however this part of code is
> the same as grub-1.99, so grub upgrade cannot help.
>
>
> do {
>   if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf,
> &finish_key,
>                                &finish_desc_size, &finish_desc_version) <
> 0)
>     return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
>   if (outbuf && *outbuf_size < finish_mmap_size)
>     return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
>   finish_mmap_buf = grub_malloc (finish_mmap_size);
>   if (!finish_mmap_buf)
>     return grub_errno;
>   if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf,
> &finish_key,
>                                &finish_desc_size, &finish_desc_version) <=
> 0)
>     return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
>   b = grub_efi_system_table->boot_services;
>   status = efi_call_2 (b->exit_boot_services, grub_efi_image_handle,
>                        finish_key);
>
>   if (status != GRUB_EFI_SUCCESS) {
>     grub_free(finish_mmap_buf);
>   }
>
> } while (status != GRUB_EFI_SUCCESS && retry++ < 2);  <== retry calling
> exit boot service
>
> if (status != GRUB_EFI_SUCCESS)
>   return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
>
>
>
> Thanks,
> - Weber Wang
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to