|
From: <sv...@va...> - 2012-08-18 11:06:16
|
philippe 2012-08-18 12:06:04 +0100 (Sat, 18 Aug 2012)
New Revision: 12881
Log:
fix n-i-bz vgdb ptrace calls wrong on mips, causing blocked syscalls to fail
(patch from Petar Jovanovic).
The mips specific code of vgdb.c was storing the arguments
at wrong places in the ptrace setreg. This caused the blocked syscall(s)
to return with an error rather than to be properly restarted.
With this commit, the gdbsrv tests are not blocking anymore
with Valgrind mips32 running on mips64 GNU/Linux.
vgdb is believed to be functional, even if process is blocked in a syscall.
The following tests are still failing
gdbserver_tests/mcbreak (stdout)
gdbserver_tests/mcbreak (stdoutB)
gdbserver_tests/mcbreak (stderrB)
gdbserver_tests/mcsignopass (stderr)
gdbserver_tests/mcsignopass (stdoutB)
gdbserver_tests/mcsigpass (stderr)
gdbserver_tests/mcsigpass (stdoutB)
gdbserver_tests/nlcontrolc (stdoutB)
gdbserver_tests/nlsigvgdb (stderr)
gdbserver_tests/nlsigvgdb (stderrB)
Of the above, nlsigvgdb failure is still strange.
Others looks like "normal" differences due e.g. to mips specific gdb
behaviour and/or none/tests/faultstatus (re-used in gdbsrv tests)
behaving differently on mips.
Modified files:
trunk/NEWS
trunk/coregrind/vgdb.c
Modified: trunk/NEWS (+1 -0)
===================================================================
--- trunk/NEWS 2012-08-18 11:02:32 +01:00 (rev 12880)
+++ trunk/NEWS 2012-08-18 12:06:04 +01:00 (rev 12881)
@@ -22,6 +22,7 @@
n-i-bz shmat of a segment > 4Gb does not work
n-i-bz gdbserver_tests/simulate_control_c test script wrong USR1 sig nr on mips
+n-i-bz vgdb ptrace calls wrong on mips, causing blocked syscalls to fail
Release 3.8.0 (10 August 2012)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Modified: trunk/coregrind/vgdb.c (+12 -5)
===================================================================
--- trunk/coregrind/vgdb.c 2012-08-18 11:02:32 +01:00 (rev 12880)
+++ trunk/coregrind/vgdb.c 2012-08-18 12:06:04 +01:00 (rev 12881)
@@ -925,7 +925,7 @@
#elif defined(VGA_s390x)
sp = user_mod.regs.gprs[15];
#elif defined(VGA_mips32)
- sp = user_mod.regs[29];
+ sp = user_mod.regs[29*2];
#else
I_die_here : (sp) architecture missing in vgdb.c
#endif
@@ -999,11 +999,18 @@
#elif defined(VGA_s390x)
XERROR(0, "(fn32) s390x has no 32bits implementation");
#elif defined(VGA_mips32)
- /* put check arg in register 0 */
- user_mod.regs[4] = check;
+ /* put check arg in register 4 */
+ user_mod.regs[4*2] = check;
+ user_mod.regs[4*2+1] = 0xffffffff; // sign extend $a0
+ /* This sign extension is needed when vgdb 32 bits runs
+ on a 64 bits OS. */
/* put NULL return address in ra */
- user_mod.regs[31] = bad_return;
- user_mod.regs[25] = shared32->invoke_gdbserver;
+ user_mod.regs[31*2] = bad_return;
+ user_mod.regs[31*2+1] = 0;
+ user_mod.regs[34*2] = shared32->invoke_gdbserver;
+ user_mod.regs[34*2+1] = 0;
+ user_mod.regs[25*2] = shared32->invoke_gdbserver;
+ user_mod.regs[25*2+1] = 0;
#else
I_die_here : architecture missing in vgdb.c
#endif
|