]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/commit
loader.efi: combine GetMemoryMap and ExitBootServices and retry on error
authoremaste <emaste@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Thu, 7 Jan 2016 04:02:37 +0000 (04:02 +0000)
committeremaste <emaste@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Thu, 7 Jan 2016 04:02:37 +0000 (04:02 +0000)
commita376bb3bf91295e2204195541e6efd662ac672f9
tree66eff858d8278f33ae08ab2b9d3fedac427993c8
parente73fa892681088c4c961cb31298438cb2456ba77
loader.efi: combine GetMemoryMap and ExitBootServices and retry on error

MFC r292338: UEFI: combine GetMemoryMap and ExitBootServices and retry on error

The EFI memory map may change before or during the first
ExitBootServices call. In that case ExitBootServices returns an error,
and GetMemoryMap and ExitBootServices must be retried.

Glue together calls to GetMemoryMap(), ExitBootServices() and storage of
(now up-to-date) MODINFOMD_EFI_MAP metadata within a single function.

That new function - bi_add_efi_data_and_exit() - uses space previously
allocated in bi_load_efi_data() to store the memory map (it will fail if
that space is too short). It handles re-calling GetMemoryMap() once to
update the map key if necessary. Finally, if ExitBootServices() is
successful, it stores the memory map and its header as MODINFOMD_EFI_MAP
metadata.

ExitBootServices() calls are now done earlier, from within arch-
independent bi_load() code.

MFC r292442: loader.efi: show EFI error number, not full status value

EFI return values set the high bit to indicate an error. The log
messages changed here are printed only in the case of an error,
so including the error bit is redundant. Also switch to decimal to
match the error definitions (in sys/boot/efi/include/efierr.h).

MFC r292515: loader.efi: refresh size in GetMemoryMap retry loop

If ExitBootServices fails due to a changed efi_mapkey then GetMemoryMap
must be called again. In this case it is also possible for the memory
map to grow, so repeat the initial GetMemoryMap call to fetch the new
size.

Also roll bi_add_efi_data_and_exit into bi_load_efi_data as there's no
need for it to be a separate function.

PR: 202455
Relnotes: Yes
Sponsored by: The FreeBSD Foundation

git-svn-id: svn://svn.freebsd.org/base/stable/10@293304 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
sys/boot/efi/loader/arch/amd64/elf64_freebsd.c
sys/boot/efi/loader/bootinfo.c
sys/boot/efi/loader/loader_efi.h