| Summary: | mips64 libvexmultiarch_test fails on s390x | ||
|---|---|---|---|
| Product: | [Developer tools] valgrind | Reporter: | Mark Wielaard <mark> |
| Component: | general | Assignee: | Petar Jovanovic <mips32r2> |
| Status: | RESOLVED FIXED | ||
| Severity: | normal | CC: | mips32r2 |
| Priority: | NOR | ||
| Version First Reported In: | unspecified | ||
| Target Milestone: | --- | ||
| Platform: | Other | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
Petar could you take a peek at the above issue and fix/workaround? I will take a look at it. Is there a way to reproduce it myself? I am not seeing any s390 boards on GCC farm unfortunately. (In reply to Petar Jovanovic from comment #2) > I will take a look at it. Is there a way to reproduce it myself? > I am not seeing any s390 boards on GCC farm unfortunately. I had assumed it would also trigger on ppc64be (s390x is also big endian), but it seems to work fine there. Which might indicate that my patch/logic is wrong. I'll see if I can get you access to the s390x server that I replicated this on. For ppc64be this is the output:
//// doing translating guest PPC64(1030) BigEndian 64bits to host MIPS64(1033) BigEndian 64bits
------------------------ Front end ------------------------
0x103C34C8: ------ IMark(0x103C34C8, 0, 0) ------
PUT(1296) = 0x103C34C8:I64
PUT(1296) = GET:I64(1296); exit-NoDecode
GuestBytes 103C34C8 0 00000000
------------------------ After pre-instr IR optimisation ------------------------
IRSB {
t0:I64
------ IMark(0x103C34C8, 0, 0) ------
PUT(1296) = 0x103C34C8:I64; exit-NoDecode
}
------------------------ After instrumentation ------------------------
IRSB {
t0:I64
------ IMark(0x103C34C8, 0, 0) ------
PUT(1296) = 0x103C34C8:I64; exit-NoDecode
}
------------------------ After post-instr IR optimisation ------------------------
IRSB {
t0:I64
------ IMark(0x103C34C8, 0, 0) ------
PUT(1296) = 0x103C34C8:I64; exit-NoDecode
}
------------------------ After tree-building ------------------------
IRSB {
t0:I64
------ IMark(0x103C34C8, 0, 0) ------
PUT(1296) = 0x103C34C8:I64; exit-NoDecode
}
------------------------ Instruction selection ------------------------
(evCheck) lw $9, 8($23); addiu $9, $9, -1; sw $9, 8($23); bgez $t9, nofail; jalr *0($23); nofail:
-- ------ IMark(0x103C34C8, 0, 0) ------
-- PUT(1296) = 0x103C34C8:I64; exit-NoDecode
li %vR1,0x00000000103C34C8
(xAssisted) if (guest_COND.AL) { sw %vR1, 1296($23); move $9, $IRJumpKind_to_TRCVAL(6664); move $9, $disp_assisted; jalr $9; nop; }
0 (evCheck) lw $9, 8($23); addiu $9, $9, -1; sw $9, 8($23); bgez $t9, nofail; jalr *0($23); nofail:
1 li %vR1,0x00000000103C34C8
2 (xAssisted) if (guest_COND.AL) { sw %vR1, 1296($23); move $9, $IRJumpKind_to_TRCVAL(6664); move $9, $disp_assisted; jalr $9; nop; }
------------------------ Register-allocated code ------------------------
0 (evCheck) lw $9, 8($23); addiu $9, $9, -1; sw $9, 8($23); bgez $t9, nofail; jalr *0($23); nofail:
1 li $24,0x00000000103C34C8
2 (xAssisted) if (guest_COND.AL) { sw $24, 1296($23); move $9, $IRJumpKind_to_TRCVAL(6664); move $9, $disp_assisted; jalr $9; nop; }
------------------------ Assembly ------------------------
(evCheck) lw $9, 8($23); addiu $9, $9, -1; sw $9, 8($23); bgez $t9, nofail; jalr *0($23); nofail:
8E E9 00 08 25 29 FF FF AE E9 00 08 05 21 00 03 DE E9 00 00 01 20 F8 09 00 00 00 00
li $24,0x00000000103C34C8
3C 18 10 3C 37 18 34 C8
(xAssisted) if (guest_COND.AL) { sw $24, 1296($23); move $9, $IRJumpKind_to_TRCVAL(6664); move $9, $disp_assisted; jalr $9; nop; }
FE F8 05 10 3C 17 00 00 36 F7 00 00 00 17 BC 38 36 F7 00 00 00 17 BC 38 36 F7 00 45 3C 09 00 00 35 29 00 00 00 09 4C 38 35 29 10 3C 00 09 4C 38 35 29 34 98 01 20 F8 09 00 00 00 00
VexExpansionRatio 0 96 960 :10
For s390x it is:
//// doing translating guest S390X(1031) BigEndian 64bits to host MIPS64(1033) BigEndian 64bits
------------------------ Front end ------------------------
ldgr %f2,%r11
------ IMark(0x1000920, 4, 0) ------
PUT(96) = ReinterpI64asF64(GET:I64(664))
PUT(720) = 0x1000924:I64
ldgr %f0,%r15
------ IMark(0x1000924, 4, 0) ------
PUT(64) = ReinterpI64asF64(GET:I64(696))
PUT(720) = 0x1000928:I64
lay %r15,-168(%r15)
------ IMark(0x1000928, 6, 0) ------
t1 = 0xFFFFFFFFFFFFFF58:I64
t0 = Add64(Add64(t1,GET:I64(696)),0x0:I64)
PUT(696) = t0
PUT(720) = 0x100092E:I64
lgr %r11,%r15
------ IMark(0x100092E, 4, 0) ------
PUT(664) = GET:I64(696)
PUT(720) = 0x1000932:I64
stg %r2,160(%r11)
------ IMark(0x1000932, 6, 0) ------
t3 = 0xA0:I64
t2 = Add64(Add64(t3,GET:I64(664)),0x0:I64)
STbe(t2) = GET:I64(592)
PUT(720) = 0x1000938:I64
lg %r1,160(%r11)
------ IMark(0x1000938, 6, 0) ------
t5 = 0xA0:I64
t4 = Add64(Add64(t5,GET:I64(664)),0x0:I64)
PUT(584) = LDbe:I64(t4)
PUT(720) = 0x100093E:I64
mvhi 0(%r1),1031
------ IMark(0x100093E, 6, 0) ------
t6 = Add64(0x0:I64,GET:I64(584))
STbe(t6) = 0x407:I32
PUT(720) = 0x1000944:I64
nopr
------ IMark(0x1000944, 2, 0) ------
PUT(720) = 0x1000946:I64
lgdr %r11,%f2
------ IMark(0x1000946, 4, 0) ------
PUT(664) = ReinterpF64asI64(GET:F64(96))
PUT(720) = 0x100094A:I64
lgdr %r15,%f0
------ IMark(0x100094A, 4, 0) ------
PUT(696) = ReinterpF64asI64(GET:F64(64))
PUT(720) = 0x100094E:I64
br %r14
------ IMark(0x100094E, 2, 0) ------
PUT(720) = GET:I64(688)
PUT(720) = GET:I64(720); exit-Return
GuestBytes 1000920 48 B3 C1 00 2B B3 C1 00 0F E3 F0 FF 58 FF 71 B9 04 00 BF E3 20 B0 A0 00 24 E3 10 B0 A0 00 04 E5 4C 10 00 04 07 07 00 B3 CD 00 B2 B3 CD 00 F0 07 FE EC1F5600
------------------------ After pre-instr IR optimisation ------------------------
IRSB {
t0:I64 t1:I64 t2:I64 t3:I64 t4:I64 t5:I64 t6:I64 t7:I32
t8:I32 t9:F64 t10:I64 t11:F64 t12:I64 t13:I64 t14:I64 t15:I64
t16:I64 t17:I64 t18:I64 t19:I64 t20:I64 t21:I64 t22:I64 t23:I64
t24:I64 t25:I64 t26:I64 t27:I64 t28:F64 t29:I64 t30:F64 t31:I64
t32:I64
------ IMark(0x1000920, 4, 0) ------
t10 = GET:I64(664)
t9 = ReinterpI64asF64(t10)
PUT(96) = t9
------ IMark(0x1000924, 4, 0) ------
t12 = GET:I64(696)
t11 = ReinterpI64asF64(t12)
PUT(64) = t11
------ IMark(0x1000928, 6, 0) ------
t14 = Add64(0xFFFFFFFFFFFFFF58:I64,t12)
PUT(696) = t14
------ IMark(0x100092E, 4, 0) ------
PUT(664) = t14
PUT(720) = 0x1000932:I64
------ IMark(0x1000932, 6, 0) ------
t18 = Add64(0xA0:I64,t14)
t20 = GET:I64(592)
STbe(t18) = t20
PUT(720) = 0x1000938:I64
------ IMark(0x1000938, 6, 0) ------
t22 = t18
t24 = LDbe:I64(t22)
PUT(584) = t24
PUT(720) = 0x100093E:I64
------ IMark(0x100093E, 6, 0) ------
STbe(t24) = 0x407:I32
------ IMark(0x1000944, 2, 0) ------
------ IMark(0x1000946, 4, 0) ------
t27 = ReinterpF64asI64(t9)
PUT(664) = t27
------ IMark(0x100094A, 4, 0) ------
t29 = ReinterpF64asI64(t11)
PUT(696) = t29
------ IMark(0x100094E, 2, 0) ------
t31 = GET:I64(688)
PUT(720) = t31; exit-Return
}
------------------------ After instrumentation ------------------------
IRSB {
t0:I64 t1:I64 t2:I64 t3:I64 t4:I64 t5:I64 t6:I64 t7:I32
t8:I32 t9:F64 t10:I64 t11:F64 t12:I64 t13:I64 t14:I64 t15:I64
t16:I64 t17:I64 t18:I64 t19:I64 t20:I64 t21:I64 t22:I64 t23:I64
t24:I64 t25:I64 t26:I64 t27:I64 t28:F64 t29:I64 t30:F64 t31:I64
t32:I64
------ IMark(0x1000920, 4, 0) ------
t10 = GET:I64(664)
t9 = ReinterpI64asF64(t10)
PUT(96) = t9
------ IMark(0x1000924, 4, 0) ------
t12 = GET:I64(696)
t11 = ReinterpI64asF64(t12)
PUT(64) = t11
------ IMark(0x1000928, 6, 0) ------
t14 = Add64(0xFFFFFFFFFFFFFF58:I64,t12)
PUT(696) = t14
------ IMark(0x100092E, 4, 0) ------
PUT(664) = t14
PUT(720) = 0x1000932:I64
------ IMark(0x1000932, 6, 0) ------
t18 = Add64(0xA0:I64,t14)
t20 = GET:I64(592)
STbe(t18) = t20
PUT(720) = 0x1000938:I64
------ IMark(0x1000938, 6, 0) ------
t22 = t18
t24 = LDbe:I64(t22)
PUT(584) = t24
PUT(720) = 0x100093E:I64
------ IMark(0x100093E, 6, 0) ------
STbe(t24) = 0x407:I32
------ IMark(0x1000944, 2, 0) ------
------ IMark(0x1000946, 4, 0) ------
t27 = ReinterpF64asI64(t9)
PUT(664) = t27
------ IMark(0x100094A, 4, 0) ------
t29 = ReinterpF64asI64(t11)
PUT(696) = t29
------ IMark(0x100094E, 2, 0) ------
t31 = GET:I64(688)
PUT(720) = t31; exit-Return
}
------------------------ After post-instr IR optimisation ------------------------
IRSB {
t0:I64 t1:I64 t2:I64 t3:I64 t4:I64 t5:I64 t6:I64 t7:I32
t8:I32 t9:F64 t10:I64 t11:F64 t12:I64 t13:I64 t14:I64 t15:I64
t16:I64 t17:I64 t18:I64 t19:I64 t20:I64 t21:I64 t22:I64 t23:I64
t24:I64 t25:I64 t26:I64 t27:I64 t28:F64 t29:I64 t30:F64 t31:I64
t32:I64
------ IMark(0x1000920, 4, 0) ------
t10 = GET:I64(664)
t9 = ReinterpI64asF64(t10)
PUT(96) = t9
------ IMark(0x1000924, 4, 0) ------
t12 = GET:I64(696)
t11 = ReinterpI64asF64(t12)
PUT(64) = t11
------ IMark(0x1000928, 6, 0) ------
t14 = Add64(0xFFFFFFFFFFFFFF58:I64,t12)
PUT(696) = t14
------ IMark(0x100092E, 4, 0) ------
PUT(664) = t14
PUT(720) = 0x1000932:I64
------ IMark(0x1000932, 6, 0) ------
t18 = Add64(0xA0:I64,t14)
t20 = GET:I64(592)
STbe(t18) = t20
PUT(720) = 0x1000938:I64
------ IMark(0x1000938, 6, 0) ------
t22 = t18
t24 = LDbe:I64(t22)
PUT(584) = t24
PUT(720) = 0x100093E:I64
------ IMark(0x100093E, 6, 0) ------
STbe(t24) = 0x407:I32
------ IMark(0x1000944, 2, 0) ------
------ IMark(0x1000946, 4, 0) ------
t27 = ReinterpF64asI64(t9)
PUT(664) = t27
------ IMark(0x100094A, 4, 0) ------
t29 = ReinterpF64asI64(t11)
PUT(696) = t29
------ IMark(0x100094E, 2, 0) ------
t31 = GET:I64(688)
PUT(720) = t31; exit-Return
}
------------------------ After tree-building ------------------------
IRSB {
t0:I64 t1:I64 t2:I64 t3:I64 t4:I64 t5:I64 t6:I64 t7:I32
t8:I32 t9:F64 t10:I64 t11:F64 t12:I64 t13:I64 t14:I64 t15:I64
t16:I64 t17:I64 t18:I64 t19:I64 t20:I64 t21:I64 t22:I64 t23:I64
t24:I64 t25:I64 t26:I64 t27:I64 t28:F64 t29:I64 t30:F64 t31:I64
t32:I64
------ IMark(0x1000920, 4, 0) ------
t9 = ReinterpI64asF64(GET:I64(664))
PUT(96) = t9
------ IMark(0x1000924, 4, 0) ------
t12 = GET:I64(696)
t11 = ReinterpI64asF64(t12)
PUT(64) = t11
------ IMark(0x1000928, 6, 0) ------
t14 = Add64(0xFFFFFFFFFFFFFF58:I64,t12)
PUT(696) = t14
------ IMark(0x100092E, 4, 0) ------
PUT(664) = t14
PUT(720) = 0x1000932:I64
------ IMark(0x1000932, 6, 0) ------
t18 = Add64(0xA0:I64,t14)
STbe(t18) = GET:I64(592)
PUT(720) = 0x1000938:I64
------ IMark(0x1000938, 6, 0) ------
t24 = LDbe:I64(t18)
PUT(584) = t24
PUT(720) = 0x100093E:I64
------ IMark(0x100093E, 6, 0) ------
STbe(t24) = 0x407:I32
------ IMark(0x1000944, 2, 0) ------
------ IMark(0x1000946, 4, 0) ------
PUT(664) = ReinterpF64asI64(t9)
------ IMark(0x100094A, 4, 0) ------
PUT(696) = ReinterpF64asI64(t11)
------ IMark(0x100094E, 2, 0) ------
PUT(720) = GET:I64(688); exit-Return
}
------------------------ Instruction selection ------------------------
(evCheck) lw $9, 804($23); addiu $9, $9, -1; sw $9, 804($23); bgez $t9, nofail; jalr *808($23); nofail:
-- ------ IMark(0x1000920, 4, 0) ------
-- t9 = ReinterpI64asF64(GET:I64(664))
vex: priv/host_mips_isel.c:4915 (iselInt64Expr): Assertion `!env->mode64' failed.
> t9 = ReinterpI64asF64(GET:I64(664))
> vex: priv/host_mips_isel.c:4915 (iselInt64Expr): Assertion `!env->mode64'
> failed.
Either (1) there is some 32-vs-64-bit guest-vs-host confusion here, or (2)
there is no confusion, and instead this is a mips32 instruction selector
problem.
For (2) the test requires iselInt64Expr to select 32-bit instructions for
GET:I64(664), which should be two 32-bit loads into two registers.
This problem is triggered when VEX is configured for MIPS64 w/ 32-bit FPUs. Since this can happen only in artificial cases, I will go with adjusting the test itself. Fixed with https://sourceware.org/git/?p=valgrind.git;a=commit;h=cd20c8ca5815f0abf9d1bdb47888753bdb5c5738 Sorry for a delay in taking a look at this. |
./none/tests/libvexmultiarch_test 1 0 0 fails on s390x for mips64 because of: ------------------------ Instruction selection ------------------------ (evCheck) lw $9, 804($23); addiu $9, $9, -1; sw $9, 804($23); bgez $t9, nofail; jalr *808($23); nofail: -- ------ IMark(0x10009B8, 4, 0) ------ -- t9 = ReinterpI64asF64(GET:I64(664)) vex: priv/host_mips_isel.c:4915 (iselInt64Expr): Assertion `!env->mode64' failed. //// failure exit called by libVEX The following fixes (or just works around) it: diff --git a/none/tests/libvex_test.c b/none/tests/libvex_test.c index a39930f49..ca7eb152a 100644 --- a/none/tests/libvex_test.c +++ b/none/tests/libvex_test.c @@ -128,10 +128,10 @@ static UInt arch_hwcaps (VexArch va) { case VexArchS390X: return VEX_HWCAPS_S390X_LDISP; #if (__mips_isa_rev>=6) case VexArchMIPS32: return VEX_PRID_COMP_MIPS | VEX_MIPS_CPU_ISA_M32R6; - case VexArchMIPS64: return VEX_PRID_COMP_MIPS | VEX_MIPS_CPU_ISA_M64R6; + case VexArchMIPS64: return VEX_PRID_COMP_MIPS | VEX_MIPS_CPU_ISA_M64R6 | VEX_MIPS_HOST_FR; #else case VexArchMIPS32: return VEX_PRID_COMP_MIPS; - case VexArchMIPS64: return VEX_PRID_COMP_MIPS; + case VexArchMIPS64: return VEX_PRID_COMP_MIPS | VEX_MIPS_HOST_FR; #endif default: failure_exit(); }