kasan.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __ASM_KASAN_H
  3. #define __ASM_KASAN_H
  4. #ifdef CONFIG_KASAN
  5. #define _GLOBAL_KASAN(fn) _GLOBAL(__##fn)
  6. #define _GLOBAL_TOC_KASAN(fn) _GLOBAL_TOC(__##fn)
  7. #define EXPORT_SYMBOL_KASAN(fn) EXPORT_SYMBOL(__##fn)
  8. #else
  9. #define _GLOBAL_KASAN(fn) _GLOBAL(fn)
  10. #define _GLOBAL_TOC_KASAN(fn) _GLOBAL_TOC(fn)
  11. #define EXPORT_SYMBOL_KASAN(fn)
  12. #endif
  13. #ifndef __ASSEMBLY__
  14. #include <asm/page.h>
  15. #include <linux/sizes.h>
  16. #define KASAN_SHADOW_SCALE_SHIFT 3
  17. #if defined(CONFIG_MODULES) && defined(CONFIG_PPC32)
  18. #define KASAN_KERN_START ALIGN_DOWN(PAGE_OFFSET - SZ_256M, SZ_256M)
  19. #else
  20. #define KASAN_KERN_START PAGE_OFFSET
  21. #endif
  22. #define KASAN_SHADOW_START (KASAN_SHADOW_OFFSET + \
  23. (KASAN_KERN_START >> KASAN_SHADOW_SCALE_SHIFT))
  24. #define KASAN_SHADOW_OFFSET ASM_CONST(CONFIG_KASAN_SHADOW_OFFSET)
  25. #ifdef CONFIG_PPC32
  26. #define KASAN_SHADOW_END (-(-KASAN_SHADOW_START >> KASAN_SHADOW_SCALE_SHIFT))
  27. #elif defined(CONFIG_PPC_BOOK3S_64)
  28. /*
  29. * The shadow ends before the highest accessible address
  30. * because we don't need a shadow for the shadow. Instead:
  31. * c00e000000000000 << 3 + a80e000000000000 = c00fc00000000000
  32. */
  33. #define KASAN_SHADOW_END 0xc00fc00000000000UL
  34. #else
  35. /*
  36. * The shadow ends before the highest accessible address
  37. * because we don't need a shadow for the shadow.
  38. * But it doesn't hurt to have a shadow for the shadow,
  39. * keep shadow end aligned eases things.
  40. */
  41. #define KASAN_SHADOW_END 0xc000200000000000UL
  42. #endif
  43. #ifdef CONFIG_KASAN
  44. #ifdef CONFIG_PPC_BOOK3S_64
  45. DECLARE_STATIC_KEY_FALSE(powerpc_kasan_enabled_key);
  46. static __always_inline bool kasan_arch_is_ready(void)
  47. {
  48. if (static_branch_likely(&powerpc_kasan_enabled_key))
  49. return true;
  50. return false;
  51. }
  52. #define kasan_arch_is_ready kasan_arch_is_ready
  53. #endif
  54. void kasan_early_init(void);
  55. void kasan_mmu_init(void);
  56. void kasan_init(void);
  57. void kasan_late_init(void);
  58. #else
  59. static inline void kasan_init(void) { }
  60. static inline void kasan_mmu_init(void) { }
  61. static inline void kasan_late_init(void) { }
  62. #endif
  63. void kasan_update_early_region(unsigned long k_start, unsigned long k_end, pte_t pte);
  64. int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end);
  65. int kasan_init_region(void *start, size_t size);
  66. #endif /* __ASSEMBLY */
  67. #endif