#include "linux-low.h"
#include "i387-fp.h"
#include "x86-low.h"
-#include "x86-xstate.h"
+#include "gdbsupport/x86-xstate.h"
#include "nat/gdb_ptrace.h"
#ifdef __x86_64__
#include "elf/common.h"
#endif
-#include "agent.h"
+#include "gdbsupport/agent.h"
#include "tdesc.h"
#include "tracepoint.h"
#include "ax.h"
collect_register_by_name (regcache, "orig_eax",
((char *) buf) + ORIG_EAX * REGSIZE);
+
+#ifdef __x86_64__
+ /* Sign extend EAX value to avoid potential syscall restart
+ problems.
+
+ See amd64_linux_collect_native_gregset() in gdb/amd64-linux-nat.c
+ for a detailed explanation. */
+ if (register_size (regcache->tdesc, 0) == 4)
+ {
+ void *ptr = ((gdb_byte *) buf
+ + i386_regmap[find_regno (regcache->tdesc, "eax")]);
+
+ *(int64_t *) ptr = *(int32_t *) ptr;
+ }
+#endif
}
static void
mention that something has gone awry. */
if (!warned_about_fast_tracepoints)
{
- warning ("4-byte fast tracepoints not available; %s\n", errbuf);
+ warning ("4-byte fast tracepoints not available; %s", errbuf);
warned_about_fast_tracepoints = 1;
}
return 5;
tdesc_amd64_linux_no_xml->xmltarget = xmltarget_amd64_linux_no_xml;
#endif
-#if GDB_SELF_TEST
- initialize_low_tdesc ();
-#endif
-
tdesc_i386_linux_no_xml = allocate_target_description ();
copy_target_description (tdesc_i386_linux_no_xml,
i386_linux_read_description (X86_XSTATE_SSE_MASK));