From: Petar Jovanovic Date: Wed, 19 Oct 2016 17:49:06 +0000 (+0000) Subject: mips: fix coredump creation in Valgrind X-Git-Tag: svn/VALGRIND_3_13_0~325 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5645228957f0fef14227a8ab170bbce5dd0b58c0;p=thirdparty%2Fvalgrind.git mips: fix coredump creation in Valgrind Coredumps created for MIPS are not valid today. Update the list of registers that have to be saved, and use the structure defined in kernel. Patch by Aleksandar Rikalo. It fixes BZ#351692. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16080 --- diff --git a/coregrind/m_coredump/coredump-elf.c b/coregrind/m_coredump/coredump-elf.c index d51b8d2445..b4b429302e 100644 --- a/coregrind/m_coredump/coredump-elf.c +++ b/coregrind/m_coredump/coredump-elf.c @@ -226,7 +226,11 @@ static void fill_prstatus(const ThreadState *tst, /*OUT*/struct vki_elf_prstatus *prs, const vki_siginfo_t *si) { +#if defined(VGP_mips32_linux) || defined(VGP_mips64_linux) + vki_elf_greg_t *regs; +#else struct vki_user_regs_struct *regs; +#endif const ThreadArchState* arch = &tst->arch; VG_(memset)(prs, 0, sizeof(*prs)); @@ -245,6 +249,8 @@ static void fill_prstatus(const ThreadState *tst, #if defined(VGP_s390x_linux) /* prs->pr_reg has struct type. Need to take address. */ regs = (struct vki_user_regs_struct *)&(prs->pr_reg); +#elif defined(VGP_mips32_linux) || defined(VGP_mips64_linux) + regs = (vki_elf_greg_t *)prs->pr_reg; #else regs = (struct vki_user_regs_struct *)prs->pr_reg; vg_assert(sizeof(*regs) == sizeof(prs->pr_reg)); @@ -389,24 +395,27 @@ static void fill_prstatus(const ThreadState *tst, regs->orig_gpr2 = arch->vex.guest_r2; #elif defined(VGP_mips32_linux) -# define DO(n) regs->MIPS_r##n = arch->vex.guest_r##n - DO(0); DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7); - DO(8); DO(9); DO(10); DO(11); DO(12); DO(13); DO(14); DO(15); - DO(16); DO(17); DO(18); DO(19); DO(20); DO(21); DO(22); DO(23); - DO(24); DO(25); DO(26); DO(27); DO(28); DO(29); DO(30); DO(31); +# define DO(n) regs[VKI_MIPS32_EF_R##n] = arch->vex.guest_r##n + DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7); DO(8); + DO(9); DO(10); DO(11); DO(12); DO(13); DO(14); DO(15); DO(16); + DO(17); DO(18); DO(19); DO(20); DO(21); DO(22); DO(23); DO(24); + DO(25); DO(28); DO(29); DO(30); DO(31); # undef DO - regs->MIPS_hi = arch->vex.guest_HI; - regs->MIPS_lo = arch->vex.guest_LO; - + regs[VKI_MIPS32_EF_LO] = arch->vex.guest_LO; + regs[VKI_MIPS32_EF_HI] = arch->vex.guest_HI; + regs[VKI_MIPS32_EF_CP0_STATUS] = arch->vex.guest_CP0_status; + regs[VKI_MIPS32_EF_CP0_EPC] = arch->vex.guest_PC; #elif defined(VGP_mips64_linux) -# define DO(n) regs->MIPS_r##n = arch->vex.guest_r##n - DO(0); DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7); - DO(8); DO(9); DO(10); DO(11); DO(12); DO(13); DO(14); DO(15); - DO(16); DO(17); DO(18); DO(19); DO(20); DO(21); DO(22); DO(23); - DO(24); DO(25); DO(26); DO(27); DO(28); DO(29); DO(30); DO(31); +# define DO(n) regs[VKI_MIPS64_EF_R##n] = arch->vex.guest_r##n + DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7); DO(8); + DO(9); DO(10); DO(11); DO(12); DO(13); DO(14); DO(15); DO(16); + DO(17); DO(18); DO(19); DO(20); DO(21); DO(22); DO(23); DO(24); + DO(25); DO(28); DO(29); DO(30); DO(31); # undef DO - regs->MIPS_hi = arch->vex.guest_HI; - regs->MIPS_lo = arch->vex.guest_LO; + regs[VKI_MIPS64_EF_LO] = arch->vex.guest_LO; + regs[VKI_MIPS64_EF_HI] = arch->vex.guest_HI; + regs[VKI_MIPS64_EF_CP0_STATUS] = arch->vex.guest_CP0_status; + regs[VKI_MIPS64_EF_CP0_EPC] = arch->vex.guest_PC; #elif defined(VGP_tilegx_linux) # define DO(n) regs->regs[n] = arch->vex.guest_r##n DO(0); DO(1); DO(2); DO(3); DO(4); DO(5); DO(6); DO(7); diff --git a/include/vki/vki-mips32-linux.h b/include/vki/vki-mips32-linux.h index 54d9a96864..5be8e15625 100644 --- a/include/vki/vki-mips32-linux.h +++ b/include/vki/vki-mips32-linux.h @@ -815,56 +815,60 @@ struct vki_pt_regs { #endif } __attribute__ ((aligned (8))); - -#define vki_user_regs_struct vki_pt_regs - -#define MIPS_lo lo -#define MIPS_hi hi -//#define MIPS_pc regs[32] -#define MIPS_r31 regs[31] -#define MIPS_r30 regs[30] -#define MIPS_r29 regs[29] -#define MIPS_r28 regs[28] -#define MIPS_r27 regs[27] -#define MIPS_r26 regs[26] -#define MIPS_r25 regs[25] -#define MIPS_r24 regs[24] -#define MIPS_r23 regs[23] -#define MIPS_r22 regs[22] -#define MIPS_r21 regs[21] -#define MIPS_r20 regs[20] -#define MIPS_r19 regs[19] -#define MIPS_r18 regs[18] -#define MIPS_r17 regs[17] -#define MIPS_r16 regs[16] -#define MIPS_r15 regs[15] -#define MIPS_r14 regs[14] -#define MIPS_r13 regs[13] -#define MIPS_r12 regs[12] -#define MIPS_r11 regs[11] -#define MIPS_r10 regs[10] -#define MIPS_r9 regs[9] -#define MIPS_r8 regs[8] -#define MIPS_r7 regs[7] -#define MIPS_r6 regs[6] -#define MIPS_r5 regs[5] -#define MIPS_r4 regs[4] -#define MIPS_r3 regs[3] -#define MIPS_r2 regs[2] -#define MIPS_r1 regs[1] -#define MIPS_r0 regs[0] - #define VKI_PTRACE_GETREGS 12 #define VKI_PTRACE_SETREGS 13 #define VKI_PTRACE_GETFPREGS 14 #define VKI_PTRACE_SETFPREGS 15 //---------------------------------------------------------------------- -// From linux-2.6.35.5/include/asm-mips/elf.h +// From linux-4.5/arch/mips/include/uapi/asm/reg.h +//---------------------------------------------------------------------- +#define VKI_MIPS32_EF_R0 6 +#define VKI_MIPS32_EF_R1 7 +#define VKI_MIPS32_EF_R2 8 +#define VKI_MIPS32_EF_R3 9 +#define VKI_MIPS32_EF_R4 10 +#define VKI_MIPS32_EF_R5 11 +#define VKI_MIPS32_EF_R6 12 +#define VKI_MIPS32_EF_R7 13 +#define VKI_MIPS32_EF_R8 14 +#define VKI_MIPS32_EF_R9 15 +#define VKI_MIPS32_EF_R10 16 +#define VKI_MIPS32_EF_R11 17 +#define VKI_MIPS32_EF_R12 18 +#define VKI_MIPS32_EF_R13 19 +#define VKI_MIPS32_EF_R14 20 +#define VKI_MIPS32_EF_R15 21 +#define VKI_MIPS32_EF_R16 22 +#define VKI_MIPS32_EF_R17 23 +#define VKI_MIPS32_EF_R18 24 +#define VKI_MIPS32_EF_R19 25 +#define VKI_MIPS32_EF_R20 26 +#define VKI_MIPS32_EF_R21 27 +#define VKI_MIPS32_EF_R22 28 +#define VKI_MIPS32_EF_R23 29 +#define VKI_MIPS32_EF_R24 30 +#define VKI_MIPS32_EF_R25 31 +#define VKI_MIPS32_EF_R26 32 +#define VKI_MIPS32_EF_R27 33 +#define VKI_MIPS32_EF_R28 34 +#define VKI_MIPS32_EF_R29 35 +#define VKI_MIPS32_EF_R30 36 +#define VKI_MIPS32_EF_R31 37 +#define VKI_MIPS32_EF_LO 38 +#define VKI_MIPS32_EF_HI 39 +#define VKI_MIPS32_EF_CP0_EPC 40 +#define VKI_MIPS32_EF_CP0_BADVADDR 41 +#define VKI_MIPS32_EF_CP0_STATUS 42 +#define VKI_MIPS32_EF_CP0_CAUSE 43 +#define VKI_MIPS32_EF_UNUSED0 44 + +//---------------------------------------------------------------------- +// From linux-4.5/arch/mips/include/asm/elf.h //---------------------------------------------------------------------- typedef unsigned long vki_elf_greg_t; -#define VKI_ELF_NGREG (sizeof (struct vki_user_regs_struct) / sizeof(vki_elf_greg_t)) -#define VKI_ELF_NFPREG 33 /* includes fpscr */ +#define VKI_ELF_NGREG 45 +#define VKI_ELF_NFPREG 33 /* includes fpscr */ typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG]; diff --git a/include/vki/vki-mips64-linux.h b/include/vki/vki-mips64-linux.h index bfd8692348..26b8e9f982 100644 --- a/include/vki/vki-mips64-linux.h +++ b/include/vki/vki-mips64-linux.h @@ -841,43 +841,48 @@ struct vki_pt_regs { #endif } __attribute__ ((aligned (8))); - -#define vki_user_regs_struct vki_pt_regs - -#define MIPS_lo lo -#define MIPS_hi hi -#define MIPS_r31 regs[31] -#define MIPS_r30 regs[30] -#define MIPS_r29 regs[29] -#define MIPS_r28 regs[28] -#define MIPS_r27 regs[27] -#define MIPS_r26 regs[26] -#define MIPS_r25 regs[25] -#define MIPS_r24 regs[24] -#define MIPS_r23 regs[23] -#define MIPS_r22 regs[22] -#define MIPS_r21 regs[21] -#define MIPS_r20 regs[20] -#define MIPS_r19 regs[19] -#define MIPS_r18 regs[18] -#define MIPS_r17 regs[17] -#define MIPS_r16 regs[16] -#define MIPS_r15 regs[15] -#define MIPS_r14 regs[14] -#define MIPS_r13 regs[13] -#define MIPS_r12 regs[12] -#define MIPS_r11 regs[11] -#define MIPS_r10 regs[10] -#define MIPS_r9 regs[9] -#define MIPS_r8 regs[8] -#define MIPS_r7 regs[7] -#define MIPS_r6 regs[6] -#define MIPS_r5 regs[5] -#define MIPS_r4 regs[4] -#define MIPS_r3 regs[3] -#define MIPS_r2 regs[2] -#define MIPS_r1 regs[1] -#define MIPS_r0 regs[0] +//---------------------------------------------------------------------- +// From linux-4.5/arch/mips/include/uapi/asm/reg.h +//---------------------------------------------------------------------- + +#define VKI_MIPS64_EF_R0 0 +#define VKI_MIPS64_EF_R1 1 +#define VKI_MIPS64_EF_R2 2 +#define VKI_MIPS64_EF_R3 3 +#define VKI_MIPS64_EF_R4 4 +#define VKI_MIPS64_EF_R5 5 +#define VKI_MIPS64_EF_R6 6 +#define VKI_MIPS64_EF_R7 7 +#define VKI_MIPS64_EF_R8 8 +#define VKI_MIPS64_EF_R9 9 +#define VKI_MIPS64_EF_R10 10 +#define VKI_MIPS64_EF_R11 11 +#define VKI_MIPS64_EF_R12 12 +#define VKI_MIPS64_EF_R13 13 +#define VKI_MIPS64_EF_R14 14 +#define VKI_MIPS64_EF_R15 15 +#define VKI_MIPS64_EF_R16 16 +#define VKI_MIPS64_EF_R17 17 +#define VKI_MIPS64_EF_R18 18 +#define VKI_MIPS64_EF_R19 19 +#define VKI_MIPS64_EF_R20 20 +#define VKI_MIPS64_EF_R21 21 +#define VKI_MIPS64_EF_R22 22 +#define VKI_MIPS64_EF_R23 23 +#define VKI_MIPS64_EF_R24 24 +#define VKI_MIPS64_EF_R25 25 +#define VKI_MIPS64_EF_R26 26 +#define VKI_MIPS64_EF_R27 27 +#define VKI_MIPS64_EF_R28 28 +#define VKI_MIPS64_EF_R29 29 +#define VKI_MIPS64_EF_R30 30 +#define VKI_MIPS64_EF_R31 31 +#define VKI_MIPS64_EF_LO 32 +#define VKI_MIPS64_EF_HI 33 +#define VKI_MIPS64_EF_CP0_EPC 34 +#define VKI_MIPS64_EF_CP0_BADVADDR 35 +#define VKI_MIPS64_EF_CP0_STATUS 36 +#define VKI_MIPS64_EF_CP0_CAUSE 37 //---------------------------------------------------------------------- // From linux-2.6.35.9/include/asm-i386/ptrace.h