LoongArch: Automatically disable KASLR for hibernation
authorHuacai Chen <chenhuacai@loongson.cn>
Sat, 20 Jul 2024 14:41:06 +0000 (22:41 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Sat, 20 Jul 2024 14:41:06 +0000 (22:41 +0800)
Hibernation assumes the memory layout after resume be the same as that
before sleep, so it expects the kernel is loaded at the same position.
To achieve this goal we automatically disable KASLR if user explicitly
requests hibernation via the "resume=" command line. Since "nohibernate"
and "noresume" have higher priorities than "resume=", we only disable
KASLR if there is no "nohibernate" and "noresume".

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/relocate.c

index 1acfa70..6834d62 100644 (file)
@@ -123,6 +123,32 @@ static inline __init bool kaslr_disabled(void)
        if (str == boot_command_line || (str > boot_command_line && *(str - 1) == ' '))
                return true;
 
+#ifdef CONFIG_HIBERNATION
+       str = strstr(builtin_cmdline, "nohibernate");
+       if (str == builtin_cmdline || (str > builtin_cmdline && *(str - 1) == ' '))
+               return false;
+
+       str = strstr(boot_command_line, "nohibernate");
+       if (str == boot_command_line || (str > boot_command_line && *(str - 1) == ' '))
+               return false;
+
+       str = strstr(builtin_cmdline, "noresume");
+       if (str == builtin_cmdline || (str > builtin_cmdline && *(str - 1) == ' '))
+               return false;
+
+       str = strstr(boot_command_line, "noresume");
+       if (str == boot_command_line || (str > boot_command_line && *(str - 1) == ' '))
+               return false;
+
+       str = strstr(builtin_cmdline, "resume=");
+       if (str == builtin_cmdline || (str > builtin_cmdline && *(str - 1) == ' '))
+               return true;
+
+       str = strstr(boot_command_line, "resume=");
+       if (str == boot_command_line || (str > boot_command_line && *(str - 1) == ' '))
+               return true;
+#endif
+
        return false;
 }