loader.efi: make sure kernel image is executable
The Windows Dev Kit 2023 (Volterra) has an UEFI implementation that maps EfiLoaderData pages as non-executable. Map the kernel as EfiLoaderCode to ensure that it can be executed. With this change and another in review, FreeBSD boots to the mountroot prompt if hw.pac.enable = 0 is set in loader.conf(5). Reviewed by: andrew, imp, tsoome Sponsored by: Berliner Linux User Group e.V. Sponsored by: spline / FU-Berlin Differential Revision: https://reviews.freebsd.org/D37931
This commit is contained in:
parent
0deb25bd9d
commit
95fa2e0aee
@ -330,7 +330,7 @@ efi_copy_init(void)
|
|||||||
|
|
||||||
staging = get_staging_max();
|
staging = get_staging_max();
|
||||||
#endif
|
#endif
|
||||||
status = BS->AllocatePages(EFI_ALLOC_METHOD, EfiLoaderData,
|
status = BS->AllocatePages(EFI_ALLOC_METHOD, EfiLoaderCode,
|
||||||
nr_pages, &staging);
|
nr_pages, &staging);
|
||||||
if (EFI_ERROR(status)) {
|
if (EFI_ERROR(status)) {
|
||||||
printf("failed to allocate staging area: %lu\n",
|
printf("failed to allocate staging area: %lu\n",
|
||||||
@ -398,7 +398,7 @@ efi_check_space(vm_offset_t end)
|
|||||||
|
|
||||||
/* Try to allocate more space after the previous allocation */
|
/* Try to allocate more space after the previous allocation */
|
||||||
addr = staging_end;
|
addr = staging_end;
|
||||||
status = BS->AllocatePages(AllocateAddress, EfiLoaderData, nr_pages,
|
status = BS->AllocatePages(AllocateAddress, EfiLoaderCode, nr_pages,
|
||||||
&addr);
|
&addr);
|
||||||
if (!EFI_ERROR(status)) {
|
if (!EFI_ERROR(status)) {
|
||||||
staging_end = staging_end + nr_pages * EFI_PAGE_SIZE;
|
staging_end = staging_end + nr_pages * EFI_PAGE_SIZE;
|
||||||
@ -415,7 +415,7 @@ efi_check_space(vm_offset_t end)
|
|||||||
addr = rounddown2(addr, M(2));
|
addr = rounddown2(addr, M(2));
|
||||||
#endif
|
#endif
|
||||||
nr_pages = EFI_SIZE_TO_PAGES(staging_base - addr);
|
nr_pages = EFI_SIZE_TO_PAGES(staging_base - addr);
|
||||||
status = BS->AllocatePages(AllocateAddress, EfiLoaderData, nr_pages,
|
status = BS->AllocatePages(AllocateAddress, EfiLoaderCode, nr_pages,
|
||||||
&addr);
|
&addr);
|
||||||
if (!EFI_ERROR(status)) {
|
if (!EFI_ERROR(status)) {
|
||||||
/*
|
/*
|
||||||
@ -438,7 +438,7 @@ efi_check_space(vm_offset_t end)
|
|||||||
#if defined(__i386__) || defined(__amd64__)
|
#if defined(__i386__) || defined(__amd64__)
|
||||||
new_base = get_staging_max();
|
new_base = get_staging_max();
|
||||||
#endif
|
#endif
|
||||||
status = BS->AllocatePages(EFI_ALLOC_METHOD, EfiLoaderData,
|
status = BS->AllocatePages(EFI_ALLOC_METHOD, EfiLoaderCode,
|
||||||
nr_pages, &new_base);
|
nr_pages, &new_base);
|
||||||
if (!EFI_ERROR(status)) {
|
if (!EFI_ERROR(status)) {
|
||||||
#if EFI_STAGING_2M_ALIGN
|
#if EFI_STAGING_2M_ALIGN
|
||||||
|
Loading…
Reference in New Issue
Block a user