Merge branch 'parisc-5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc updates from Helge Deller: "Dynamic ftrace support by Sven Schnelle and a header guard fix by Denis Efremov" * 'parisc-5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: asm: psw.h: missing header guard parisc: add dynamic ftrace compiler.h: add CC_USING_PATCHABLE_FUNCTION_ENTRY parisc: use pr_debug() in kernel/module.c parisc: add WARN_ON() to clear_fixmap parisc: add spinlock to patch function parisc: add support for patching multiple words
This commit is contained in:
@@ -33,9 +33,9 @@
|
||||
* However, SEGREL32 is used only for PARISC unwind entries, and we want
|
||||
* those entries to have an absolute address, and not just an offset.
|
||||
*
|
||||
* The unwind table mechanism has the ability to specify an offset for
|
||||
* The unwind table mechanism has the ability to specify an offset for
|
||||
* the unwind table; however, because we split off the init functions into
|
||||
* a different piece of memory, it is not possible to do this using a
|
||||
* a different piece of memory, it is not possible to do this using a
|
||||
* single offset. Instead, we use the above hack for now.
|
||||
*/
|
||||
|
||||
@@ -53,12 +53,6 @@
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
#if 0
|
||||
#define DEBUGP printk
|
||||
#else
|
||||
#define DEBUGP(fmt...)
|
||||
#endif
|
||||
|
||||
#define RELOC_REACHABLE(val, bits) \
|
||||
(( ( !((val) & (1<<((bits)-1))) && ((val)>>(bits)) != 0 ) || \
|
||||
( ((val) & (1<<((bits)-1))) && ((val)>>(bits)) != (((__typeof__(val))(~0))>>((bits)+2)))) ? \
|
||||
@@ -300,7 +294,7 @@ unsigned int arch_mod_section_prepend(struct module *mod,
|
||||
* sizeof(struct stub_entry);
|
||||
}
|
||||
|
||||
#define CONST
|
||||
#define CONST
|
||||
int module_frob_arch_sections(CONST Elf_Ehdr *hdr,
|
||||
CONST Elf_Shdr *sechdrs,
|
||||
CONST char *secstrings,
|
||||
@@ -386,7 +380,7 @@ static Elf64_Word get_got(struct module *me, unsigned long value, long addend)
|
||||
|
||||
got[i].addr = value;
|
||||
out:
|
||||
DEBUGP("GOT ENTRY %d[%x] val %lx\n", i, i*sizeof(struct got_entry),
|
||||
pr_debug("GOT ENTRY %d[%lx] val %lx\n", i, i*sizeof(struct got_entry),
|
||||
value);
|
||||
return i * sizeof(struct got_entry);
|
||||
}
|
||||
@@ -539,7 +533,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
//unsigned long dp = (unsigned long)$global$;
|
||||
register unsigned long dp asm ("r27");
|
||||
|
||||
DEBUGP("Applying relocate section %u to %u\n", relsec,
|
||||
pr_debug("Applying relocate section %u to %u\n", relsec,
|
||||
targetsec);
|
||||
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
||||
/* This is where to make the change */
|
||||
@@ -563,7 +557,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
|
||||
#if 0
|
||||
#define r(t) ELF32_R_TYPE(rel[i].r_info)==t ? #t :
|
||||
DEBUGP("Symbol %s loc 0x%x val 0x%x addend 0x%x: %s\n",
|
||||
pr_debug("Symbol %s loc 0x%x val 0x%x addend 0x%x: %s\n",
|
||||
strtab + sym->st_name,
|
||||
(uint32_t)loc, val, addend,
|
||||
r(R_PARISC_PLABEL32)
|
||||
@@ -604,7 +598,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
/* See note about special handling of SEGREL32 at
|
||||
* the beginning of this file.
|
||||
*/
|
||||
*loc = fsel(val, addend);
|
||||
*loc = fsel(val, addend);
|
||||
break;
|
||||
case R_PARISC_SECREL32:
|
||||
/* 32-bit section relative address. */
|
||||
@@ -683,7 +677,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
Elf_Addr loc0;
|
||||
unsigned int targetsec = sechdrs[relsec].sh_info;
|
||||
|
||||
DEBUGP("Applying relocate section %u to %u\n", relsec,
|
||||
pr_debug("Applying relocate section %u to %u\n", relsec,
|
||||
targetsec);
|
||||
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
||||
/* This is where to make the change */
|
||||
@@ -725,7 +719,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
case R_PARISC_LTOFF21L:
|
||||
/* LT-relative; left 21 bits */
|
||||
val = get_got(me, val, addend);
|
||||
DEBUGP("LTOFF21L Symbol %s loc %p val %lx\n",
|
||||
pr_debug("LTOFF21L Symbol %s loc %p val %llx\n",
|
||||
strtab + sym->st_name,
|
||||
loc, val);
|
||||
val = lrsel(val, 0);
|
||||
@@ -736,14 +730,14 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
/* LT-relative; right 14 bits */
|
||||
val = get_got(me, val, addend);
|
||||
val = rrsel(val, 0);
|
||||
DEBUGP("LTOFF14R Symbol %s loc %p val %lx\n",
|
||||
pr_debug("LTOFF14R Symbol %s loc %p val %llx\n",
|
||||
strtab + sym->st_name,
|
||||
loc, val);
|
||||
*loc = mask(*loc, 14) | reassemble_14(val);
|
||||
break;
|
||||
case R_PARISC_PCREL22F:
|
||||
/* PC-relative; 22 bits */
|
||||
DEBUGP("PCREL22F Symbol %s loc %p val %lx\n",
|
||||
pr_debug("PCREL22F Symbol %s loc %p val %llx\n",
|
||||
strtab + sym->st_name,
|
||||
loc, val);
|
||||
val += addend;
|
||||
@@ -775,7 +769,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
val = get_stub(me, val, addend, ELF_STUB_GOT,
|
||||
loc0, targetsec);
|
||||
}
|
||||
DEBUGP("STUB FOR %s loc %lx, val %lx+%lx at %lx\n",
|
||||
pr_debug("STUB FOR %s loc %px, val %llx+%llx at %llx\n",
|
||||
strtab + sym->st_name, loc, sym->st_value,
|
||||
addend, val);
|
||||
val = (val - dot - 8)/4;
|
||||
@@ -799,7 +793,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
/* See note about special handling of SEGREL32 at
|
||||
* the beginning of this file.
|
||||
*/
|
||||
*loc = fsel(val, addend);
|
||||
*loc = fsel(val, addend);
|
||||
break;
|
||||
case R_PARISC_SECREL32:
|
||||
/* 32-bit section relative address. */
|
||||
@@ -809,14 +803,14 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
/* 64-bit function address */
|
||||
if(in_local(me, (void *)(val + addend))) {
|
||||
*loc64 = get_fdesc(me, val+addend);
|
||||
DEBUGP("FDESC for %s at %p points to %lx\n",
|
||||
pr_debug("FDESC for %s at %llx points to %llx\n",
|
||||
strtab + sym->st_name, *loc64,
|
||||
((Elf_Fdesc *)*loc64)->addr);
|
||||
} else {
|
||||
/* if the symbol is not local to this
|
||||
* module then val+addend is a pointer
|
||||
* to the function descriptor */
|
||||
DEBUGP("Non local FPTR64 Symbol %s loc %p val %lx\n",
|
||||
pr_debug("Non local FPTR64 Symbol %s loc %p val %llx\n",
|
||||
strtab + sym->st_name,
|
||||
loc, val);
|
||||
*loc64 = val + addend;
|
||||
@@ -847,7 +841,7 @@ register_unwind_table(struct module *me,
|
||||
end = table + sechdrs[me->arch.unwind_section].sh_size;
|
||||
gp = (Elf_Addr)me->core_layout.base + me->arch.got_offset;
|
||||
|
||||
DEBUGP("register_unwind_table(), sect = %d at 0x%p - 0x%p (gp=0x%lx)\n",
|
||||
pr_debug("register_unwind_table(), sect = %d at 0x%p - 0x%p (gp=0x%lx)\n",
|
||||
me->arch.unwind_section, table, end, gp);
|
||||
me->arch.unwind = unwind_table_add(me->name, 0, gp, table, end);
|
||||
}
|
||||
@@ -868,6 +862,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
const char *strtab = NULL;
|
||||
const Elf_Shdr *s;
|
||||
char *secstrings;
|
||||
int err, symindex = -1;
|
||||
Elf_Sym *newptr, *oldptr;
|
||||
Elf_Shdr *symhdr = NULL;
|
||||
#ifdef DEBUG
|
||||
@@ -894,6 +889,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
if(sechdrs[i].sh_type == SHT_SYMTAB
|
||||
&& (sechdrs[i].sh_flags & SHF_ALLOC)) {
|
||||
int strindex = sechdrs[i].sh_link;
|
||||
symindex = i;
|
||||
/* FIXME: AWFUL HACK
|
||||
* The cast is to drop the const from
|
||||
* the sechdrs pointer */
|
||||
@@ -903,7 +899,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
}
|
||||
}
|
||||
|
||||
DEBUGP("module %s: strtab %p, symhdr %p\n",
|
||||
pr_debug("module %s: strtab %p, symhdr %p\n",
|
||||
me->name, strtab, symhdr);
|
||||
|
||||
if(me->arch.got_count > MAX_GOTS) {
|
||||
@@ -922,7 +918,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
oldptr = (void *)symhdr->sh_addr;
|
||||
newptr = oldptr + 1; /* we start counting at 1 */
|
||||
nsyms = symhdr->sh_size / sizeof(Elf_Sym);
|
||||
DEBUGP("OLD num_symtab %lu\n", nsyms);
|
||||
pr_debug("OLD num_symtab %lu\n", nsyms);
|
||||
|
||||
for (i = 1; i < nsyms; i++) {
|
||||
oldptr++; /* note, count starts at 1 so preincrement */
|
||||
@@ -937,7 +933,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
|
||||
}
|
||||
nsyms = newptr - (Elf_Sym *)symhdr->sh_addr;
|
||||
DEBUGP("NEW num_symtab %lu\n", nsyms);
|
||||
pr_debug("NEW num_symtab %lu\n", nsyms);
|
||||
symhdr->sh_size = nsyms * sizeof(Elf_Sym);
|
||||
|
||||
/* find .altinstructions section */
|
||||
@@ -949,8 +945,24 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
if (!strcmp(".altinstructions", secname))
|
||||
/* patch .altinstructions */
|
||||
apply_alternatives(aseg, aseg + s->sh_size, me->name);
|
||||
}
|
||||
|
||||
/* For 32 bit kernels we're compiling modules with
|
||||
* -ffunction-sections so we must relocate the addresses in the
|
||||
*__mcount_loc section.
|
||||
*/
|
||||
if (symindex != -1 && !strcmp(secname, "__mcount_loc")) {
|
||||
if (s->sh_type == SHT_REL)
|
||||
err = apply_relocate((Elf_Shdr *)sechdrs,
|
||||
strtab, symindex,
|
||||
s - sechdrs, me);
|
||||
else if (s->sh_type == SHT_RELA)
|
||||
err = apply_relocate_add((Elf_Shdr *)sechdrs,
|
||||
strtab, symindex,
|
||||
s - sechdrs, me);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user