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