1 From: Shiji Yang <yangshiji66@outlook.com>
2 Date: Wed, 13 Mar 2024 20:28:37 +0800
3 Subject: [PATCH] mips: kernel: fix detect_memory_region() function
5 1. Do not use memcmp() on unallocated memory, as the new introduced
6 fortify dynamic object size check[1] will report unexpected result.
7 2. Use a fixed pattern instead of a random function pointer as the
9 3. Flip magic value and double check it.
10 4. Enable this feature only for 32-bit CPUs. Currently, only ath79 and
11 ralink CPUs are using it.
13 [1] 439a1bcac648 ("fortify: Use __builtin_dynamic_object_size() when available")
14 Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
16 arch/mips/include/asm/bootinfo.h | 2 ++
17 arch/mips/kernel/setup.c | 17 ++++++++++++-----
18 2 files changed, 14 insertions(+), 5 deletions(-)
20 --- a/arch/mips/include/asm/bootinfo.h
21 +++ b/arch/mips/include/asm/bootinfo.h
22 @@ -93,7 +93,9 @@ const char *get_system_type(void);
24 extern unsigned long mips_machtype;
27 extern void detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max);
30 extern void prom_init(void);
31 extern void prom_free_prom_memory(void);
32 --- a/arch/mips/kernel/setup.c
33 +++ b/arch/mips/kernel/setup.c
34 @@ -90,21 +90,27 @@ static struct resource bss_resource = {
35 unsigned long __kaslr_offset __ro_after_init;
36 EXPORT_SYMBOL(__kaslr_offset);
38 -static void *detect_magic __initdata = detect_memory_region;
40 #ifdef CONFIG_MIPS_AUTO_PFN_OFFSET
41 unsigned long ARCH_PFN_OFFSET;
42 EXPORT_SYMBOL(ARCH_PFN_OFFSET);
46 +static u32 detect_magic __initdata;
47 +#define MIPS_MEM_TEST_PATTERN 0xaa5555aa
49 void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max)
51 - void *dm = &detect_magic;
52 + void *dm = (void *)KSEG1ADDR(&detect_magic);
55 for (size = sz_min; size < sz_max; size <<= 1) {
56 - if (!memcmp(dm, dm + size, sizeof(detect_magic)))
58 + __raw_writel(MIPS_MEM_TEST_PATTERN, dm);
59 + if (__raw_readl(dm) == __raw_readl(dm + size)) {
60 + __raw_writel(~MIPS_MEM_TEST_PATTERN, dm);
61 + if (__raw_readl(dm) == __raw_readl(dm + size))
66 pr_debug("Memory: %lluMB of RAM detected at 0x%llx (min: %lluMB, max: %lluMB)\n",
67 @@ -115,6 +121,7 @@ void __init detect_memory_region(phys_ad
69 memblock_add(start, size);
71 +#endif /* CONFIG_64BIT */