mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-01 13:26:47 +08:00
gdbserver: 64-bit kernel / 32-inferior, syscall restarting
$ make check RUNTESTFLAGS="--target_board=native-gdbserver/-m32 clone-thread_db.exp" gdb.log shows: Running target native-gdbserver/-m32 ... clone-thread_db: src/gdb/testsuite/gdb.threads/clone-thread_db.c:57: thread_fn: Assertion `res != -1' failed. ... (gdb) FAIL: gdb.threads/clone-thread_db.exp: continue to end That was waitpid returning -1 / EINTR. We don't see that when testing with unix/-m32 (native debugging). Turns out to be that when debugging a 32-bit inferior, a 64-bit GDBserver is reading/writing $orig_eax from/to the wrong ptrace register buffer offset. When gdbserver is 64-bit, the ptrace register buffer is in 64-bit layout, so the register is found at "ORIG_EAX * 8", not at "ORIG_EAX * 4". Fixes these with --target_board=native-gdbserver/-m32 on x86_64 Fedora 20: -FAIL: gdb.threads/clone-thread_db.exp: continue to end +PASS: gdb.threads/clone-thread_db.exp: continue to end -FAIL: gdb.threads/hand-call-in-threads.exp: all dummies popped +PASS: gdb.threads/hand-call-in-threads.exp: all dummies popped PASS: gdb.threads/hand-call-in-threads.exp: breakpoint on all_threads_running PASS: gdb.threads/hand-call-in-threads.exp: breakpoint on hand_call PASS: gdb.threads/hand-call-in-threads.exp: disable scheduler locking @@ -29339,15 +29331,15 @@ PASS: gdb.threads/hand-call-in-threads.e PASS: gdb.threads/hand-call-in-threads.exp: discard hand call, thread 4 PASS: gdb.threads/hand-call-in-threads.exp: discard hand call, thread 5 PASS: gdb.threads/hand-call-in-threads.exp: dummy stack frame number, thread 1 -FAIL: gdb.threads/hand-call-in-threads.exp: dummy stack frame number, thread 2 -FAIL: gdb.threads/hand-call-in-threads.exp: dummy stack frame number, thread 3 -FAIL: gdb.threads/hand-call-in-threads.exp: dummy stack frame number, thread 4 +PASS: gdb.threads/hand-call-in-threads.exp: dummy stack frame number, thread 2 +PASS: gdb.threads/hand-call-in-threads.exp: dummy stack frame number, thread 3 +PASS: gdb.threads/hand-call-in-threads.exp: dummy stack frame number, thread 4 PASS: gdb.threads/hand-call-in-threads.exp: dummy stack frame number, thread 5 PASS: gdb.threads/hand-call-in-threads.exp: enable scheduler locking PASS: gdb.threads/hand-call-in-threads.exp: hand call, thread 1 -FAIL: gdb.threads/hand-call-in-threads.exp: hand call, thread 2 -FAIL: gdb.threads/hand-call-in-threads.exp: hand call, thread 3 -FAIL: gdb.threads/hand-call-in-threads.exp: hand call, thread 4 +PASS: gdb.threads/hand-call-in-threads.exp: hand call, thread 2 +PASS: gdb.threads/hand-call-in-threads.exp: hand call, thread 3 +PASS: gdb.threads/hand-call-in-threads.exp: hand call, thread 4 PASS: gdb.threads/hand-call-in-threads.exp: hand call, thread 5 PASS: gdb.threads/hand-call-in-threads.exp: prepare to discard hand call, thread 1 PASS: gdb.threads/hand-call-in-threads.exp: prepare to discard hand call, thread 2 gdb/gdbserver/ChangeLog 2015-02-23 Pedro Alves <palves@redhat.com> * linux-x86-low.c (REGSIZE): Define in both 32-bit and 64-bit modes. (x86_fill_gregset, x86_store_gregset): Use it when handling $orig_eax.
This commit is contained in:
parent
a17b84dd9f
commit
bc9540e842
@ -1,3 +1,10 @@
|
||||
2015-02-23 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* linux-x86-low.c (REGSIZE): Define in both 32-bit and 64-bit
|
||||
modes.
|
||||
(x86_fill_gregset, x86_store_gregset): Use it when handling
|
||||
$orig_eax.
|
||||
|
||||
2015-02-20 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* thread-db.c: Include "nat/linux-procfs.h".
|
||||
|
@ -176,6 +176,7 @@ static /*const*/ int i386_regmap[] =
|
||||
|
||||
/* So code below doesn't have to care, i386 or amd64. */
|
||||
#define ORIG_EAX ORIG_RAX
|
||||
#define REGSIZE 8
|
||||
|
||||
static const int x86_64_regmap[] =
|
||||
{
|
||||
@ -221,6 +222,8 @@ static /*const*/ int i386_regmap[] =
|
||||
|
||||
#define I386_NUM_REGS (sizeof (i386_regmap) / sizeof (i386_regmap[0]))
|
||||
|
||||
#define REGSIZE 4
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __x86_64__
|
||||
@ -374,7 +377,7 @@ x86_fill_gregset (struct regcache *regcache, void *buf)
|
||||
collect_register (regcache, i, ((char *) buf) + i386_regmap[i]);
|
||||
|
||||
collect_register_by_name (regcache, "orig_eax",
|
||||
((char *) buf) + ORIG_EAX * 4);
|
||||
((char *) buf) + ORIG_EAX * REGSIZE);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -396,7 +399,7 @@ x86_store_gregset (struct regcache *regcache, const void *buf)
|
||||
supply_register (regcache, i, ((char *) buf) + i386_regmap[i]);
|
||||
|
||||
supply_register_by_name (regcache, "orig_eax",
|
||||
((char *) buf) + ORIG_EAX * 4);
|
||||
((char *) buf) + ORIG_EAX * REGSIZE);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user