1
0
mirror of https://git.openwrt.org/openwrt/openwrt.git synced 2024-10-18 13:29:16 +02:00

generic: MIPS64: fix detect_memory_region() compilation error

1. Enable this feature only for 32-bit CPUs as MIPS64 can not
   access the full range unmapped uncached memory.

2. Backport this fix to the 6.1 old LTS kernel.

Signed-off-by: Shiji Yang <yangshiji66@qq.com>
This commit is contained in:
Shiji Yang 2024-04-29 02:11:17 +00:00 committed by Hauke Mehrtens
parent be37ab6e51
commit dcdcb9228b
6 changed files with 115 additions and 23 deletions

@ -0,0 +1,74 @@
From: Shiji Yang <yangshiji66@outlook.com>
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.
4. Enable this feature only for 32-bit CPUs. Currently, only ath79 and
ralink CPUs are using it.
[1] 439a1bcac648 ("fortify: Use __builtin_dynamic_object_size() when available")
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
---
arch/mips/include/asm/bootinfo.h | 2 ++
arch/mips/kernel/setup.c | 17 ++++++++++++-----
2 files changed, 14 insertions(+), 5 deletions(-)
--- a/arch/mips/include/asm/bootinfo.h
+++ b/arch/mips/include/asm/bootinfo.h
@@ -93,7 +93,9 @@ const char *get_system_type(void);
extern unsigned long mips_machtype;
+#ifndef CONFIG_64BIT
extern void detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max);
+#endif
extern void prom_init(void);
extern void prom_free_prom_memory(void);
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -90,21 +90,27 @@ static struct resource bss_resource = {
unsigned long __kaslr_offset __ro_after_init;
EXPORT_SYMBOL(__kaslr_offset);
-static void *detect_magic __initdata = detect_memory_region;
-
#ifdef CONFIG_MIPS_AUTO_PFN_OFFSET
unsigned long ARCH_PFN_OFFSET;
EXPORT_SYMBOL(ARCH_PFN_OFFSET);
#endif
+#ifndef CONFIG_64BIT
+static u32 detect_magic __initdata;
+#define MIPS_MEM_TEST_PATTERN 0xaa5555aa
+
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",
@@ -115,6 +121,7 @@ void __init detect_memory_region(phys_ad
memblock_add(start, size);
}
+#endif /* CONFIG_64BIT */
/*
* Manage initrd

@ -7,35 +7,45 @@ Subject: [PATCH] mips: kernel: fix detect_memory_region() function
2. Use a fixed pattern instead of a random function pointer as the 2. Use a fixed pattern instead of a random function pointer as the
magic value. magic value.
3. Flip magic value and double check it. 3. Flip magic value and double check it.
4. Enable this feature only for 32-bit CPUs. Currently, only ath79 and
ralink CPUs are using it.
[1] 439a1bcac648 ("fortify: Use __builtin_dynamic_object_size() when available") [1] 439a1bcac648 ("fortify: Use __builtin_dynamic_object_size() when available")
Signed-off-by: Shiji Yang <yangshiji66@outlook.com> Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
--- ---
arch/mips/kernel/setup.c | 16 +++++++++++----- arch/mips/include/asm/bootinfo.h | 2 ++
1 file changed, 11 insertions(+), 5 deletions(-) arch/mips/kernel/setup.c | 17 ++++++++++++-----
2 files changed, 14 insertions(+), 5 deletions(-)
--- a/arch/mips/include/asm/bootinfo.h
+++ b/arch/mips/include/asm/bootinfo.h
@@ -93,7 +93,9 @@ const char *get_system_type(void);
extern unsigned long mips_machtype;
+#ifndef CONFIG_64BIT
extern void detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max);
+#endif
extern void prom_init(void);
extern void prom_free_prom_memory(void);
--- a/arch/mips/kernel/setup.c --- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c
@@ -46,6 +46,8 @@ @@ -90,21 +90,27 @@ static struct resource bss_resource = {
#include <asm/prom.h>
#include <asm/fw/fw.h>
+#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; unsigned long __kaslr_offset __ro_after_init;
EXPORT_SYMBOL(__kaslr_offset); EXPORT_SYMBOL(__kaslr_offset);
-static void *detect_magic __initdata = detect_memory_region; -static void *detect_magic __initdata = detect_memory_region;
+static u32 detect_magic __initdata; -
#ifdef CONFIG_MIPS_AUTO_PFN_OFFSET #ifdef CONFIG_MIPS_AUTO_PFN_OFFSET
unsigned long ARCH_PFN_OFFSET; unsigned long ARCH_PFN_OFFSET;
@@ -99,12 +101,16 @@ EXPORT_SYMBOL(ARCH_PFN_OFFSET); EXPORT_SYMBOL(ARCH_PFN_OFFSET);
#endif
+#ifndef CONFIG_64BIT
+static u32 detect_magic __initdata;
+#define MIPS_MEM_TEST_PATTERN 0xaa5555aa
+
void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max) 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 = &detect_magic;
@ -54,3 +64,11 @@ Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
} }
pr_debug("Memory: %lluMB of RAM detected at 0x%llx (min: %lluMB, max: %lluMB)\n", pr_debug("Memory: %lluMB of RAM detected at 0x%llx (min: %lluMB, max: %lluMB)\n",
@@ -115,6 +121,7 @@ void __init detect_memory_region(phys_ad
memblock_add(start, size);
}
+#endif /* CONFIG_64BIT */
/*
* Manage initrd

@ -17,7 +17,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/arch/mips/kernel/setup.c --- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c
@@ -557,8 +557,28 @@ static int __init bootcmdline_scan_chose @@ -564,8 +564,28 @@ static int __init bootcmdline_scan_chose
#endif /* CONFIG_OF_EARLY_FLATTREE */ #endif /* CONFIG_OF_EARLY_FLATTREE */
@ -46,7 +46,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
bool dt_bootargs = false; bool dt_bootargs = false;
/* /*
@@ -572,6 +592,14 @@ static void __init bootcmdline_init(void @@ -579,6 +599,14 @@ static void __init bootcmdline_init(void
} }
/* /*

@ -10,7 +10,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
--- a/arch/mips/kernel/setup.c --- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c
@@ -699,7 +699,6 @@ static void __init arch_mem_init(char ** @@ -706,7 +706,6 @@ static void __init arch_mem_init(char **
mips_reserve_vmcore(); mips_reserve_vmcore();
mips_parse_crashkernel(); mips_parse_crashkernel();
@ -18,7 +18,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
/* /*
* In order to reduce the possibility of kernel panic when failed to * In order to reduce the possibility of kernel panic when failed to
@@ -834,6 +833,7 @@ void __init setup_arch(char **cmdline_p) @@ -841,6 +840,7 @@ void __init setup_arch(char **cmdline_p)
cpu_cache_init(); cpu_cache_init();
paging_init(); paging_init();

@ -17,7 +17,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
--- a/arch/mips/kernel/setup.c --- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c
@@ -563,8 +563,28 @@ static int __init bootcmdline_scan_chose @@ -564,8 +564,28 @@ static int __init bootcmdline_scan_chose
#endif /* CONFIG_OF_EARLY_FLATTREE */ #endif /* CONFIG_OF_EARLY_FLATTREE */
@ -46,7 +46,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
bool dt_bootargs = false; bool dt_bootargs = false;
/* /*
@@ -578,6 +598,14 @@ static void __init bootcmdline_init(void @@ -579,6 +599,14 @@ static void __init bootcmdline_init(void
} }
/* /*

@ -10,7 +10,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
--- a/arch/mips/kernel/setup.c --- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c
@@ -705,7 +705,6 @@ static void __init arch_mem_init(char ** @@ -706,7 +706,6 @@ static void __init arch_mem_init(char **
mips_reserve_vmcore(); mips_reserve_vmcore();
mips_parse_crashkernel(); mips_parse_crashkernel();
@ -18,7 +18,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
/* /*
* In order to reduce the possibility of kernel panic when failed to * In order to reduce the possibility of kernel panic when failed to
@@ -841,6 +840,7 @@ void __init setup_arch(char **cmdline_p) @@ -842,6 +841,7 @@ void __init setup_arch(char **cmdline_p)
cpu_cache_init(); cpu_cache_init();
paging_init(); paging_init();