Marc Jones (marc.jones@se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/7204
-gerrit
commit e2f21af5446571fd73ea12b7ac8e6e39fdac8e5c Author: Aaron Durbin adurbin@chromium.org Date: Thu Mar 20 11:08:02 2014 -0500
rmodtool: add support for ARM
Add support for creating ARM rmodules. There are 3 expected relocations for an ARM rmodule: - R_ARM_ABS32 - R_ARM_THM_PC22 - R_ARM_THM_JUMP24
R_ARM_ABS32 is the only type that needs to emitted for relocation as the other 2 are relative relocations.
BUG=chrome-os-partner:27094 BRANCH=None TEST=Built vbootstub for ARM device.
Original-Change-Id: I0c22d4abca970e82ccd60b33fed700b96e3e52fb Original-Signed-off-by: Aaron Durbin adurbin@chromuim.org Original-Reviewed-on: https://chromium-review.googlesource.com/190922 Original-Reviewed-by: Gabe Black gabeblack@chromium.org (cherry picked from commit a642102ba7ace5c1829abe7732199eda6646950a) Signed-off-by: Marc Jones marc.jones@se-eng.com
Change-Id: Ib3b3c90ebb672d8d6a537df896b97dc82c6186cc --- util/cbfstool/elf.h | 1 + util/cbfstool/rmodule.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+)
diff --git a/util/cbfstool/elf.h b/util/cbfstool/elf.h index d07bb53..8b56a71 100644 --- a/util/cbfstool/elf.h +++ b/util/cbfstool/elf.h @@ -2222,6 +2222,7 @@ typedef Elf32_Addr Elf32_Conflict; #define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */ #define R_ARM_GOT32 26 /* 32 bit GOT entry */ #define R_ARM_PLT32 27 /* 32 bit PLT address */ +#define R_ARM_THM_JUMP24 30 #define R_ARM_ALU_PCREL_7_0 32 #define R_ARM_ALU_PCREL_15_8 33 #define R_ARM_ALU_PCREL_23_15 34 diff --git a/util/cbfstool/rmodule.c b/util/cbfstool/rmodule.c index 168d71a..966c364 100644 --- a/util/cbfstool/rmodule.c +++ b/util/cbfstool/rmodule.c @@ -82,12 +82,38 @@ static int should_emit_386(struct rmod_context *ctx, Elf64_Rela *rel) return (type == R_386_32); }
+static int valid_reloc_arm(struct rmod_context *ctx, Elf64_Rela *rel) +{ + int type; + + type = ELF64_R_TYPE(rel->r_info); + + /* Only these 3 relocations are expected to be found. */ + return (type == R_ARM_ABS32 || type == R_ARM_THM_PC22 || + type == R_ARM_THM_JUMP24); +} + +static int should_emit_arm(struct rmod_context *ctx, Elf64_Rela *rel) +{ + int type; + + type = ELF64_R_TYPE(rel->r_info); + + /* R_ARM_ABS32 relocations are absolute. Must emit these. */ + return (type == R_ARM_ABS32); +} + static struct arch_ops reloc_ops[] = { { .arch = EM_386, .valid_type = valid_reloc_386, .should_emit = should_emit_386, }, + { + .arch = EM_ARM, + .valid_type = valid_reloc_arm, + .should_emit = should_emit_arm, + }, };
/*