diff options
author | Patrick Rudolph <siro@das-labor.org> | 2018-11-26 15:54:21 +0100 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2018-12-19 06:05:52 +0000 |
commit | 565bebe0b3c506b978ad5c9a66cb67ebe0ac6329 (patch) | |
tree | f149dad8f48c43e5d4c27bbd711473df46d52f3f /util/cbfstool/rmodule.c | |
parent | f7fdc3a5ab21333aa08d58681795ddf65df170eb (diff) |
util/cbfstool: Support AMD64 rmodules
Add support for 64bit rmodule, as required for relocatable
ramstage on x86_64.
Change-Id: I7fbb3b4c0f76ce82c090b5f16f67a728b6bf94a5
Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Reviewed-on: https://review.coreboot.org/c/29874
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'util/cbfstool/rmodule.c')
-rw-r--r-- | util/cbfstool/rmodule.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/util/cbfstool/rmodule.c b/util/cbfstool/rmodule.c index ff8f1cdef2..f270e3ec8f 100644 --- a/util/cbfstool/rmodule.c +++ b/util/cbfstool/rmodule.c @@ -44,6 +44,33 @@ static int should_emit_386(Elf64_Rela *rel) return (type == R_386_32); } +static int valid_reloc_amd64(Elf64_Rela *rel) +{ + int type; + + type = ELF64_R_TYPE(rel->r_info); + + /* Only these 5 relocations are expected to be found. */ + return (type == R_AMD64_64 || + type == R_AMD64_PC64 || + type == R_AMD64_32S || + type == R_AMD64_32 || + type == R_AMD64_PC32); +} + +static int should_emit_amd64(Elf64_Rela *rel) +{ + int type; + + type = ELF64_R_TYPE(rel->r_info); + + /* Only emit absolute relocations */ + return (type == R_AMD64_64 || + type == R_AMD64_PC64 || + type == R_AMD64_32S || + type == R_AMD64_32); +} + static int valid_reloc_arm(Elf64_Rela *rel) { int type; @@ -101,6 +128,11 @@ static const struct arch_ops reloc_ops[] = { .should_emit = should_emit_386, }, { + .arch = EM_X86_64, + .valid_type = valid_reloc_amd64, + .should_emit = should_emit_amd64, + }, + { .arch = EM_ARM, .valid_type = valid_reloc_arm, .should_emit = should_emit_arm, |