From: Shiji Yang Date: Wed, 13 Mar 2024 19:39:01 +0000 (+0800) Subject: generic: fix detect_memory_region() function X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=c5dee97d873636234d219e29e8cfd106e5324fb7;p=openwrt%2Fstaging%2Fthess.git generic: fix detect_memory_region() function This patch fixes the broken detect_memory_region() function on 6.6 kernel. Signed-off-by: Shiji Yang --- 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 0000000000..4654bc14ef --- /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",