350-mips-kernel-fix-detect_memory_region-function.patch 2.4 KB

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