From c5dee97d873636234d219e29e8cfd106e5324fb7 Mon Sep 17 00:00:00 2001 From: Shiji Yang Date: Thu, 14 Mar 2024 03:39:01 +0800 Subject: [PATCH] generic: fix detect_memory_region() function This patch fixes the broken detect_memory_region() function on 6.6 kernel. Signed-off-by: Shiji Yang --- ...el-fix-detect_memory_region-function.patch | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 target/linux/generic/pending-6.6/350-mips-kernel-fix-detect_memory_region-function.patch diff --git a/target/linux/generic/pending-6.6/350-mips-kernel-fix-detect_memory_region-function.patch b/target/linux/generic/pending-6.6/350-mips-kernel-fix-detect_memory_region-function.patch new file mode 100644 index 000000000000..4654bc14ef03 --- /dev/null +++ b/target/linux/generic/pending-6.6/350-mips-kernel-fix-detect_memory_region-function.patch @@ -0,0 +1,56 @@ +From: Shiji Yang +Date: Wed, 13 Mar 2024 20:28:37 +0800 +Subject: [PATCH] mips: kernel: fix detect_memory_region() function + +1. Do not use memcmp() on unallocated memory, as the new introduced + fortify dynamic object size check[1] will report unexpected result. +2. Use a fixed pattern instead of a random function pointer as the + magic value. +3. Flip magic value and double check it. + +[1] 439a1bcac648 ("fortify: Use __builtin_dynamic_object_size() when available") +Signed-off-by: Shiji Yang +--- + arch/mips/kernel/setup.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +--- a/arch/mips/kernel/setup.c ++++ b/arch/mips/kernel/setup.c +@@ -46,6 +46,8 @@ + #include + #include + ++#define MIPS_MEM_TEST_PATTERN 0xaa5555aa ++ + #ifdef CONFIG_MIPS_ELF_APPENDED_DTB + char __section(".appended_dtb") __appended_dtb[0x100000]; + #endif /* CONFIG_MIPS_ELF_APPENDED_DTB */ +@@ -90,7 +92,7 @@ static struct resource bss_resource = { + unsigned long __kaslr_offset __ro_after_init; + EXPORT_SYMBOL(__kaslr_offset); + +-static void *detect_magic __initdata = detect_memory_region; ++static u32 detect_magic __initdata; + + #ifdef CONFIG_MIPS_AUTO_PFN_OFFSET + unsigned long ARCH_PFN_OFFSET; +@@ -99,12 +101,16 @@ EXPORT_SYMBOL(ARCH_PFN_OFFSET); + + void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max) + { +- void *dm = &detect_magic; ++ void *dm = (void *)KSEG1ADDR(&detect_magic); + phys_addr_t size; + + for (size = sz_min; size < sz_max; size <<= 1) { +- if (!memcmp(dm, dm + size, sizeof(detect_magic))) +- break; ++ __raw_writel(MIPS_MEM_TEST_PATTERN, dm); ++ if (__raw_readl(dm) == __raw_readl(dm + size)) { ++ __raw_writel(~MIPS_MEM_TEST_PATTERN, dm); ++ if (__raw_readl(dm) == __raw_readl(dm + size)) ++ break; ++ } + } + + pr_debug("Memory: %lluMB of RAM detected at 0x%llx (min: %lluMB, max: %lluMB)\n", -- 2.30.2