]> Git Repo - linux.git/commitdiff
Merge branch 'parisc-5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
authorLinus Torvalds <[email protected]>
Tue, 9 Jul 2019 19:08:15 +0000 (12:08 -0700)
committerLinus Torvalds <[email protected]>
Tue, 9 Jul 2019 19:08:15 +0000 (12:08 -0700)
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

1  2 
arch/parisc/kernel/module.c

index 1f0f29a289d360dd6c04d375f17ddf21387390f5,eab964a8bf4bea8c2f8f7b3b11cd9caef439661c..ac5f34993b53bb7c42341aef529ab459fb58fd6f
@@@ -33,9 -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.
   */
  
  #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 +294,7 @@@ unsigned int arch_mod_section_prepend(s
                * 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 +380,7 @@@ static Elf64_Word get_got(struct modul
  
        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 +533,7 @@@ int apply_relocate_add(Elf_Shdr *sechdr
        //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 */
  
  #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)
                        /* 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 +677,7 @@@ int apply_relocate_add(Elf_Shdr *sechdr
        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 */
                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);
                        /* 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;
                                        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;
                        /* 32-bit PC relative address */
                        *loc = val - dot - 8 + addend;
                        break;
 +              case R_PARISC_PCREL64:
 +                      /* 64-bit PC relative address */
 +                      *loc64 = val - dot - 8 + addend;
 +                      break;
                case R_PARISC_DIR64:
                        /* 64-bit effective address */
                        *loc64 = val + addend;
                        /* 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. */
                        /* 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 -837,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 -858,7 +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
                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 */
                }
        }
  
-       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) {
        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 */
  
        }
        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 */
                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;
  }
  
This page took 0.082656 seconds and 4 git commands to generate.