diff options
Diffstat (limited to 'arch/ia64/kernel/module.c')
-rw-r--r-- | arch/ia64/kernel/module.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index aaa7d901521..da3b0cf495a 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); |
@@ -525,8 +533,7 @@ get_ltoff (struct module *mod, uint64_t value, int *okp) | |||
525 | goto found; | 533 | goto found; |
526 | 534 | ||
527 | /* Not enough GOT entries? */ | 535 | /* Not enough GOT entries? */ |
528 | if (e >= (struct got_entry *) (mod->arch.got->sh_addr + mod->arch.got->sh_size)) | 536 | BUG_ON(e >= (struct got_entry *) (mod->arch.got->sh_addr + mod->arch.got->sh_size)); |
529 | BUG(); | ||
530 | 537 | ||
531 | e->val = value; | 538 | e->val = value; |
532 | ++mod->arch.next_got_entry; | 539 | ++mod->arch.next_got_entry; |
@@ -921,6 +928,30 @@ module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mo | |||
921 | DEBUGP("%s: init: entry=%p\n", __func__, mod->init); | 928 | DEBUGP("%s: init: entry=%p\n", __func__, mod->init); |
922 | if (mod->arch.unwind) | 929 | if (mod->arch.unwind) |
923 | register_unwind_table(mod); | 930 | register_unwind_table(mod); |
931 | #ifdef CONFIG_PARAVIRT | ||
932 | if (mod->arch.paravirt_bundles) { | ||
933 | struct paravirt_patch_site_bundle *start = | ||
934 | (struct paravirt_patch_site_bundle *) | ||
935 | mod->arch.paravirt_bundles->sh_addr; | ||
936 | struct paravirt_patch_site_bundle *end = | ||
937 | (struct paravirt_patch_site_bundle *) | ||
938 | (mod->arch.paravirt_bundles->sh_addr + | ||
939 | mod->arch.paravirt_bundles->sh_size); | ||
940 | |||
941 | paravirt_patch_apply_bundle(start, end); | ||
942 | } | ||
943 | if (mod->arch.paravirt_insts) { | ||
944 | struct paravirt_patch_site_inst *start = | ||
945 | (struct paravirt_patch_site_inst *) | ||
946 | mod->arch.paravirt_insts->sh_addr; | ||
947 | struct paravirt_patch_site_inst *end = | ||
948 | (struct paravirt_patch_site_inst *) | ||
949 | (mod->arch.paravirt_insts->sh_addr + | ||
950 | mod->arch.paravirt_insts->sh_size); | ||
951 | |||
952 | paravirt_patch_apply_inst(start, end); | ||
953 | } | ||
954 | #endif | ||
924 | return 0; | 955 | return 0; |
925 | } | 956 | } |
926 | 957 | ||