diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 78dcf6500c..b90604b447 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -682,6 +682,39 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i regs->regs[15] = infop->start_stack; } +/* See linux kernel: arch/sh/include/asm/elf.h. */ +#define ELF_NREG 23 +typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; + +/* See linux kernel: arch/sh/include/asm/ptrace.h. */ +enum { + TARGET_REG_PC = 16, + TARGET_REG_PR = 17, + TARGET_REG_SR = 18, + TARGET_REG_GBR = 19, + TARGET_REG_MACH = 20, + TARGET_REG_MACL = 21, + TARGET_REG_SYSCALL = 22 +}; + +static inline void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env) +{ + int i; + + for (i = 0; i < 16; i++) { + (*regs[i]) = tswapl(env->gregs[i]); + } + + (*regs)[TARGET_REG_PC] = tswapl(env->pc); + (*regs)[TARGET_REG_PR] = tswapl(env->pr); + (*regs)[TARGET_REG_SR] = tswapl(env->sr); + (*regs)[TARGET_REG_GBR] = tswapl(env->gbr); + (*regs)[TARGET_REG_MACH] = tswapl(env->mach); + (*regs)[TARGET_REG_MACL] = tswapl(env->macl); + (*regs)[TARGET_REG_SYSCALL] = 0; /* FIXME */ +} + +#define USE_ELF_CORE_DUMP #define ELF_EXEC_PAGESIZE 4096 #endif