sections.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_POWERPC_SECTIONS_H
  3. #define _ASM_POWERPC_SECTIONS_H
  4. #ifdef __KERNEL__
  5. #include <linux/elf.h>
  6. #include <linux/uaccess.h>
  7. #ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS
  8. typedef struct func_desc func_desc_t;
  9. #endif
  10. #include <asm-generic/sections.h>
  11. extern char __head_end[];
  12. extern char __srwx_boundary[];
  13. /* Patch sites */
  14. extern s32 patch__call_flush_branch_caches1;
  15. extern s32 patch__call_flush_branch_caches2;
  16. extern s32 patch__call_flush_branch_caches3;
  17. extern s32 patch__flush_count_cache_return;
  18. extern s32 patch__flush_link_stack_return;
  19. extern s32 patch__call_kvm_flush_link_stack;
  20. extern s32 patch__call_kvm_flush_link_stack_p9;
  21. extern s32 patch__memset_nocache, patch__memcpy_nocache;
  22. extern long flush_branch_caches;
  23. extern long kvm_flush_link_stack;
  24. #ifdef __powerpc64__
  25. extern char __start_interrupts[];
  26. extern char __end_interrupts[];
  27. #ifdef CONFIG_PPC_POWERNV
  28. extern char start_real_trampolines[];
  29. extern char end_real_trampolines[];
  30. extern char start_virt_trampolines[];
  31. extern char end_virt_trampolines[];
  32. #endif
  33. /*
  34. * This assumes the kernel is never compiled -mcmodel=small or
  35. * the total .toc is always less than 64k.
  36. */
  37. static inline unsigned long kernel_toc_addr(void)
  38. {
  39. unsigned long toc_ptr;
  40. asm volatile("mr %0, 2" : "=r" (toc_ptr));
  41. return toc_ptr;
  42. }
  43. static inline int overlaps_interrupt_vector_text(unsigned long start,
  44. unsigned long end)
  45. {
  46. unsigned long real_start, real_end;
  47. real_start = __start_interrupts - _stext;
  48. real_end = __end_interrupts - _stext;
  49. return start < (unsigned long)__va(real_end) &&
  50. (unsigned long)__va(real_start) < end;
  51. }
  52. static inline int overlaps_kernel_text(unsigned long start, unsigned long end)
  53. {
  54. return start < (unsigned long)__init_end &&
  55. (unsigned long)_stext < end;
  56. }
  57. #endif
  58. #endif /* __KERNEL__ */
  59. #endif /* _ASM_POWERPC_SECTIONS_H */