Re: [PATCH 1/1] x86/power: only verify usable RAM regions during hibernation E820 check
From: Milan Oravec
Date: Tue Jun 23 2026 - 11:13:15 EST
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: moravec@xxxxxx
--------------------------------------------------------------------
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 <scardracs@xxxxxxxxxxx> wrote:
On some UEFI platforms (such as the HP OmniBook X Flip), resuming fromThat may not be sufficient for the image kernel to work after resuming though.
hibernation fails with 'Hibernate inconsistent memory map detected!'
even though the usable system RAM configuration is identical.
This happens because the UEFI firmware or bootloader (like GRUB) makesThe boot loader has nothing to do with this, the memory map comes from
non-deterministic allocations or shifts reserved/ACPI memory regions
dynamically across boots,
the UEFI firmware.
which changes the CRC32 checksum computedWhich is risky because the image kernel may access stuff located in
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.
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 <scardracs@xxxxxxxxxxx>
---
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
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature