|
From: <sv...@va...> - 2016-10-12 15:13:34
|
Author: petarj
Date: Wed Oct 12 16:13:27 2016
New Revision: 16039
Log:
mips: allow Valgrind to be compiled for soft-float
Force "hardfloat" mode for inline assembly that uses FPU instructions,
but pop original mode at the end of the assembly. Unhandled FPU
instructions will be handled by the signal handler (env_unsup_insn).
Skip MIPS specific tests for FPU if the code gets compiled for soft-
float.
This should allow Valgrind to be compiled as a soft-float binary, but
that executable should be used for soft-float systems only.
Related VEX change - r3261.
Related issue - BZ#351282.
Patch by Aleksandar Rikalo.
Modified:
trunk/coregrind/m_machine.c
trunk/none/tests/mips32/FPUarithmetic.c
trunk/none/tests/mips32/FPUarithmetic.vgtest
trunk/none/tests/mips32/MoveIns.c
trunk/none/tests/mips32/MoveIns.vgtest
trunk/none/tests/mips32/change_fp_mode.c
trunk/none/tests/mips32/change_fp_mode.vgtest
trunk/none/tests/mips32/fpu_branches.c
trunk/none/tests/mips32/fpu_branches.vgtest
trunk/none/tests/mips32/round.c
trunk/none/tests/mips32/round.vgtest
trunk/none/tests/mips32/round_fpu64.c
trunk/none/tests/mips32/round_fpu64.vgtest
trunk/none/tests/mips32/test_fcsr.c
trunk/none/tests/mips32/test_fcsr.vgtest
trunk/none/tests/mips32/vfp.c
trunk/none/tests/mips32/vfp.vgtest
trunk/none/tests/mips64/change_fp_mode.c
trunk/none/tests/mips64/change_fp_mode.vgtest
Modified: trunk/coregrind/m_machine.c
==============================================================================
--- trunk/coregrind/m_machine.c (original)
+++ trunk/coregrind/m_machine.c Wed Oct 12 16:13:27 2016
@@ -1738,10 +1738,6 @@
}
}
- VG_(convert_sigaction_fromK_to_toK)(&saved_sigill_act, &tmp_sigill_act);
- VG_(sigaction)(VKI_SIGILL, &tmp_sigill_act, NULL);
- VG_(sigprocmask)(VKI_SIG_SETMASK, &saved_set, NULL);
-
# if defined(VGP_mips32_linux)
Int fpmode = VG_(prctl)(VKI_PR_GET_FP_MODE);
# else
@@ -1752,25 +1748,33 @@
/* prctl(PR_GET_FP_MODE) is not supported by Kernel,
we are using alternative way to determine FP mode */
ULong result = 0;
- __asm__ volatile (
- ".set push\n\t"
- ".set noreorder\n\t"
- ".set oddspreg\n\t"
- "lui $t0, 0x3FF0\n\t"
- "ldc1 $f0, %0\n\t"
- "mtc1 $t0, $f1\n\t"
- "sdc1 $f0, %0\n\t"
- ".set pop\n\t"
- : "+m"(result)
- :
- : "t0", "$f0", "$f1", "memory");
- fpmode = (result != 0x3FF0000000000000ull);
+ if (!VG_MINIMAL_SETJMP(env_unsup_insn)) {
+ __asm__ volatile (
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ ".set oddspreg\n\t"
+ ".set hardfloat\n\t"
+ "lui $t0, 0x3FF0\n\t"
+ "ldc1 $f0, %0\n\t"
+ "mtc1 $t0, $f1\n\t"
+ "sdc1 $f0, %0\n\t"
+ ".set pop\n\t"
+ : "+m"(result)
+ :
+ : "t0", "$f0", "$f1", "memory");
+
+ fpmode = (result != 0x3FF0000000000000ull);
+ }
}
if (fpmode != 0)
vai.hwcaps |= VEX_MIPS_HOST_FR;
+ VG_(convert_sigaction_fromK_to_toK)(&saved_sigill_act, &tmp_sigill_act);
+ VG_(sigaction)(VKI_SIGILL, &tmp_sigill_act, NULL);
+ VG_(sigprocmask)(VKI_SIG_SETMASK, &saved_set, NULL);
+
VG_(debugLog)(1, "machine", "hwcaps = 0x%x\n", vai.hwcaps);
VG_(machine_get_cache_info)(&vai);
Modified: trunk/none/tests/mips32/FPUarithmetic.c
==============================================================================
--- trunk/none/tests/mips32/FPUarithmetic.c (original)
+++ trunk/none/tests/mips32/FPUarithmetic.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <stdio.h>
#include <stdlib.h>
@@ -235,4 +237,8 @@
return 0;
}
-
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips32/FPUarithmetic.vgtest
==============================================================================
--- trunk/none/tests/mips32/FPUarithmetic.vgtest (original)
+++ trunk/none/tests/mips32/FPUarithmetic.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: FPUarithmetic
+prereq: ../../../tests/mips_features fpu
vgopts: -q
Modified: trunk/none/tests/mips32/MoveIns.c
==============================================================================
--- trunk/none/tests/mips32/MoveIns.c (original)
+++ trunk/none/tests/mips32/MoveIns.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <stdint.h>
#include <stdio.h>
@@ -661,3 +663,8 @@
return 0;
}
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips32/MoveIns.vgtest
==============================================================================
--- trunk/none/tests/mips32/MoveIns.vgtest (original)
+++ trunk/none/tests/mips32/MoveIns.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: MoveIns
+prereq: ../../../tests/mips_features fpu
vgopts: -q
Modified: trunk/none/tests/mips32/change_fp_mode.c
==============================================================================
--- trunk/none/tests/mips32/change_fp_mode.c (original)
+++ trunk/none/tests/mips32/change_fp_mode.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <elf.h>
#include <stdio.h>
#include <stdlib.h>
@@ -76,3 +78,8 @@
return 0;
}
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips32/change_fp_mode.vgtest
==============================================================================
--- trunk/none/tests/mips32/change_fp_mode.vgtest (original)
+++ trunk/none/tests/mips32/change_fp_mode.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: change_fp_mode
+prereq: ../../../tests/mips_features fpu
vgopts: -q
Modified: trunk/none/tests/mips32/fpu_branches.c
==============================================================================
--- trunk/none/tests/mips32/fpu_branches.c (original)
+++ trunk/none/tests/mips32/fpu_branches.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <stdio.h>
#define MAX_ARR 24
@@ -314,4 +316,8 @@
}
return 0;
}
-
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips32/fpu_branches.vgtest
==============================================================================
--- trunk/none/tests/mips32/fpu_branches.vgtest (original)
+++ trunk/none/tests/mips32/fpu_branches.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: fpu_branches
+prereq: ../../../tests/mips_features fpu
vgopts: -q
Modified: trunk/none/tests/mips32/round.c
==============================================================================
--- trunk/none/tests/mips32/round.c (original)
+++ trunk/none/tests/mips32/round.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <stdio.h>
typedef enum {
@@ -289,4 +291,9 @@
}
return 0;
}
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips32/round.vgtest
==============================================================================
--- trunk/none/tests/mips32/round.vgtest (original)
+++ trunk/none/tests/mips32/round.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: round
+prereq: ../../../tests/mips_features fpu
vgopts: -q
Modified: trunk/none/tests/mips32/round_fpu64.c
==============================================================================
--- trunk/none/tests/mips32/round_fpu64.c (original)
+++ trunk/none/tests/mips32/round_fpu64.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
@@ -202,3 +204,8 @@
#endif
return 0;
}
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips32/round_fpu64.vgtest
==============================================================================
--- trunk/none/tests/mips32/round_fpu64.vgtest (original)
+++ trunk/none/tests/mips32/round_fpu64.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: round_fpu64
+prereq: ../../../tests/mips_features fpu
vgopts: -q
Modified: trunk/none/tests/mips32/test_fcsr.c
==============================================================================
--- trunk/none/tests/mips32/test_fcsr.c (original)
+++ trunk/none/tests/mips32/test_fcsr.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <stdio.h>
int main ()
@@ -23,3 +25,8 @@
printf("FCSR::1: 0x%x, 2: 0x%x\n", out[0], out[1]);
return 0;
}
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips32/test_fcsr.vgtest
==============================================================================
--- trunk/none/tests/mips32/test_fcsr.vgtest (original)
+++ trunk/none/tests/mips32/test_fcsr.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: test_fcsr
+prereq: ../../../tests/mips_features fpu
vgopts: -q
Modified: trunk/none/tests/mips32/vfp.c
==============================================================================
--- trunk/none/tests/mips32/vfp.c (original)
+++ trunk/none/tests/mips32/vfp.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <stdint.h>
#include <stdio.h>
@@ -405,4 +407,8 @@
return 0;
}
-
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips32/vfp.vgtest
==============================================================================
--- trunk/none/tests/mips32/vfp.vgtest (original)
+++ trunk/none/tests/mips32/vfp.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: vfp
+prereq: ../../../tests/mips_features fpu
vgopts: -q
Modified: trunk/none/tests/mips64/change_fp_mode.c
==============================================================================
--- trunk/none/tests/mips64/change_fp_mode.c (original)
+++ trunk/none/tests/mips64/change_fp_mode.c Wed Oct 12 16:13:27 2016
@@ -1,3 +1,5 @@
+#if defined(__mips_hard_float)
+
#include <elf.h>
#include <stdio.h>
#include <stdlib.h>
@@ -257,3 +259,8 @@
return 0;
}
+#else
+int main() {
+ return 0;
+}
+#endif
Modified: trunk/none/tests/mips64/change_fp_mode.vgtest
==============================================================================
--- trunk/none/tests/mips64/change_fp_mode.vgtest (original)
+++ trunk/none/tests/mips64/change_fp_mode.vgtest Wed Oct 12 16:13:27 2016
@@ -1,2 +1,3 @@
prog: change_fp_mode
+prereq: ../../../tests/mips_features fpu
vgopts: -q
|