hostapd: bump to 2024-09-06 (wip)
[openwrt/staging/xback.git] / target / linux / generic / pending-6.1 / 350-mips-kernel-fix-detect_memory_region-function.patch
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
4
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
8 magic value.
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.
12
13 [1] 439a1bcac648 ("fortify: Use __builtin_dynamic_object_size() when available")
14 Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
15 ---
16 arch/mips/include/asm/bootinfo.h | 2 ++
17 arch/mips/kernel/setup.c | 17 ++++++++++++-----
18 2 files changed, 14 insertions(+), 5 deletions(-)
19
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);
23
24 extern unsigned long mips_machtype;
25
26 +#ifndef CONFIG_64BIT
27 extern void detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max);
28 +#endif
29
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);
37
38 -static void *detect_magic __initdata = detect_memory_region;
39 -
40 #ifdef CONFIG_MIPS_AUTO_PFN_OFFSET
41 unsigned long ARCH_PFN_OFFSET;
42 EXPORT_SYMBOL(ARCH_PFN_OFFSET);
43 #endif
44
45 +#ifndef CONFIG_64BIT
46 +static u32 detect_magic __initdata;
47 +#define MIPS_MEM_TEST_PATTERN 0xaa5555aa
48 +
49 void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max)
50 {
51 - void *dm = &detect_magic;
52 + void *dm = (void *)KSEG1ADDR(&detect_magic);
53 phys_addr_t size;
54
55 for (size = sz_min; size < sz_max; size <<= 1) {
56 - if (!memcmp(dm, dm + size, sizeof(detect_magic)))
57 - break;
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))
62 + break;
63 + }
64 }
65
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
68
69 memblock_add(start, size);
70 }
71 +#endif /* CONFIG_64BIT */
72
73 /*
74 * Manage initrd