diff options
author | Gwenolé Beauchesne <gbeauchesne@mandriva.org> | 2004-12-15 13:41:23 +0000 |
---|---|---|
committer | Gwenolé Beauchesne <gbeauchesne@mandriva.org> | 2004-12-15 13:41:23 +0000 |
commit | bcb7ba5cde2935fe8e98c73dd8de57db22e6d57e (patch) | |
tree | 3e3d70c27b40edb2b4482e20655a657403fc0e69 /mdk-stage1 | |
parent | f58c97af044549cf9df69fd5e165727e3d90f9d9 (diff) | |
download | drakx-bcb7ba5cde2935fe8e98c73dd8de57db22e6d57e.tar drakx-bcb7ba5cde2935fe8e98c73dd8de57db22e6d57e.tar.gz drakx-bcb7ba5cde2935fe8e98c73dd8de57db22e6d57e.tar.bz2 drakx-bcb7ba5cde2935fe8e98c73dd8de57db22e6d57e.tar.xz drakx-bcb7ba5cde2935fe8e98c73dd8de57db22e6d57e.zip |
add support for R_IA64_PCREL60B reloc
Diffstat (limited to 'mdk-stage1')
-rw-r--r-- | mdk-stage1/insmod-modutils/obj/obj_ia64.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/mdk-stage1/insmod-modutils/obj/obj_ia64.c b/mdk-stage1/insmod-modutils/obj/obj_ia64.c index 3b6156abf..a270e4a9c 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_ia64.c +++ b/mdk-stage1/insmod-modutils/obj/obj_ia64.c @@ -266,6 +266,24 @@ obj_ia64_ins_imm64(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) } /* + * add a immediate 60 value to the instruction at slot in bundle + */ +enum obj_reloc +obj_ia64_ins_pcrel60b(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) +{ + Elf64_Xword ins; + + assert(slot == 2); + + ins = obj_ia64_ins_extract_from_bundle(bundle, slot); + ins &= 0xffffffee00001fff; + ins |= ((v & 0x8000000000000000) >> 27) | ((v & 0x0000000000fffff0) << 9); + obj_ia64_ins_insert_in_bundle(bundle, slot, ins); + obj_ia64_ins_insert_in_bundle(bundle, --slot, ((v & 0x7fffffffff000000) >> 22)); + return obj_reloc_ok; +} + +/* * create a plt entry */ enum obj_reloc @@ -852,6 +870,10 @@ arch_apply_relocation(struct obj_file *f, } break; + case R_IA64_PCREL60B : /* @pcrel(sym + add), brl */ + ret = obj_ia64_ins_pcrel60b(v - dot, bundle, slot); + break; + case R_IA64_PCREL32LSB : /* @pcrel(sym + add), data4 LSB */ COPY_32LSB(loc, v-dot); break; |