diff options
Diffstat (limited to 'arch/ia64/kernel/module.c')
-rw-r--r-- | arch/ia64/kernel/module.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index aaa7d901521f..34fe4259a144 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
@@ -446,6 +446,14 @@ module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings, | |||
446 | mod->arch.opd = s; | 446 | mod->arch.opd = s; |
447 | else if (strcmp(".IA_64.unwind", secstrings + s->sh_name) == 0) | 447 | else if (strcmp(".IA_64.unwind", secstrings + s->sh_name) == 0) |
448 | mod->arch.unwind = s; | 448 | mod->arch.unwind = s; |
449 | #ifdef CONFIG_PARAVIRT | ||
450 | else if (strcmp(".paravirt_bundles", | ||
451 | secstrings + s->sh_name) == 0) | ||
452 | mod->arch.paravirt_bundles = s; | ||
453 | else if (strcmp(".paravirt_insts", | ||
454 | secstrings + s->sh_name) == 0) | ||
455 | mod->arch.paravirt_insts = s; | ||
456 | #endif | ||
449 | 457 | ||
450 | if (!mod->arch.core_plt || !mod->arch.init_plt || !mod->arch.got || !mod->arch.opd) { | 458 | if (!mod->arch.core_plt || !mod->arch.init_plt || !mod->arch.got || !mod->arch.opd) { |
451 | printk(KERN_ERR "%s: sections missing\n", mod->name); | 459 | printk(KERN_ERR "%s: sections missing\n", mod->name); |
@@ -921,6 +929,30 @@ module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mo | |||
921 | DEBUGP("%s: init: entry=%p\n", __func__, mod->init); | 929 | DEBUGP("%s: init: entry=%p\n", __func__, mod->init); |
922 | if (mod->arch.unwind) | 930 | if (mod->arch.unwind) |
923 | register_unwind_table(mod); | 931 | register_unwind_table(mod); |
932 | #ifdef CONFIG_PARAVIRT | ||
933 | if (mod->arch.paravirt_bundles) { | ||
934 | struct paravirt_patch_site_bundle *start = | ||
935 | (struct paravirt_patch_site_bundle *) | ||
936 | mod->arch.paravirt_bundles->sh_addr; | ||
937 | struct paravirt_patch_site_bundle *end = | ||
938 | (struct paravirt_patch_site_bundle *) | ||
939 | (mod->arch.paravirt_bundles->sh_addr + | ||
940 | mod->arch.paravirt_bundles->sh_size); | ||
941 | |||
942 | paravirt_patch_apply_bundle(start, end); | ||
943 | } | ||
944 | if (mod->arch.paravirt_insts) { | ||
945 | struct paravirt_patch_site_inst *start = | ||
946 | (struct paravirt_patch_site_inst *) | ||
947 | mod->arch.paravirt_insts->sh_addr; | ||
948 | struct paravirt_patch_site_inst *end = | ||
949 | (struct paravirt_patch_site_inst *) | ||
950 | (mod->arch.paravirt_insts->sh_addr + | ||
951 | mod->arch.paravirt_insts->sh_size); | ||
952 | |||
953 | paravirt_patch_apply_inst(start, end); | ||
954 | } | ||
955 | #endif | ||
924 | return 0; | 956 | return 0; |
925 | } | 957 | } |
926 | 958 | ||