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