Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
fbcd54b1 JL |
2 | #ifndef _ASM_POWERPC_SECTIONS_H |
3 | #define _ASM_POWERPC_SECTIONS_H | |
88ced031 | 4 | #ifdef __KERNEL__ |
1da177e4 | 5 | |
2d291e90 JB |
6 | #include <linux/elf.h> |
7 | #include <linux/uaccess.h> | |
1da177e4 LT |
8 | #include <asm-generic/sections.h> |
9 | ||
7aa5b018 NR |
10 | extern char __head_end[]; |
11 | ||
fbcd54b1 | 12 | #ifdef __powerpc64__ |
1da177e4 | 13 | |
429d2e83 | 14 | extern char __start_interrupts[]; |
d715e433 | 15 | extern char __end_interrupts[]; |
1da177e4 | 16 | |
5ac47f7a AB |
17 | extern char __prom_init_toc_start[]; |
18 | extern char __prom_init_toc_end[]; | |
19 | ||
bd3524fe NP |
20 | #ifdef CONFIG_PPC_POWERNV |
21 | extern char start_real_trampolines[]; | |
22 | extern char end_real_trampolines[]; | |
23 | extern char start_virt_trampolines[]; | |
24 | extern char end_virt_trampolines[]; | |
25 | #endif | |
26 | ||
1da177e4 LT |
27 | static inline int in_kernel_text(unsigned long addr) |
28 | { | |
29 | if (addr >= (unsigned long)_stext && addr < (unsigned long)__init_end) | |
30 | return 1; | |
31 | ||
32 | return 0; | |
33 | } | |
34 | ||
a5cab83c ME |
35 | static inline unsigned long kernel_toc_addr(void) |
36 | { | |
37 | /* Defined by the linker, see vmlinux.lds.S */ | |
38 | extern unsigned long __toc_start; | |
39 | ||
40 | /* | |
41 | * The TOC register (r2) points 32kB into the TOC, so that 64kB of | |
42 | * the TOC can be addressed using a single machine instruction. | |
43 | */ | |
44 | return (unsigned long)(&__toc_start) + 0x8000UL; | |
45 | } | |
46 | ||
429d2e83 MS |
47 | static inline int overlaps_interrupt_vector_text(unsigned long start, |
48 | unsigned long end) | |
49 | { | |
50 | unsigned long real_start, real_end; | |
51 | real_start = __start_interrupts - _stext; | |
52 | real_end = __end_interrupts - _stext; | |
53 | ||
54 | return start < (unsigned long)__va(real_end) && | |
55 | (unsigned long)__va(real_start) < end; | |
56 | } | |
57 | ||
549e8152 PM |
58 | static inline int overlaps_kernel_text(unsigned long start, unsigned long end) |
59 | { | |
60 | return start < (unsigned long)__init_end && | |
61 | (unsigned long)_stext < end; | |
62 | } | |
63 | ||
b18db0b8 AG |
64 | static inline int overlaps_kvm_tmp(unsigned long start, unsigned long end) |
65 | { | |
66 | #ifdef CONFIG_KVM_GUEST | |
67 | extern char kvm_tmp[]; | |
68 | return start < (unsigned long)kvm_tmp && | |
69 | (unsigned long)&kvm_tmp[1024 * 1024] < end; | |
70 | #else | |
71 | return 0; | |
72 | #endif | |
73 | } | |
74 | ||
f55d9665 | 75 | #ifdef PPC64_ELF_ABI_v1 |
5633e85b SS |
76 | |
77 | #define HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR 1 | |
78 | ||
deac93df | 79 | #undef dereference_function_descriptor |
2d291e90 JB |
80 | static inline void *dereference_function_descriptor(void *ptr) |
81 | { | |
82 | struct ppc64_opd_entry *desc = ptr; | |
83 | void *p; | |
84 | ||
85 | if (!probe_kernel_address(&desc->funcaddr, p)) | |
86 | ptr = p; | |
87 | return ptr; | |
88 | } | |
5633e85b SS |
89 | |
90 | #undef dereference_kernel_function_descriptor | |
91 | static inline void *dereference_kernel_function_descriptor(void *ptr) | |
92 | { | |
93 | if (ptr < (void *)__start_opd || ptr >= (void *)__end_opd) | |
94 | return ptr; | |
95 | ||
96 | return dereference_function_descriptor(ptr); | |
97 | } | |
f55d9665 | 98 | #endif /* PPC64_ELF_ABI_v1 */ |
deac93df | 99 | |
1da177e4 | 100 | #endif |
fbcd54b1 | 101 | |
88ced031 | 102 | #endif /* __KERNEL__ */ |
fbcd54b1 | 103 | #endif /* _ASM_POWERPC_SECTIONS_H */ |