~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/powerpc/kernel/module.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*  Kernel module help for powerpc.
  3     Copyright (C) 2001, 2003 Rusty Russell IBM Corporation.
  4     Copyright (C) 2008 Freescale Semiconductor, Inc.
  5 
  6 */
  7 #include <linux/elf.h>
  8 #include <linux/moduleloader.h>
  9 #include <linux/err.h>
 10 #include <linux/mm.h>
 11 #include <linux/bug.h>
 12 #include <asm/module.h>
 13 #include <linux/uaccess.h>
 14 #include <asm/firmware.h>
 15 #include <linux/sort.h>
 16 #include <asm/setup.h>
 17 #include <asm/sections.h>
 18 
 19 static const Elf_Shdr *find_section(const Elf_Ehdr *hdr,
 20                                     const Elf_Shdr *sechdrs,
 21                                     const char *name)
 22 {
 23         char *secstrings;
 24         unsigned int i;
 25 
 26         secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
 27         for (i = 1; i < hdr->e_shnum; i++)
 28                 if (strcmp(secstrings+sechdrs[i].sh_name, name) == 0)
 29                         return &sechdrs[i];
 30         return NULL;
 31 }
 32 
 33 int module_finalize(const Elf_Ehdr *hdr,
 34                 const Elf_Shdr *sechdrs, struct module *me)
 35 {
 36         const Elf_Shdr *sect;
 37         int rc;
 38 
 39         rc = module_finalize_ftrace(me, sechdrs);
 40         if (rc)
 41                 return rc;
 42 
 43         /* Apply feature fixups */
 44         sect = find_section(hdr, sechdrs, "__ftr_fixup");
 45         if (sect != NULL)
 46                 do_feature_fixups(cur_cpu_spec->cpu_features,
 47                                   (void *)sect->sh_addr,
 48                                   (void *)sect->sh_addr + sect->sh_size);
 49 
 50         sect = find_section(hdr, sechdrs, "__mmu_ftr_fixup");
 51         if (sect != NULL)
 52                 do_feature_fixups(cur_cpu_spec->mmu_features,
 53                                   (void *)sect->sh_addr,
 54                                   (void *)sect->sh_addr + sect->sh_size);
 55 
 56 #ifdef CONFIG_PPC64
 57         sect = find_section(hdr, sechdrs, "__fw_ftr_fixup");
 58         if (sect != NULL)
 59                 do_feature_fixups(powerpc_firmware_features,
 60                                   (void *)sect->sh_addr,
 61                                   (void *)sect->sh_addr + sect->sh_size);
 62 #endif /* CONFIG_PPC64 */
 63 
 64 #ifdef CONFIG_PPC64_ELF_ABI_V1
 65         sect = find_section(hdr, sechdrs, ".opd");
 66         if (sect != NULL) {
 67                 me->arch.start_opd = sect->sh_addr;
 68                 me->arch.end_opd = sect->sh_addr + sect->sh_size;
 69         }
 70 #endif /* CONFIG_PPC64_ELF_ABI_V1 */
 71 
 72 #ifdef CONFIG_PPC_BARRIER_NOSPEC
 73         sect = find_section(hdr, sechdrs, "__spec_barrier_fixup");
 74         if (sect != NULL)
 75                 do_barrier_nospec_fixups_range(barrier_nospec_enabled,
 76                                   (void *)sect->sh_addr,
 77                                   (void *)sect->sh_addr + sect->sh_size);
 78 #endif /* CONFIG_PPC_BARRIER_NOSPEC */
 79 
 80         sect = find_section(hdr, sechdrs, "__lwsync_fixup");
 81         if (sect != NULL)
 82                 do_lwsync_fixups(cur_cpu_spec->cpu_features,
 83                                  (void *)sect->sh_addr,
 84                                  (void *)sect->sh_addr + sect->sh_size);
 85 
 86         return 0;
 87 }
 88 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php