Commit c1979c37 authored by Andy Lutomirski's avatar Andy Lutomirski Committed by H. Peter Anvin

x86/vdso2c: Use better macros for ELF bitness

Rather than using a separate macro for each replacement, use generic
macros.
Signed-off-by: default avatarAndy Lutomirski <luto@amacapital.net>
Link: http://lkml.kernel.org/r/d953cd2e70ceee1400985d091188cdd65fba2f05.1403129369.git.luto@amacapital.netSigned-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
parent 5f56e716
...@@ -83,37 +83,21 @@ extern void bad_put_le(void); ...@@ -83,37 +83,21 @@ extern void bad_put_le(void);
#define NSYMS (sizeof(required_syms) / sizeof(required_syms[0])) #define NSYMS (sizeof(required_syms) / sizeof(required_syms[0]))
#define BITS 64 #define BITSFUNC3(name, bits) name##bits
#define GOFUNC go64 #define BITSFUNC2(name, bits) BITSFUNC3(name, bits)
#define Elf_Ehdr Elf64_Ehdr #define BITSFUNC(name) BITSFUNC2(name, ELF_BITS)
#define Elf_Shdr Elf64_Shdr
#define Elf_Phdr Elf64_Phdr #define ELF_BITS_XFORM2(bits, x) Elf##bits##_##x
#define Elf_Sym Elf64_Sym #define ELF_BITS_XFORM(bits, x) ELF_BITS_XFORM2(bits, x)
#define Elf_Dyn Elf64_Dyn #define ELF(x) ELF_BITS_XFORM(ELF_BITS, x)
#define ELF_BITS 64
#include "vdso2c.h" #include "vdso2c.h"
#undef BITS #undef ELF_BITS
#undef GOFUNC
#undef Elf_Ehdr #define ELF_BITS 32
#undef Elf_Shdr
#undef Elf_Phdr
#undef Elf_Sym
#undef Elf_Dyn
#define BITS 32
#define GOFUNC go32
#define Elf_Ehdr Elf32_Ehdr
#define Elf_Shdr Elf32_Shdr
#define Elf_Phdr Elf32_Phdr
#define Elf_Sym Elf32_Sym
#define Elf_Dyn Elf32_Dyn
#include "vdso2c.h" #include "vdso2c.h"
#undef BITS #undef ELF_BITS
#undef GOFUNC
#undef Elf_Ehdr
#undef Elf_Shdr
#undef Elf_Phdr
#undef Elf_Sym
#undef Elf_Dyn
static void go(void *addr, size_t len, FILE *outfile, const char *name) static void go(void *addr, size_t len, FILE *outfile, const char *name)
{ {
......
...@@ -4,23 +4,24 @@ ...@@ -4,23 +4,24 @@
* are built for 32-bit userspace. * are built for 32-bit userspace.
*/ */
static void GOFUNC(void *addr, size_t len, FILE *outfile, const char *name) static void BITSFUNC(go)(void *addr, size_t len,
FILE *outfile, const char *name)
{ {
int found_load = 0; int found_load = 0;
unsigned long load_size = -1; /* Work around bogus warning */ unsigned long load_size = -1; /* Work around bogus warning */
unsigned long data_size; unsigned long data_size;
Elf_Ehdr *hdr = (Elf_Ehdr *)addr; ELF(Ehdr) *hdr = (ELF(Ehdr) *)addr;
int i; int i;
unsigned long j; unsigned long j;
Elf_Shdr *symtab_hdr = NULL, *strtab_hdr, *secstrings_hdr, ELF(Shdr) *symtab_hdr = NULL, *strtab_hdr, *secstrings_hdr,
*alt_sec = NULL; *alt_sec = NULL;
Elf_Dyn *dyn = 0, *dyn_end = 0; ELF(Dyn) *dyn = 0, *dyn_end = 0;
const char *secstrings; const char *secstrings;
uint64_t syms[NSYMS] = {}; uint64_t syms[NSYMS] = {};
uint64_t fake_sections_value = 0, fake_sections_size = 0; uint64_t fake_sections_value = 0, fake_sections_size = 0;
Elf_Phdr *pt = (Elf_Phdr *)(addr + GET_LE(&hdr->e_phoff)); ELF(Phdr) *pt = (ELF(Phdr) *)(addr + GET_LE(&hdr->e_phoff));
/* Walk the segment table. */ /* Walk the segment table. */
for (i = 0; i < GET_LE(&hdr->e_phnum); i++) { for (i = 0; i < GET_LE(&hdr->e_phnum); i++) {
...@@ -61,7 +62,7 @@ static void GOFUNC(void *addr, size_t len, FILE *outfile, const char *name) ...@@ -61,7 +62,7 @@ static void GOFUNC(void *addr, size_t len, FILE *outfile, const char *name)
GET_LE(&hdr->e_shentsize)*GET_LE(&hdr->e_shstrndx); GET_LE(&hdr->e_shentsize)*GET_LE(&hdr->e_shstrndx);
secstrings = addr + GET_LE(&secstrings_hdr->sh_offset); secstrings = addr + GET_LE(&secstrings_hdr->sh_offset);
for (i = 0; i < GET_LE(&hdr->e_shnum); i++) { for (i = 0; i < GET_LE(&hdr->e_shnum); i++) {
Elf_Shdr *sh = addr + GET_LE(&hdr->e_shoff) + ELF(Shdr) *sh = addr + GET_LE(&hdr->e_shoff) +
GET_LE(&hdr->e_shentsize) * i; GET_LE(&hdr->e_shentsize) * i;
if (GET_LE(&sh->sh_type) == SHT_SYMTAB) if (GET_LE(&sh->sh_type) == SHT_SYMTAB)
symtab_hdr = sh; symtab_hdr = sh;
...@@ -82,7 +83,7 @@ static void GOFUNC(void *addr, size_t len, FILE *outfile, const char *name) ...@@ -82,7 +83,7 @@ static void GOFUNC(void *addr, size_t len, FILE *outfile, const char *name)
i < GET_LE(&symtab_hdr->sh_size) / GET_LE(&symtab_hdr->sh_entsize); i < GET_LE(&symtab_hdr->sh_size) / GET_LE(&symtab_hdr->sh_entsize);
i++) { i++) {
int k; int k;
Elf_Sym *sym = addr + GET_LE(&symtab_hdr->sh_offset) + ELF(Sym) *sym = addr + GET_LE(&symtab_hdr->sh_offset) +
GET_LE(&symtab_hdr->sh_entsize) * i; GET_LE(&symtab_hdr->sh_entsize) * i;
const char *name = addr + GET_LE(&strtab_hdr->sh_offset) + const char *name = addr + GET_LE(&strtab_hdr->sh_offset) +
GET_LE(&sym->st_name); GET_LE(&sym->st_name);
...@@ -123,12 +124,12 @@ static void GOFUNC(void *addr, size_t len, FILE *outfile, const char *name) ...@@ -123,12 +124,12 @@ static void GOFUNC(void *addr, size_t len, FILE *outfile, const char *name)
fail("end_mapping must be a multiple of 4096\n"); fail("end_mapping must be a multiple of 4096\n");
/* Remove sections or use fakes */ /* Remove sections or use fakes */
if (fake_sections_size % sizeof(Elf_Shdr)) if (fake_sections_size % sizeof(ELF(Shdr)))
fail("vdso_fake_sections size is not a multiple of %ld\n", fail("vdso_fake_sections size is not a multiple of %ld\n",
(long)sizeof(Elf_Shdr)); (long)sizeof(ELF(Shdr)));
PUT_LE(&hdr->e_shoff, fake_sections_value); PUT_LE(&hdr->e_shoff, fake_sections_value);
PUT_LE(&hdr->e_shentsize, fake_sections_value ? sizeof(Elf_Shdr) : 0); PUT_LE(&hdr->e_shentsize, fake_sections_value ? sizeof(ELF(Shdr)) : 0);
PUT_LE(&hdr->e_shnum, fake_sections_size / sizeof(Elf_Shdr)); PUT_LE(&hdr->e_shnum, fake_sections_size / sizeof(ELF(Shdr)));
PUT_LE(&hdr->e_shstrndx, SHN_UNDEF); PUT_LE(&hdr->e_shstrndx, SHN_UNDEF);
if (!name) { if (!name) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment