]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - arch/powerpc/kernel/module_64.c
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-jammy-kernel.git] / arch / powerpc / kernel / module_64.c
CommitLineData
1a59d1b8 1// SPDX-License-Identifier: GPL-2.0-or-later
1da177e4
LT
2/* Kernel module help for PPC64.
3 Copyright (C) 2001, 2003 Rusty Russell IBM Corporation.
4
1da177e4 5*/
c7d1f6af
AB
6
7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8
1da177e4
LT
9#include <linux/module.h>
10#include <linux/elf.h>
11#include <linux/moduleloader.h>
12#include <linux/err.h>
13#include <linux/vmalloc.h>
f48cb8b4 14#include <linux/ftrace.h>
73c9ceab 15#include <linux/bug.h>
83775b85 16#include <linux/uaccess.h>
1da177e4 17#include <asm/module.h>
21c4ff80 18#include <asm/firmware.h>
b7bcda63 19#include <asm/code-patching.h>
eda09fbd 20#include <linux/sort.h>
b88c4767 21#include <asm/setup.h>
336a7b5d 22#include <asm/sections.h>
1da177e4
LT
23
24/* FIXME: We don't do .init separately. To do this, we'd need to have
25 a separate r2 value in the init and core section, and stub between
26 them, too.
27
28 Using a magic allocator which places modules within 32MB solves
29 this, and makes other things simpler. Anton?
30 --RR. */
1da177e4 31
f55d9665 32#ifdef PPC64_ELF_ABI_v2
008d7a91
RR
33
34/* An address is simply the address of the function. */
35typedef unsigned long func_desc_t;
36
37static func_desc_t func_desc(unsigned long addr)
38{
39 return addr;
40}
41static unsigned long func_addr(unsigned long addr)
42{
43 return addr;
44}
45static unsigned long stub_func_addr(func_desc_t func)
46{
47 return func;
48}
49
50/* PowerPC64 specific values for the Elf64_Sym st_other field. */
51#define STO_PPC64_LOCAL_BIT 5
52#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT)
53#define PPC64_LOCAL_ENTRY_OFFSET(other) \
54 (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2)
55
56static unsigned int local_entry_offset(const Elf64_Sym *sym)
57{
58 /* sym->st_other indicates offset to local entry point
59 * (otherwise it will assume r12 is the address of the start
60 * of function and try to derive r2 from it). */
61 return PPC64_LOCAL_ENTRY_OFFSET(sym->st_other);
62}
d2fae548 63#else
008d7a91
RR
64
65/* An address is address of the OPD entry, which contains address of fn. */
66typedef struct ppc64_opd_entry func_desc_t;
67
68static func_desc_t func_desc(unsigned long addr)
69{
70 return *(struct ppc64_opd_entry *)addr;
71}
72static unsigned long func_addr(unsigned long addr)
73{
74 return func_desc(addr).funcaddr;
75}
76static unsigned long stub_func_addr(func_desc_t func)
77{
78 return func.funcaddr;
79}
80static unsigned int local_entry_offset(const Elf64_Sym *sym)
81{
82 return 0;
83}
5633e85b
SS
84
85void *dereference_module_function_descriptor(struct module *mod, void *ptr)
86{
87 if (ptr < (void *)mod->arch.start_opd ||
88 ptr >= (void *)mod->arch.end_opd)
89 return ptr;
90
91 return dereference_function_descriptor(ptr);
92}
d2fae548
RR
93#endif
94
f17c4e01
ME
95#define STUB_MAGIC 0x73747562 /* stub */
96
1da177e4
LT
97/* Like PPC32, we need little trampolines to do > 24-bit jumps (into
98 the kernel itself). But on PPC64, these need to be used for every
99 jump, actually, to reset r2 (TOC+0x8000). */
100struct ppc64_stub_entry
101{
83775b85
AB
102 /* 28 byte jump instruction sequence (7 instructions). We only
103 * need 6 instructions on ABIv2 but we always allocate 7 so
104 * so we don't have to modify the trampoline load instruction. */
0e60e46e 105 u32 jump[7];
f17c4e01
ME
106 /* Used by ftrace to identify stubs */
107 u32 magic;
1da177e4 108 /* Data for the above code */
008d7a91 109 func_desc_t funcdata;
1da177e4
LT
110};
111
5c729a11
RR
112/*
113 * PPC64 uses 24 bit jumps, but we need to jump into other modules or
114 * the kernel which may be further. So we jump to a stub.
115 *
116 * For ELFv1 we need to use this to set up the new r2 value (aka TOC
117 * pointer). For ELFv2 it's the callee's responsibility to set up the
118 * new r2, but for both we need to save the old r2.
119 *
120 * We could simply patch the new r2 value and function pointer into
121 * the stub, but it's significantly shorter to put these values at the
122 * end of the stub code, and patch the stub address (32-bits relative
123 * to the TOC ptr, r2) into the stub.
124 */
83775b85
AB
125
126static u32 ppc64_stub_insns[] = {
b1ce369e
RR
127 0x3d620000, /* addis r11,r2, <high> */
128 0x396b0000, /* addi r11,r11, <low> */
fed8393e 129 /* Save current r2 value in magic place on the stack. */
d2fae548 130 0xf8410000|R2_STACK_OFFSET, /* std r2,R2_STACK_OFFSET(r1) */
b1ce369e 131 0xe98b0020, /* ld r12,32(r11) */
f55d9665 132#ifdef PPC64_ELF_ABI_v1
5c729a11 133 /* Set up new r2 from function descriptor */
872aa779 134 0xe84b0028, /* ld r2,40(r11) */
5c729a11 135#endif
b1ce369e 136 0x7d8903a6, /* mtctr r12 */
d2fae548 137 0x4e800420 /* bctr */
83775b85
AB
138};
139
140#ifdef CONFIG_DYNAMIC_FTRACE
f17c4e01
ME
141int module_trampoline_target(struct module *mod, unsigned long addr,
142 unsigned long *target)
83775b85 143{
f17c4e01
ME
144 struct ppc64_stub_entry *stub;
145 func_desc_t funcdata;
146 u32 magic;
83775b85 147
f17c4e01
ME
148 if (!within_module_core(addr, mod)) {
149 pr_err("%s: stub %lx not in module %s\n", __func__, addr, mod->name);
83775b85 150 return -EFAULT;
83775b85
AB
151 }
152
f17c4e01 153 stub = (struct ppc64_stub_entry *)addr;
dd9fa162 154
f17c4e01
ME
155 if (probe_kernel_read(&magic, &stub->magic, sizeof(magic))) {
156 pr_err("%s: fault reading magic for stub %lx for %s\n", __func__, addr, mod->name);
dd9fa162 157 return -EFAULT;
f17c4e01 158 }
dd9fa162 159
f17c4e01
ME
160 if (magic != STUB_MAGIC) {
161 pr_err("%s: bad magic for stub %lx for %s\n", __func__, addr, mod->name);
162 return -EFAULT;
163 }
dd9fa162 164
f17c4e01
ME
165 if (probe_kernel_read(&funcdata, &stub->funcdata, sizeof(funcdata))) {
166 pr_err("%s: fault reading funcdata for stub %lx for %s\n", __func__, addr, mod->name);
167 return -EFAULT;
168 }
dd9fa162 169
f17c4e01 170 *target = stub_func_addr(funcdata);
dd9fa162
AB
171
172 return 0;
173}
83775b85 174#endif
1da177e4
LT
175
176/* Count how many different 24-bit relocations (different symbol,
177 different addend) */
178static unsigned int count_relocs(const Elf64_Rela *rela, unsigned int num)
179{
eda09fbd 180 unsigned int i, r_info, r_addend, _count_relocs;
1da177e4
LT
181
182 /* FIXME: Only count external ones --RR */
eda09fbd
EM
183 _count_relocs = 0;
184 r_info = 0;
185 r_addend = 0;
186 for (i = 0; i < num; i++)
1da177e4 187 /* Only count 24-bit relocs, others don't need stubs */
eda09fbd
EM
188 if (ELF64_R_TYPE(rela[i].r_info) == R_PPC_REL24 &&
189 (r_info != ELF64_R_SYM(rela[i].r_info) ||
190 r_addend != rela[i].r_addend)) {
191 _count_relocs++;
192 r_info = ELF64_R_SYM(rela[i].r_info);
193 r_addend = rela[i].r_addend;
1da177e4 194 }
eda09fbd
EM
195
196 return _count_relocs;
1da177e4
LT
197}
198
eda09fbd
EM
199static int relacmp(const void *_x, const void *_y)
200{
201 const Elf64_Rela *x, *y;
202
203 y = (Elf64_Rela *)_x;
204 x = (Elf64_Rela *)_y;
205
206 /* Compare the entire r_info (as opposed to ELF64_R_SYM(r_info) only) to
207 * make the comparison cheaper/faster. It won't affect the sorting or
208 * the counting algorithms' performance
209 */
210 if (x->r_info < y->r_info)
211 return -1;
212 else if (x->r_info > y->r_info)
213 return 1;
214 else if (x->r_addend < y->r_addend)
215 return -1;
216 else if (x->r_addend > y->r_addend)
217 return 1;
218 else
219 return 0;
220}
221
222static void relaswap(void *_x, void *_y, int size)
223{
224 uint64_t *x, *y, tmp;
225 int i;
226
227 y = (uint64_t *)_x;
228 x = (uint64_t *)_y;
229
230 for (i = 0; i < sizeof(Elf64_Rela) / sizeof(uint64_t); i++) {
231 tmp = x[i];
232 x[i] = y[i];
233 y[i] = tmp;
234 }
235}
236
1da177e4
LT
237/* Get size of potential trampolines required. */
238static unsigned long get_stubs_size(const Elf64_Ehdr *hdr,
239 const Elf64_Shdr *sechdrs)
240{
241 /* One extra reloc so it's always 0-funcaddr terminated */
242 unsigned long relocs = 1;
243 unsigned i;
244
245 /* Every relocated section... */
246 for (i = 1; i < hdr->e_shnum; i++) {
247 if (sechdrs[i].sh_type == SHT_RELA) {
c7d1f6af
AB
248 pr_debug("Found relocations in section %u\n", i);
249 pr_debug("Ptr: %p. Number: %Lu\n",
1da177e4
LT
250 (void *)sechdrs[i].sh_addr,
251 sechdrs[i].sh_size / sizeof(Elf64_Rela));
eda09fbd
EM
252
253 /* Sort the relocation information based on a symbol and
254 * addend key. This is a stable O(n*log n) complexity
255 * alogrithm but it will reduce the complexity of
256 * count_relocs() to linear complexity O(n)
257 */
258 sort((void *)sechdrs[i].sh_addr,
259 sechdrs[i].sh_size / sizeof(Elf64_Rela),
260 sizeof(Elf64_Rela), relacmp, relaswap);
261
1da177e4
LT
262 relocs += count_relocs((void *)sechdrs[i].sh_addr,
263 sechdrs[i].sh_size
264 / sizeof(Elf64_Rela));
265 }
266 }
267
f48cb8b4
SR
268#ifdef CONFIG_DYNAMIC_FTRACE
269 /* make the trampoline to the ftrace_caller */
270 relocs++;
ae30cc05
NR
271#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
272 /* an additional one for ftrace_regs_caller */
273 relocs++;
274#endif
f48cb8b4
SR
275#endif
276
c7d1f6af 277 pr_debug("Looks like a total of %lu stubs, max\n", relocs);
1da177e4
LT
278 return relocs * sizeof(struct ppc64_stub_entry);
279}
280
5b12c5c6 281/* Still needed for ELFv2, for .TOC. */
1da177e4
LT
282static void dedotify_versions(struct modversion_info *vers,
283 unsigned long size)
284{
285 struct modversion_info *end;
286
287 for (end = (void *)vers + size; vers < end; vers++)
c2cbcf53 288 if (vers->name[0] == '.') {
1da177e4 289 memmove(vers->name, vers->name+1, strlen(vers->name));
c2cbcf53 290 }
1da177e4
LT
291}
292
c153693d
AM
293/*
294 * Undefined symbols which refer to .funcname, hack to funcname. Make .TOC.
295 * seem to be defined (value set later).
296 */
1da177e4
LT
297static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab)
298{
299 unsigned int i;
300
301 for (i = 1; i < numsyms; i++) {
302 if (syms[i].st_shndx == SHN_UNDEF) {
303 char *name = strtab + syms[i].st_name;
c153693d
AM
304 if (name[0] == '.') {
305 if (strcmp(name+1, "TOC.") == 0)
306 syms[i].st_shndx = SHN_ABS;
f15838e9 307 syms[i].st_name++;
c153693d 308 }
1da177e4
LT
309 }
310 }
311}
312
4edebbea
RR
313static Elf64_Sym *find_dot_toc(Elf64_Shdr *sechdrs,
314 const char *strtab,
315 unsigned int symindex)
316{
317 unsigned int i, numsyms;
318 Elf64_Sym *syms;
319
320 syms = (Elf64_Sym *)sechdrs[symindex].sh_addr;
321 numsyms = sechdrs[symindex].sh_size / sizeof(Elf64_Sym);
322
323 for (i = 1; i < numsyms; i++) {
c153693d 324 if (syms[i].st_shndx == SHN_ABS
008d7a91 325 && strcmp(strtab + syms[i].st_name, "TOC.") == 0)
4edebbea
RR
326 return &syms[i];
327 }
328 return NULL;
329}
330
1da177e4
LT
331int module_frob_arch_sections(Elf64_Ehdr *hdr,
332 Elf64_Shdr *sechdrs,
333 char *secstrings,
334 struct module *me)
335{
336 unsigned int i;
337
338 /* Find .toc and .stubs sections, symtab and strtab */
339 for (i = 1; i < hdr->e_shnum; i++) {
340 char *p;
341 if (strcmp(secstrings + sechdrs[i].sh_name, ".stubs") == 0)
342 me->arch.stubs_section = i;
5c45b528 343 else if (strcmp(secstrings + sechdrs[i].sh_name, ".toc") == 0) {
1da177e4 344 me->arch.toc_section = i;
5c45b528
AM
345 if (sechdrs[i].sh_addralign < 8)
346 sechdrs[i].sh_addralign = 8;
347 }
1da177e4
LT
348 else if (strcmp(secstrings+sechdrs[i].sh_name,"__versions")==0)
349 dedotify_versions((void *)hdr + sechdrs[i].sh_offset,
350 sechdrs[i].sh_size);
351
352 /* We don't handle .init for the moment: rename to _init */
353 while ((p = strstr(secstrings + sechdrs[i].sh_name, ".init")))
354 p[0] = '_';
355
356 if (sechdrs[i].sh_type == SHT_SYMTAB)
357 dedotify((void *)hdr + sechdrs[i].sh_offset,
358 sechdrs[i].sh_size / sizeof(Elf64_Sym),
359 (void *)hdr
360 + sechdrs[sechdrs[i].sh_link].sh_offset);
361 }
f749edae
AM
362
363 if (!me->arch.stubs_section) {
c7d1f6af 364 pr_err("%s: doesn't contain .stubs.\n", me->name);
1da177e4
LT
365 return -ENOEXEC;
366 }
367
f749edae
AM
368 /* If we don't have a .toc, just use .stubs. We need to set r2
369 to some reasonable value in case the module calls out to
370 other functions via a stub, or if a function pointer escapes
371 the module by some means. */
372 if (!me->arch.toc_section)
373 me->arch.toc_section = me->arch.stubs_section;
374
1da177e4
LT
375 /* Override the stubs size */
376 sechdrs[me->arch.stubs_section].sh_size = get_stubs_size(hdr, sechdrs);
377 return 0;
378}
379
5c45b528
AM
380/*
381 * r2 is the TOC pointer: it actually points 0x8000 into the TOC (this gives the
382 * value maximum span in an instruction which uses a signed offset). Round down
383 * to a 256 byte boundary for the odd case where we are setting up r2 without a
384 * .toc section.
385 */
136cd345 386static inline unsigned long my_r2(const Elf64_Shdr *sechdrs, struct module *me)
1da177e4 387{
5c45b528 388 return (sechdrs[me->arch.toc_section].sh_addr & ~0xfful) + 0x8000;
1da177e4
LT
389}
390
391/* Both low and high 16 bits are added as SIGNED additions, so if low
392 16 bits has high bit set, high 16 bits must be adjusted. These
393 macros do that (stolen from binutils). */
394#define PPC_LO(v) ((v) & 0xffff)
395#define PPC_HI(v) (((v) >> 16) & 0xffff)
396#define PPC_HA(v) PPC_HI ((v) + 0x8000)
397
398/* Patch stub to reference function and correct r2 value. */
136cd345 399static inline int create_stub(const Elf64_Shdr *sechdrs,
1da177e4 400 struct ppc64_stub_entry *entry,
008d7a91 401 unsigned long addr,
1da177e4
LT
402 struct module *me)
403{
1da177e4
LT
404 long reladdr;
405
83775b85 406 memcpy(entry->jump, ppc64_stub_insns, sizeof(ppc64_stub_insns));
1da177e4 407
1da177e4
LT
408 /* Stub uses address relative to r2. */
409 reladdr = (unsigned long)entry - my_r2(sechdrs, me);
410 if (reladdr > 0x7FFFFFFF || reladdr < -(0x80000000L)) {
c7d1f6af 411 pr_err("%s: Address %p of stub out of range of %p.\n",
1da177e4
LT
412 me->name, (void *)reladdr, (void *)my_r2);
413 return 0;
414 }
c7d1f6af 415 pr_debug("Stub %p get data from reladdr %li\n", entry, reladdr);
1da177e4 416
0e60e46e
RR
417 entry->jump[0] |= PPC_HA(reladdr);
418 entry->jump[1] |= PPC_LO(reladdr);
008d7a91 419 entry->funcdata = func_desc(addr);
f17c4e01
ME
420 entry->magic = STUB_MAGIC;
421
1da177e4
LT
422 return 1;
423}
424
008d7a91 425/* Create stub to jump to function described in this OPD/ptr: we need the
1da177e4 426 stub to set up the TOC ptr (r2) for the function. */
136cd345 427static unsigned long stub_for_addr(const Elf64_Shdr *sechdrs,
008d7a91 428 unsigned long addr,
1da177e4
LT
429 struct module *me)
430{
431 struct ppc64_stub_entry *stubs;
1da177e4
LT
432 unsigned int i, num_stubs;
433
434 num_stubs = sechdrs[me->arch.stubs_section].sh_size / sizeof(*stubs);
435
436 /* Find this stub, or if that fails, the next avail. entry */
437 stubs = (void *)sechdrs[me->arch.stubs_section].sh_addr;
008d7a91 438 for (i = 0; stub_func_addr(stubs[i].funcdata); i++) {
1c0437af
KB
439 if (WARN_ON(i >= num_stubs))
440 return 0;
1da177e4 441
008d7a91 442 if (stub_func_addr(stubs[i].funcdata) == func_addr(addr))
1da177e4
LT
443 return (unsigned long)&stubs[i];
444 }
445
008d7a91 446 if (!create_stub(sechdrs, &stubs[i], addr, me))
1da177e4
LT
447 return 0;
448
449 return (unsigned long)&stubs[i];
450}
451
abba7597 452#ifdef CONFIG_MPROFILE_KERNEL
250122ba 453static bool is_mprofile_mcount_callsite(const char *name, u32 *instruction)
15308664 454{
250122ba
NR
455 if (strcmp("_mcount", name))
456 return false;
457
15308664
TD
458 /*
459 * Check if this is one of the -mprofile-kernel sequences.
460 */
461 if (instruction[-1] == PPC_INST_STD_LR &&
462 instruction[-2] == PPC_INST_MFLR)
463 return true;
464
465 if (instruction[-1] == PPC_INST_MFLR)
466 return true;
467
468 return false;
469}
470
471/*
472 * In case of _mcount calls, do not save the current callee's TOC (in r2) into
473 * the original caller's stack frame. If we did we would clobber the saved TOC
474 * value of the original caller.
475 */
476static void squash_toc_save_inst(const char *name, unsigned long addr)
477{
478 struct ppc64_stub_entry *stub = (struct ppc64_stub_entry *)addr;
479
480 /* Only for calls to _mcount */
481 if (strcmp("_mcount", name) != 0)
482 return;
483
484 stub->jump[2] = PPC_INST_NOP;
485}
486#else
487static void squash_toc_save_inst(const char *name, unsigned long addr) { }
488
250122ba 489static bool is_mprofile_mcount_callsite(const char *name, u32 *instruction)
15308664
TD
490{
491 return false;
492}
493#endif
494
1da177e4
LT
495/* We expect a noop next: if it is, replace it with instruction to
496 restore r2. */
250122ba 497static int restore_r2(const char *name, u32 *instruction, struct module *me)
1da177e4 498{
b9eab08d
JP
499 u32 *prev_insn = instruction - 1;
500
250122ba 501 if (is_mprofile_mcount_callsite(name, prev_insn))
b9eab08d
JP
502 return 1;
503
504 /*
505 * Make sure the branch isn't a sibling call. Sibling calls aren't
506 * "link" branches and they don't return, so they don't need the r2
507 * restore afterwards.
508 */
509 if (!instr_is_relative_link_branch(*prev_insn))
31278b17
ME
510 return 1;
511
16c57b36 512 if (*instruction != PPC_INST_NOP) {
1ea61ea2
JP
513 pr_err("%s: Expected nop after call, got %08x at %pS\n",
514 me->name, *instruction, instruction);
1da177e4
LT
515 return 0;
516 }
d2fae548 517 /* ld r2,R2_STACK_OFFSET(r1) */
15308664 518 *instruction = PPC_INST_LD_TOC;
1da177e4
LT
519 return 1;
520}
521
522int apply_relocate_add(Elf64_Shdr *sechdrs,
523 const char *strtab,
524 unsigned int symindex,
525 unsigned int relsec,
526 struct module *me)
527{
528 unsigned int i;
529 Elf64_Rela *rela = (void *)sechdrs[relsec].sh_addr;
530 Elf64_Sym *sym;
531 unsigned long *location;
532 unsigned long value;
533
c7d1f6af 534 pr_debug("Applying ADD relocate section %u to %u\n", relsec,
1da177e4 535 sechdrs[relsec].sh_info);
4edebbea
RR
536
537 /* First time we're called, we can fix up .TOC. */
538 if (!me->arch.toc_fixed) {
539 sym = find_dot_toc(sechdrs, strtab, symindex);
540 /* It's theoretically possible that a module doesn't want a
541 * .TOC. so don't fail it just for that. */
542 if (sym)
543 sym->st_value = my_r2(sechdrs, me);
544 me->arch.toc_fixed = true;
545 }
546
1da177e4
LT
547 for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) {
548 /* This is where to make the change */
549 location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
550 + rela[i].r_offset;
551 /* This is the symbol it is referring to */
552 sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
553 + ELF64_R_SYM(rela[i].r_info);
554
c7d1f6af 555 pr_debug("RELOC at %p: %li-type as %s (0x%lx) + %li\n",
1da177e4
LT
556 location, (long)ELF64_R_TYPE(rela[i].r_info),
557 strtab + sym->st_name, (unsigned long)sym->st_value,
558 (long)rela[i].r_addend);
559
560 /* `Everything is relative'. */
561 value = sym->st_value + rela[i].r_addend;
562
563 switch (ELF64_R_TYPE(rela[i].r_info)) {
564 case R_PPC64_ADDR32:
565 /* Simply set it */
566 *(u32 *)location = value;
567 break;
eda09fbd 568
1da177e4
LT
569 case R_PPC64_ADDR64:
570 /* Simply set it */
571 *(unsigned long *)location = value;
572 break;
573
574 case R_PPC64_TOC:
575 *(unsigned long *)location = my_r2(sechdrs, me);
576 break;
577
9149ccfa 578 case R_PPC64_TOC16:
f749edae 579 /* Subtract TOC pointer */
9149ccfa
PB
580 value -= my_r2(sechdrs, me);
581 if (value + 0x8000 > 0xffff) {
c7d1f6af 582 pr_err("%s: bad TOC16 relocation (0x%lx)\n",
9149ccfa
PB
583 me->name, value);
584 return -ENOEXEC;
585 }
586 *((uint16_t *) location)
587 = (*((uint16_t *) location) & ~0xffff)
588 | (value & 0xffff);
589 break;
590
1fbe9cf2
AB
591 case R_PPC64_TOC16_LO:
592 /* Subtract TOC pointer */
593 value -= my_r2(sechdrs, me);
594 *((uint16_t *) location)
595 = (*((uint16_t *) location) & ~0xffff)
596 | (value & 0xffff);
597 break;
598
1da177e4 599 case R_PPC64_TOC16_DS:
f749edae 600 /* Subtract TOC pointer */
1da177e4
LT
601 value -= my_r2(sechdrs, me);
602 if ((value & 3) != 0 || value + 0x8000 > 0xffff) {
c7d1f6af 603 pr_err("%s: bad TOC16_DS relocation (0x%lx)\n",
1da177e4
LT
604 me->name, value);
605 return -ENOEXEC;
606 }
607 *((uint16_t *) location)
608 = (*((uint16_t *) location) & ~0xfffc)
609 | (value & 0xfffc);
610 break;
611
1fbe9cf2
AB
612 case R_PPC64_TOC16_LO_DS:
613 /* Subtract TOC pointer */
614 value -= my_r2(sechdrs, me);
615 if ((value & 3) != 0) {
c7d1f6af 616 pr_err("%s: bad TOC16_LO_DS relocation (0x%lx)\n",
1fbe9cf2
AB
617 me->name, value);
618 return -ENOEXEC;
619 }
620 *((uint16_t *) location)
621 = (*((uint16_t *) location) & ~0xfffc)
622 | (value & 0xfffc);
623 break;
624
625 case R_PPC64_TOC16_HA:
626 /* Subtract TOC pointer */
627 value -= my_r2(sechdrs, me);
628 value = ((value + 0x8000) >> 16);
629 *((uint16_t *) location)
630 = (*((uint16_t *) location) & ~0xffff)
631 | (value & 0xffff);
632 break;
633
1da177e4
LT
634 case R_PPC_REL24:
635 /* FIXME: Handle weak symbols here --RR */
a443bf6e
KB
636 if (sym->st_shndx == SHN_UNDEF ||
637 sym->st_shndx == SHN_LIVEPATCH) {
1da177e4
LT
638 /* External: go via stub */
639 value = stub_for_addr(sechdrs, value, me);
640 if (!value)
641 return -ENOENT;
250122ba
NR
642 if (!restore_r2(strtab + sym->st_name,
643 (u32 *)location + 1, me))
1da177e4 644 return -ENOEXEC;
15308664
TD
645
646 squash_toc_save_inst(strtab + sym->st_name, value);
008d7a91
RR
647 } else
648 value += local_entry_offset(sym);
1da177e4
LT
649
650 /* Convert value to relative */
651 value -= (unsigned long)location;
652 if (value + 0x2000000 > 0x3ffffff || (value & 3) != 0){
c7d1f6af 653 pr_err("%s: REL24 %li out of range!\n",
1da177e4
LT
654 me->name, (long int)value);
655 return -ENOEXEC;
656 }
657
658 /* Only replace bits 2 through 26 */
eda09fbd 659 *(uint32_t *)location
1da177e4
LT
660 = (*(uint32_t *)location & ~0x03fffffc)
661 | (value & 0x03fffffc);
662 break;
663
21c4ff80
BH
664 case R_PPC64_REL64:
665 /* 64 bits relative (used by features fixups) */
666 *location = value - (unsigned long)location;
667 break;
668
9f751b82
ME
669 case R_PPC64_REL32:
670 /* 32 bits relative (used by relative exception tables) */
b851ba02
NP
671 /* Convert value to relative */
672 value -= (unsigned long)location;
673 if (value + 0x80000000 > 0xffffffff) {
674 pr_err("%s: REL32 %li out of range!\n",
675 me->name, (long int)value);
676 return -ENOEXEC;
677 }
678 *(u32 *)location = value;
9f751b82
ME
679 break;
680
d247da0a
RR
681 case R_PPC64_TOCSAVE:
682 /*
683 * Marker reloc indicates we don't have to save r2.
684 * That would only save us one instruction, so ignore
685 * it.
686 */
687 break;
688
a61674bd
UW
689 case R_PPC64_ENTRY:
690 /*
691 * Optimize ELFv2 large code model entry point if
692 * the TOC is within 2GB range of current location.
693 */
694 value = my_r2(sechdrs, me) - (unsigned long)location;
695 if (value + 0x80008000 > 0xffffffff)
696 break;
697 /*
698 * Check for the large code model prolog sequence:
699 * ld r2, ...(r12)
700 * add r2, r2, r12
701 */
702 if ((((uint32_t *)location)[0] & ~0xfffc)
703 != 0xe84c0000)
704 break;
705 if (((uint32_t *)location)[1] != 0x7c426214)
706 break;
707 /*
708 * If found, replace it with:
709 * addis r2, r12, (.TOC.-func)@ha
710 * addi r2, r12, (.TOC.-func)@l
711 */
712 ((uint32_t *)location)[0] = 0x3c4c0000 + PPC_HA(value);
713 ((uint32_t *)location)[1] = 0x38420000 + PPC_LO(value);
714 break;
715
0906584a
RR
716 case R_PPC64_REL16_HA:
717 /* Subtract location pointer */
718 value -= (unsigned long)location;
719 value = ((value + 0x8000) >> 16);
720 *((uint16_t *) location)
721 = (*((uint16_t *) location) & ~0xffff)
722 | (value & 0xffff);
723 break;
724
725 case R_PPC64_REL16_LO:
726 /* Subtract location pointer */
727 value -= (unsigned long)location;
728 *((uint16_t *) location)
729 = (*((uint16_t *) location) & ~0xffff)
730 | (value & 0xffff);
731 break;
732
1da177e4 733 default:
c7d1f6af 734 pr_err("%s: Unknown ADD relocation: %lu\n",
1da177e4
LT
735 me->name,
736 (unsigned long)ELF64_R_TYPE(rela[i].r_info));
737 return -ENOEXEC;
738 }
739 }
740
136cd345
ME
741 return 0;
742}
743
f48cb8b4 744#ifdef CONFIG_DYNAMIC_FTRACE
336a7b5d 745
abba7597 746#ifdef CONFIG_MPROFILE_KERNEL
336a7b5d
ME
747
748#define PACATOC offsetof(struct paca_struct, kernel_toc)
749
750/*
751 * For mprofile-kernel we use a special stub for ftrace_caller() because we
752 * can't rely on r2 containing this module's TOC when we enter the stub.
753 *
754 * That can happen if the function calling us didn't need to use the toc. In
755 * that case it won't have setup r2, and the r2 value will be either the
756 * kernel's toc, or possibly another modules toc.
757 *
758 * To deal with that this stub uses the kernel toc, which is always accessible
759 * via the paca (in r13). The target (ftrace_caller()) is responsible for
760 * saving and restoring the toc before returning.
761 */
ae30cc05
NR
762static unsigned long create_ftrace_stub(const Elf64_Shdr *sechdrs,
763 struct module *me, unsigned long addr)
336a7b5d
ME
764{
765 struct ppc64_stub_entry *entry;
766 unsigned int i, num_stubs;
767 static u32 stub_insns[] = {
768 0xe98d0000 | PACATOC, /* ld r12,PACATOC(r13) */
769 0x3d8c0000, /* addis r12,r12,<high> */
770 0x398c0000, /* addi r12,r12,<low> */
771 0x7d8903a6, /* mtctr r12 */
772 0x4e800420, /* bctr */
773 };
774 long reladdr;
775
776 num_stubs = sechdrs[me->arch.stubs_section].sh_size / sizeof(*entry);
777
778 /* Find the next available stub entry */
779 entry = (void *)sechdrs[me->arch.stubs_section].sh_addr;
780 for (i = 0; i < num_stubs && stub_func_addr(entry->funcdata); i++, entry++);
781
782 if (i >= num_stubs) {
783 pr_err("%s: Unable to find a free slot for ftrace stub.\n", me->name);
784 return 0;
785 }
786
787 memcpy(entry->jump, stub_insns, sizeof(stub_insns));
788
789 /* Stub uses address relative to kernel toc (from the paca) */
ae30cc05 790 reladdr = addr - kernel_toc_addr();
336a7b5d 791 if (reladdr > 0x7FFFFFFF || reladdr < -(0x80000000L)) {
ae30cc05
NR
792 pr_err("%s: Address of %ps out of range of kernel_toc.\n",
793 me->name, (void *)addr);
336a7b5d
ME
794 return 0;
795 }
796
797 entry->jump[1] |= PPC_HA(reladdr);
798 entry->jump[2] |= PPC_LO(reladdr);
799
800 /* Eventhough we don't use funcdata in the stub, it's needed elsewhere. */
ae30cc05 801 entry->funcdata = func_desc(addr);
336a7b5d
ME
802 entry->magic = STUB_MAGIC;
803
804 return (unsigned long)entry;
805}
806#else
ae30cc05
NR
807static unsigned long create_ftrace_stub(const Elf64_Shdr *sechdrs,
808 struct module *me, unsigned long addr)
336a7b5d 809{
ae30cc05 810 return stub_for_addr(sechdrs, addr, me);
336a7b5d 811}
f48cb8b4
SR
812#endif
813
136cd345
ME
814int module_finalize_ftrace(struct module *mod, const Elf_Shdr *sechdrs)
815{
ae30cc05
NR
816 mod->arch.tramp = create_ftrace_stub(sechdrs, mod,
817 (unsigned long)ftrace_caller);
818#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
819 mod->arch.tramp_regs = create_ftrace_stub(sechdrs, mod,
820 (unsigned long)ftrace_regs_caller);
821 if (!mod->arch.tramp_regs)
822 return -ENOENT;
823#endif
136cd345
ME
824
825 if (!mod->arch.tramp)
826 return -ENOENT;
f48cb8b4 827
1da177e4
LT
828 return 0;
829}
136cd345 830#endif