X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-x86-low.c;h=cafff6b109bea9fedeaab6fb59b65e4e21b451f0;hb=4196ab2a6d348f76c0e5e78252e44d9c631636d2;hp=f11c5664b4a9415732424c86a8f0a2c56fc0e4e3;hpb=9179355e655d78cf44ffdfb432e134eabceaebab;p=thirdparty%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c index f11c5664b4a..cafff6b109b 100644 --- a/gdb/gdbserver/linux-x86-low.c +++ b/gdb/gdbserver/linux-x86-low.c @@ -1,6 +1,6 @@ /* GNU/Linux/x86-64 specific low level interface, for the remote server for GDB. - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -24,7 +24,7 @@ #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__ @@ -38,7 +38,7 @@ #include "elf/common.h" #endif -#include "agent.h" +#include "gdbsupport/agent.h" #include "tdesc.h" #include "tracepoint.h" #include "ax.h" @@ -72,7 +72,6 @@ static const char *xmltarget_amd64_linux_no_xml = "@\ #include #include -#include "nat/gdb_ptrace.h" #include #ifndef PTRACE_GET_THREAD_AREA @@ -255,7 +254,7 @@ x86_get_thread_area (int lwpid, CORE_ADDR *addr) #endif { - struct lwp_info *lwp = find_lwp_pid (pid_to_ptid (lwpid)); + struct lwp_info *lwp = find_lwp_pid (ptid_t (lwpid)); struct thread_info *thr = get_lwp_thread (lwp); struct regcache *regcache = get_thread_regcache (thr, 1); unsigned int desc[4]; @@ -339,6 +338,21 @@ x86_fill_gregset (struct regcache *regcache, void *buf) 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 @@ -993,7 +1007,7 @@ x86_supports_tracepoints (void) static void append_insns (CORE_ADDR *to, size_t len, const unsigned char *buf) { - write_inferior_memory (*to, buf, len); + target_write_memory (*to, buf, len); *to += len; } @@ -1371,7 +1385,7 @@ i386_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint, CORE_ADDR tpaddr, offset = *jump_entry - (*trampoline + sizeof (jump_insn)); memcpy (buf, jump_insn, sizeof (jump_insn)); memcpy (buf + 1, &offset, 4); - write_inferior_memory (*trampoline, buf, sizeof (jump_insn)); + target_write_memory (*trampoline, buf, sizeof (jump_insn)); /* Use a 16-bit relative jump instruction to jump to the trampoline. */ offset = (*trampoline - (tpaddr + sizeof (small_jump_insn))) & 0xffff; @@ -1467,7 +1481,7 @@ x86_get_min_fast_tracepoint_insn_len (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; @@ -1766,7 +1780,7 @@ amd64_write_goto_address (CORE_ADDR from, CORE_ADDR to, int size) } memcpy (buf, &diff, sizeof (int)); - write_inferior_memory (from, buf, sizeof (int)); + target_write_memory (from, buf, sizeof (int)); } static void @@ -2384,7 +2398,7 @@ i386_write_goto_address (CORE_ADDR from, CORE_ADDR to, int size) } memcpy (buf, &diff, sizeof (int)); - write_inferior_memory (from, buf, sizeof (int)); + target_write_memory (from, buf, sizeof (int)); } static void @@ -2897,10 +2911,6 @@ initialize_low_arch (void) 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));