Linux Audio

Check our new training course

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