mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
boot/stub: allocate pages for combined initrds below 4GiB only on x86 (#35149)
Outside of x86, some machines (e.g. Apple silicon, AMD Opteron A1100) have physical memory mapped above 4GiB, meaning this allocation will fail, causing the entire boot process to fail on these machines. This commit makes it so that the below-4GB address space allocation requirement is only set on x86 platforms, and not on other platforms (that don't have the specific Linux x86 boot protocol), thereby fixing boot on those that have no memory mapped below 4GiB in their address space. Tested on an Apple silicon M1 laptop and an AMD x86_64 desktop tower. Fixes: #35026
This commit is contained in:
parent
1507899383
commit
6e207b370e
@ -2469,11 +2469,7 @@ static EFI_STATUS initrd_prepare(
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
_cleanup_pages_ Pages pages = xmalloc_pages(
|
_cleanup_pages_ Pages pages = xmalloc_initrd_pages(size);
|
||||||
AllocateMaxAddress,
|
|
||||||
EfiLoaderData,
|
|
||||||
EFI_SIZE_TO_PAGES(size),
|
|
||||||
UINT32_MAX /* Below 4G boundary. */);
|
|
||||||
uint8_t *p = PHYSICAL_ADDRESS_TO_POINTER(pages.addr);
|
uint8_t *p = PHYSICAL_ADDRESS_TO_POINTER(pages.addr);
|
||||||
|
|
||||||
STRV_FOREACH(i, entry->initrd) {
|
STRV_FOREACH(i, entry->initrd) {
|
||||||
|
@ -114,12 +114,9 @@ static EFI_STATUS combine_initrds(
|
|||||||
n += initrd_size;
|
n += initrd_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
_cleanup_pages_ Pages pages = xmalloc_pages(
|
_cleanup_pages_ Pages pages = xmalloc_initrd_pages(n);
|
||||||
AllocateMaxAddress,
|
|
||||||
EfiLoaderData,
|
|
||||||
EFI_SIZE_TO_PAGES(n),
|
|
||||||
UINT32_MAX /* Below 4G boundary. */);
|
|
||||||
uint8_t *p = PHYSICAL_ADDRESS_TO_POINTER(pages.addr);
|
uint8_t *p = PHYSICAL_ADDRESS_TO_POINTER(pages.addr);
|
||||||
|
|
||||||
FOREACH_ARRAY(i, initrds, n_initrds) {
|
FOREACH_ARRAY(i, initrds, n_initrds) {
|
||||||
size_t pad;
|
size_t pad;
|
||||||
|
|
||||||
|
@ -99,6 +99,22 @@ static inline Pages xmalloc_pages(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline Pages xmalloc_initrd_pages(size_t n_pages) {
|
||||||
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
return xmalloc_pages(
|
||||||
|
AllocateMaxAddress,
|
||||||
|
EfiLoaderData,
|
||||||
|
EFI_SIZE_TO_PAGES(n_pages),
|
||||||
|
UINT32_MAX /* Below 4G boundary. */);
|
||||||
|
#else
|
||||||
|
return xmalloc_pages(
|
||||||
|
AllocateAnyPages,
|
||||||
|
EfiLoaderData,
|
||||||
|
EFI_SIZE_TO_PAGES(n_pages),
|
||||||
|
0 /* Ignored. */);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void convert_efi_path(char16_t *path);
|
void convert_efi_path(char16_t *path);
|
||||||
char16_t *xstr8_to_path(const char *stra);
|
char16_t *xstr8_to_path(const char *stra);
|
||||||
char16_t *mangle_stub_cmdline(char16_t *cmdline);
|
char16_t *mangle_stub_cmdline(char16_t *cmdline);
|
||||||
|
Loading…
Reference in New Issue
Block a user