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