grub-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] Reset grub_mm_add_region_fn after exiting EFI services


From: Daniel Kiper
Subject: Re: [PATCH] Reset grub_mm_add_region_fn after exiting EFI services
Date: Mon, 16 Dec 2024 17:10:04 +0100

On Mon, Dec 16, 2024 at 12:26:58PM +0800, Ruihan Li wrote:
> Currently, EFI services can be used after they are exited because we
> allocate memory after exiting EFI services.
>
> An example call stack is:
>
>   grub_multiboot_boot
>     grub_multiboot2_make_mbi
>       grub_efi_finish_boot_services
>         b->exit_boot_services
>     normal_boot
>       grub_relocator32_boot
>         grub_relocator_alloc_chunk_align_safe
>           grub_relocator_alloc_chunk_align
>             grub_malloc
>               grub_memalign
>                 grub_mm_add_region_fn
>                 [= grub_efi_mm_add_regions]
>                   grub_efi_allocate_any_pages
>                     grub_efi_allocate_pages_real
>                       b->allocate_pages
>
> This can lead to confusing errors. After exiting EFI services,
> b->allocate_pages may point to the NULL address, resulting in something
> like:
>
> !!!! X64 Exception Type - 01(#DB - Debug)  CPU Apic ID - 00000000 !!!!
> RIP  - 000000000000201F, CS  - 0000000000000038, RFLAGS - 0000000000200002
> RAX  - 000000007F9EE010, RCX - 0000000000000001, RDX - 0000000000000002
> RBX  - 0000000000000006, RSP - 00000000001CFBEC, RBP - 0000000000000000
> RSI  - 0000000000000000, RDI - 00000000FFFFFFFF
> R8   - 0000000000000006, R9  - 000000007FEDFFB8, R10 - 0000000000000000
> R11  - 0000000000000475, R12 - 0000000000000001, R13 - 0000000000000002
> R14  - 00000000FFFFFFFF, R15 - 000000007E432C08
> DS   - 0000000000000030, ES  - 0000000000000030, FS  - 0000000000000030
> GS   - 0000000000000030, SS  - 0000000000000030
> CR0  - 0000000080010033, CR2 - 0000000000000000, CR3 - 000000007FC01000
> CR4  - 0000000000000668, CR8 - 0000000000000000
> DR0  - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
> DR3  - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400
> GDTR - 000000007F9DE000 0000000000000047, LDTR - 0000000000000000
> IDTR - 000000007F470018 0000000000000FFF,   TR - 0000000000000000
> FXSAVE_STATE - 00000000001CF840
>
> Ideally, we would like to avoid all memory allocations after exiting EFI
> services altogether, but that requires significant code changes. This
> patch suggests a simple workaround that resets grub_mm_add_region_fn
> after exiting EFI services, so:
>
>  - Memory allocations after exiting EFI services have a better chance of
>    success because grub_memalign will try to reclaim the disk cache if
>    it sees a NULL grub_mm_add_region_fn.
>
>  - At worst, it will fail to allocate memory after exiting EFI services,
>    but it will explicitly tell users that it's out of memory, which is
>    still much better than the current situation where it fails in a
>    fairly random way and triggers a CPU exception.
>
> Signed-off-by: Ruihan Li <lrh2000@pku.edu.cn>

Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>

However, should not we go further and extend the heap with additional
memory before EBS? 1 MiB?

Daniel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]