Move elf_core_copy_regs to elfload.c. Move ELF_NREG to target_elf.h. Signed-off-by: Richard Henderson <richard.hender...@linaro.org> --- linux-user/i386/target_elf.h | 8 ++++ linux-user/x86_64/target_elf.h | 8 ++++ linux-user/elfload.c | 70 ---------------------------------- linux-user/i386/elfload.c | 21 ++++++++++ linux-user/x86_64/elfload.c | 31 +++++++++++++++ 5 files changed, 68 insertions(+), 70 deletions(-)
diff --git a/linux-user/i386/target_elf.h b/linux-user/i386/target_elf.h index 44dde1ac4a..aaf7b229c0 100644 --- a/linux-user/i386/target_elf.h +++ b/linux-user/i386/target_elf.h @@ -11,4 +11,12 @@ #define HAVE_ELF_HWCAP 1 #define HAVE_ELF_PLATFORM 1 +/* + * Note that ELF_NREG should be 19 as there should be place for + * TRAPNO and ERR "registers" as well but linux doesn't dump those. + * + * See linux kernel: arch/x86/include/asm/elf.h + */ +#define ELF_NREG 17 + #endif diff --git a/linux-user/x86_64/target_elf.h b/linux-user/x86_64/target_elf.h index 498c3f7e4e..3ab10a6328 100644 --- a/linux-user/x86_64/target_elf.h +++ b/linux-user/x86_64/target_elf.h @@ -11,4 +11,12 @@ #define HAVE_ELF_HWCAP 1 #define HAVE_ELF_PLATFORM 1 +/* + * Note that ELF_NREG should be 29 as there should be place for + * TRAPNO and ERR "registers" as well but linux doesn't dump those. + * + * See linux kernel: arch/x86/include/asm/elf.h + */ +#define ELF_NREG 27 + #endif diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 4e0d52f1f6..177741522c 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -145,46 +145,6 @@ typedef abi_int target_pid_t; #define ELF_CLASS ELFCLASS64 #define ELF_ARCH EM_X86_64 -#define ELF_NREG 27 - -/* - * Note that ELF_NREG should be 29 as there should be place for - * TRAPNO and ERR "registers" as well but linux doesn't dump - * those. - * - * See linux kernel: arch/x86/include/asm/elf.h - */ -void elf_core_copy_regs(target_ulong *regs, const CPUX86State *env) -{ - regs[0] = tswapl(env->regs[15]); - regs[1] = tswapl(env->regs[14]); - regs[2] = tswapl(env->regs[13]); - regs[3] = tswapl(env->regs[12]); - regs[4] = tswapl(env->regs[R_EBP]); - regs[5] = tswapl(env->regs[R_EBX]); - regs[6] = tswapl(env->regs[11]); - regs[7] = tswapl(env->regs[10]); - regs[8] = tswapl(env->regs[9]); - regs[9] = tswapl(env->regs[8]); - regs[10] = tswapl(env->regs[R_EAX]); - regs[11] = tswapl(env->regs[R_ECX]); - regs[12] = tswapl(env->regs[R_EDX]); - regs[13] = tswapl(env->regs[R_ESI]); - regs[14] = tswapl(env->regs[R_EDI]); - regs[15] = tswapl(get_task_state(env_cpu_const(env))->orig_ax); - regs[16] = tswapl(env->eip); - regs[17] = tswapl(env->segs[R_CS].selector & 0xffff); - regs[18] = tswapl(env->eflags); - regs[19] = tswapl(env->regs[R_ESP]); - regs[20] = tswapl(env->segs[R_SS].selector & 0xffff); - regs[21] = tswapl(env->segs[R_FS].selector & 0xffff); - regs[22] = tswapl(env->segs[R_GS].selector & 0xffff); - regs[23] = tswapl(env->segs[R_DS].selector & 0xffff); - regs[24] = tswapl(env->segs[R_ES].selector & 0xffff); - regs[25] = tswapl(env->segs[R_FS].selector & 0xffff); - regs[26] = tswapl(env->segs[R_GS].selector & 0xffff); -} - #if ULONG_MAX > UINT32_MAX #define INIT_GUEST_COMMPAGE static bool init_guest_commpage(void) @@ -221,36 +181,6 @@ static bool init_guest_commpage(void) #define EXSTACK_DEFAULT true -#define ELF_NREG 17 - -/* - * Note that ELF_NREG should be 19 as there should be place for - * TRAPNO and ERR "registers" as well but linux doesn't dump - * those. - * - * See linux kernel: arch/x86/include/asm/elf.h - */ -void elf_core_copy_regs(target_ulong *regs, const CPUX86State *env) -{ - regs[0] = tswapl(env->regs[R_EBX]); - regs[1] = tswapl(env->regs[R_ECX]); - regs[2] = tswapl(env->regs[R_EDX]); - regs[3] = tswapl(env->regs[R_ESI]); - regs[4] = tswapl(env->regs[R_EDI]); - regs[5] = tswapl(env->regs[R_EBP]); - regs[6] = tswapl(env->regs[R_EAX]); - regs[7] = tswapl(env->segs[R_DS].selector & 0xffff); - regs[8] = tswapl(env->segs[R_ES].selector & 0xffff); - regs[9] = tswapl(env->segs[R_FS].selector & 0xffff); - regs[10] = tswapl(env->segs[R_GS].selector & 0xffff); - regs[11] = tswapl(get_task_state(env_cpu_const(env))->orig_ax); - regs[12] = tswapl(env->eip); - regs[13] = tswapl(env->segs[R_CS].selector & 0xffff); - regs[14] = tswapl(env->eflags); - regs[15] = tswapl(env->regs[R_ESP]); - regs[16] = tswapl(env->segs[R_SS].selector & 0xffff); -} - /* * i386 is the only target which supplies AT_SYSINFO for the vdso. * All others only supply AT_SYSINFO_EHDR. diff --git a/linux-user/i386/elfload.c b/linux-user/i386/elfload.c index ef3a6c35d2..909f8edcab 100644 --- a/linux-user/i386/elfload.c +++ b/linux-user/i386/elfload.c @@ -23,3 +23,24 @@ const char *get_elf_platform(CPUState *cs) family = MAX(MIN(family, 6), 3); return elf_platform[family - 3]; } + +void elf_core_copy_regs(target_ulong *regs, const CPUX86State *env) +{ + regs[0] = tswapl(env->regs[R_EBX]); + regs[1] = tswapl(env->regs[R_ECX]); + regs[2] = tswapl(env->regs[R_EDX]); + regs[3] = tswapl(env->regs[R_ESI]); + regs[4] = tswapl(env->regs[R_EDI]); + regs[5] = tswapl(env->regs[R_EBP]); + regs[6] = tswapl(env->regs[R_EAX]); + regs[7] = tswapl(env->segs[R_DS].selector & 0xffff); + regs[8] = tswapl(env->segs[R_ES].selector & 0xffff); + regs[9] = tswapl(env->segs[R_FS].selector & 0xffff); + regs[10] = tswapl(env->segs[R_GS].selector & 0xffff); + regs[11] = tswapl(get_task_state(env_cpu_const(env))->orig_ax); + regs[12] = tswapl(env->eip); + regs[13] = tswapl(env->segs[R_CS].selector & 0xffff); + regs[14] = tswapl(env->eflags); + regs[15] = tswapl(env->regs[R_ESP]); + regs[16] = tswapl(env->segs[R_SS].selector & 0xffff); +} diff --git a/linux-user/x86_64/elfload.c b/linux-user/x86_64/elfload.c index 88541ea45e..cd7aeb9743 100644 --- a/linux-user/x86_64/elfload.c +++ b/linux-user/x86_64/elfload.c @@ -19,3 +19,34 @@ const char *get_elf_platform(CPUState *cs) { return "x86_64"; } + +void elf_core_copy_regs(target_ulong *regs, const CPUX86State *env) +{ + regs[0] = tswapl(env->regs[15]); + regs[1] = tswapl(env->regs[14]); + regs[2] = tswapl(env->regs[13]); + regs[3] = tswapl(env->regs[12]); + regs[4] = tswapl(env->regs[R_EBP]); + regs[5] = tswapl(env->regs[R_EBX]); + regs[6] = tswapl(env->regs[11]); + regs[7] = tswapl(env->regs[10]); + regs[8] = tswapl(env->regs[9]); + regs[9] = tswapl(env->regs[8]); + regs[10] = tswapl(env->regs[R_EAX]); + regs[11] = tswapl(env->regs[R_ECX]); + regs[12] = tswapl(env->regs[R_EDX]); + regs[13] = tswapl(env->regs[R_ESI]); + regs[14] = tswapl(env->regs[R_EDI]); + regs[15] = tswapl(get_task_state(env_cpu_const(env))->orig_ax); + regs[16] = tswapl(env->eip); + regs[17] = tswapl(env->segs[R_CS].selector & 0xffff); + regs[18] = tswapl(env->eflags); + regs[19] = tswapl(env->regs[R_ESP]); + regs[20] = tswapl(env->segs[R_SS].selector & 0xffff); + regs[21] = tswapl(env->segs[R_FS].selector & 0xffff); + regs[22] = tswapl(env->segs[R_GS].selector & 0xffff); + regs[23] = tswapl(env->segs[R_DS].selector & 0xffff); + regs[24] = tswapl(env->segs[R_ES].selector & 0xffff); + regs[25] = tswapl(env->segs[R_FS].selector & 0xffff); + regs[26] = tswapl(env->segs[R_GS].selector & 0xffff); +} -- 2.43.0