162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_SECTIONS_H 362306a36Sopenharmony_ci#define _ASM_POWERPC_SECTIONS_H 462306a36Sopenharmony_ci#ifdef __KERNEL__ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/elf.h> 762306a36Sopenharmony_ci#include <linux/uaccess.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS 1062306a36Sopenharmony_citypedef struct func_desc func_desc_t; 1162306a36Sopenharmony_ci#endif 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <asm-generic/sections.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciextern char __head_end[]; 1662306a36Sopenharmony_ciextern char __srwx_boundary[]; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* Patch sites */ 1962306a36Sopenharmony_ciextern s32 patch__call_flush_branch_caches1; 2062306a36Sopenharmony_ciextern s32 patch__call_flush_branch_caches2; 2162306a36Sopenharmony_ciextern s32 patch__call_flush_branch_caches3; 2262306a36Sopenharmony_ciextern s32 patch__flush_count_cache_return; 2362306a36Sopenharmony_ciextern s32 patch__flush_link_stack_return; 2462306a36Sopenharmony_ciextern s32 patch__call_kvm_flush_link_stack; 2562306a36Sopenharmony_ciextern s32 patch__call_kvm_flush_link_stack_p9; 2662306a36Sopenharmony_ciextern s32 patch__memset_nocache, patch__memcpy_nocache; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciextern long flush_branch_caches; 2962306a36Sopenharmony_ciextern long kvm_flush_link_stack; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#ifdef __powerpc64__ 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciextern char __start_interrupts[]; 3462306a36Sopenharmony_ciextern char __end_interrupts[]; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#ifdef CONFIG_PPC_POWERNV 3762306a36Sopenharmony_ciextern char start_real_trampolines[]; 3862306a36Sopenharmony_ciextern char end_real_trampolines[]; 3962306a36Sopenharmony_ciextern char start_virt_trampolines[]; 4062306a36Sopenharmony_ciextern char end_virt_trampolines[]; 4162306a36Sopenharmony_ci#endif 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* 4462306a36Sopenharmony_ci * This assumes the kernel is never compiled -mcmodel=small or 4562306a36Sopenharmony_ci * the total .toc is always less than 64k. 4662306a36Sopenharmony_ci */ 4762306a36Sopenharmony_cistatic inline unsigned long kernel_toc_addr(void) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci#ifdef CONFIG_PPC_KERNEL_PCREL 5062306a36Sopenharmony_ci BUILD_BUG(); 5162306a36Sopenharmony_ci return -1UL; 5262306a36Sopenharmony_ci#else 5362306a36Sopenharmony_ci unsigned long toc_ptr; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci asm volatile("mr %0, 2" : "=r" (toc_ptr)); 5662306a36Sopenharmony_ci return toc_ptr; 5762306a36Sopenharmony_ci#endif 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic inline int overlaps_interrupt_vector_text(unsigned long start, 6162306a36Sopenharmony_ci unsigned long end) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci unsigned long real_start, real_end; 6462306a36Sopenharmony_ci real_start = __start_interrupts - _stext; 6562306a36Sopenharmony_ci real_end = __end_interrupts - _stext; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci return start < (unsigned long)__va(real_end) && 6862306a36Sopenharmony_ci (unsigned long)__va(real_start) < end; 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic inline int overlaps_kernel_text(unsigned long start, unsigned long end) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci return start < (unsigned long)__init_end && 7462306a36Sopenharmony_ci (unsigned long)_stext < end; 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#else 7862306a36Sopenharmony_cistatic inline unsigned long kernel_toc_addr(void) { BUILD_BUG(); return -1UL; } 7962306a36Sopenharmony_ci#endif 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#endif /* __KERNEL__ */ 8262306a36Sopenharmony_ci#endif /* _ASM_POWERPC_SECTIONS_H */ 83