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