Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/29874
Change subject: util/cbfstool: Support AMD64 rmodules ......................................................................
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 --- M util/cbfstool/elf.h M util/cbfstool/elfheaders.c M util/cbfstool/rmodule.c 3 files changed, 72 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/74/29874/1
diff --git a/util/cbfstool/elf.h b/util/cbfstool/elf.h index a0bb35d..43fd7f3 100644 --- a/util/cbfstool/elf.h +++ b/util/cbfstool/elf.h @@ -1148,6 +1148,43 @@ /* Keep this the last entry. */ #define R_386_NUM 38
+/* AMD64 specific definitions. */ +#define R_AMD64_NONE 0 /* relocation types */ +#define R_AMD64_64 1 +#define R_AMD64_PC32 2 +#define R_AMD64_GOT32 3 +#define R_AMD64_PLT32 4 +#define R_AMD64_COPY 5 +#define R_AMD64_GLOB_DAT 6 +#define R_AMD64_JUMP_SLOT 7 +#define R_AMD64_RELATIVE 8 +#define R_AMD64_GOTPCREL 9 +#define R_AMD64_32 10 +#define R_AMD64_32S 11 +#define R_AMD64_16 12 +#define R_AMD64_PC16 13 +#define R_AMD64_8 14 +#define R_AMD64_PC8 15 +#define R_AMD64_DTPMOD64 16 +#define R_AMD64_DTPOFF64 17 +#define R_AMD64_TPOFF64 18 +#define R_AMD64_TLSGD 19 +#define R_AMD64_TLSLD 20 +#define R_AMD64_DTPOFF32 21 +#define R_AMD64_GOTTPOFF 22 +#define R_AMD64_TPOFF32 23 +#define R_AMD64_PC64 24 +#define R_AMD64_GOTOFF64 25 +#define R_AMD64_GOTPC32 26 +#define R_AMD64_GOT64 27 /* reserved for future expansion */ +#define R_AMD64_GOTPCREL64 28 /* reserved for future expansion */ +#define R_AMD64_GOTPC64 29 /* reserved for future expansion */ +#define R_AMD64_GOTPLT64 30 /* reserved for future expansion */ +#define R_AMD64_PLTOFF64 31 /* reserved for future expansion */ +#define R_AMD64_SIZE32 32 +#define R_AMD64_SIZE64 33 +#define R_AMD64_NUM 34 + /* SUN SPARC specific definitions. */
/* Legal values for ST_TYPE subfield of st_info (symbol type). */ diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c index 9d02c30..8da54d0 100644 --- a/util/cbfstool/elfheaders.c +++ b/util/cbfstool/elfheaders.c @@ -1072,6 +1072,9 @@ case EM_386: type = R_386_32; break; + case EM_X86_64: + type = R_AMD64_64; + break; case EM_ARM: type = R_ARM_ABS32; break; diff --git a/util/cbfstool/rmodule.c b/util/cbfstool/rmodule.c index 07957cb..6808826 100644 --- a/util/cbfstool/rmodule.c +++ b/util/cbfstool/rmodule.c @@ -43,6 +43,33 @@ 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; @@ -100,6 +127,11 @@ .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,