]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
mips: fix coredump creation in Valgrind
authorPetar Jovanovic <mips32r2@gmail.com>
Wed, 19 Oct 2016 17:49:06 +0000 (17:49 +0000)
committerPetar Jovanovic <mips32r2@gmail.com>
Wed, 19 Oct 2016 17:49:06 +0000 (17:49 +0000)
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

coregrind/m_coredump/coredump-elf.c
include/vki/vki-mips32-linux.h
include/vki/vki-mips64-linux.h

index d51b8d2445cd52bc11740a8b211883a271739cfe..b4b429302eed7335064acb2553496f62f4e78b86 100644 (file)
@@ -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);
index 54d9a96864ebbe09ef93efa62477387aa9be63b8..5be8e156256195769795d9f2622923e6d40b8ce7 100644 (file)
@@ -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];
 
index bfd86923483739a525ac2518d2282749158c6b04..26b8e9f982e576ad639cea666c507bc20e0baaf7 100644 (file)
@@ -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