Re: [PATCH 1/1] x86/power: only verify usable RAM regions during hibernation E820 check
Milan Oravec <[email protected]> Tue, 23 Jun 2026 17:11:19 +0200
| Newsgroups | dev.linux.lists.regressions,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm |
|---|---|
| Organization | CIKT UKF Nitra |
| Message-ID | <[email protected]> |
Hello Rafael. OK, what is proper solution for the Hibernate inconsistent memory map detected! problem? Thank you, best regards, Milan Oravec CIKT UKF Nitra Mobil/Signal: +421907670270 email: [email protected] -------------------------------------------------------------------- Tuto spravu nepreveril ziadny antivirus - nebolo treba... On 6/23/26 14:59, Rafael J. Wysocki wrote: > On Sat, Jun 20, 2026 at 10:16 AM Marco Scardovi <[email protected]> wrote: >> On some UEFI platforms (such as the HP OmniBook X Flip), resuming from >> hibernation fails with 'Hibernate inconsistent memory map detected!' >> even though the usable system RAM configuration is identical. > That may not be sufficient for the image kernel to work after resuming though. > >> This happens because the UEFI firmware or bootloader (like GRUB) makes >> non-deterministic allocations or shifts reserved/ACPI memory regions >> dynamically across boots, > The boot loader has nothing to do with this, the memory map comes from > the UEFI firmware. > >> which changes the CRC32 checksum computed >> over the entire E820 table (which includes non-RAM types like reserved, >> ACPI, NVS, and unusable memory). >> >> Fix this by modifying compute_e820_crc32() to only calculate the >> checksum over memory map entries of type E820_TYPE_RAM. Usable system >> RAM layout is still verified to ensure data safety, but dynamic shifts >> in ACPI and other reserved ranges are ignored. > Which is risky because the image kernel may access stuff located in > those non-RAM memory regions (for instance, ACPI tables, AML operation > regions, UEFI runtime variables, etc.). > > Hibernation in Linux simply cannot cope with a changing memory map in > general, sorry about that. > >> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=221569 >> Fixes: f5d1499ae209 ("PM: hibernate: x86: Use crc32 instead of md5 for hibernation e820 integrity check") >> Assisted-by: Antigravity:gemini-3.5-flash >> Signed-off-by: Marco Scardovi <[email protected]> >> --- >> arch/x86/power/hibernate.c | 15 +++++++++++---- >> 1 file changed, 11 insertions(+), 4 deletions(-) >> >> diff --git a/arch/x86/power/hibernate.c b/arch/x86/power/hibernate.c >> index a2294c1649f6..752a490bc3d2 100644 >> --- a/arch/x86/power/hibernate.c >> +++ b/arch/x86/power/hibernate.c >> @@ -70,12 +70,19 @@ struct restore_data_record { >> * >> * Return: the resulting checksum >> */ >> -static inline u32 compute_e820_crc32(struct e820_table *table) >> +static u32 compute_e820_crc32(struct e820_table *table) >> { >> - int size = offsetof(struct e820_table, entries) + >> - sizeof(struct e820_entry) * table->nr_entries; >> + u32 crc = ~0; >> + int i; >> + >> + for (i = 0; i < table->nr_entries; i++) { >> + if (table->entries[i].type == E820_TYPE_RAM) { >> + crc = crc32_le(crc, (unsigned char const *)&table->entries[i], >> + sizeof(struct e820_entry)); >> + } >> + } >> >> - return ~crc32_le(~0, (unsigned char const *)table, size); >> + return ~crc; >> } >> >> #ifdef CONFIG_X86_64 >> -- >> 2.54.0 >> >>
smime.p7s
(application/pkcs7-signature, 4.9 KB) - not displayed