2017-09-05 16:54:53 +08:00
|
|
|
/* GNU/Linux/x86-64 specific target description, for the remote server
|
|
|
|
for GDB.
|
2022-01-01 22:56:03 +08:00
|
|
|
Copyright (C) 2017-2022 Free Software Foundation, Inc.
|
2017-09-05 16:54:53 +08:00
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#include "server.h"
|
|
|
|
#include "tdesc.h"
|
|
|
|
#include "linux-x86-tdesc.h"
|
2017-09-05 16:54:53 +08:00
|
|
|
#include "arch/i386.h"
|
Rename common to gdbsupport
This is the next patch in the ongoing series to move gdbsever to the
top level.
This patch just renames the "common" directory. The idea is to do
this move in two parts: first rename the directory (this patch), then
move the directory to the top. This approach makes the patches a bit
more tractable.
I chose the name "gdbsupport" for the directory. However, as this
patch was largely written by sed, we could pick a new name without too
much difficulty.
Tested by the buildbot.
gdb/ChangeLog
2019-07-09 Tom Tromey <tom@tromey.com>
* contrib/ari/gdb_ari.sh: Change common to gdbsupport.
* configure: Rebuild.
* configure.ac: Change common to gdbsupport.
* gdbsupport: Rename from common.
* acinclude.m4: Change common to gdbsupport.
* Makefile.in (CONFIG_SRC_SUBDIR, COMMON_SFILES)
(HFILES_NO_SRCDIR, stamp-version, ALLDEPFILES): Change common to
gdbsupport.
* aarch64-tdep.c, ada-lang.c, ada-lang.h, agent.c, alloc.c,
amd64-darwin-tdep.c, amd64-dicos-tdep.c, amd64-fbsd-nat.c,
amd64-fbsd-tdep.c, amd64-linux-nat.c, amd64-linux-tdep.c,
amd64-nbsd-tdep.c, amd64-obsd-tdep.c, amd64-sol2-tdep.c,
amd64-tdep.c, amd64-windows-tdep.c, arch-utils.c,
arch/aarch64-insn.c, arch/aarch64.c, arch/aarch64.h, arch/amd64.c,
arch/amd64.h, arch/arm-get-next-pcs.c, arch/arm-linux.c,
arch/arm.c, arch/i386.c, arch/i386.h, arch/ppc-linux-common.c,
arch/riscv.c, arch/riscv.h, arch/tic6x.c, arm-tdep.c, auto-load.c,
auxv.c, ax-gdb.c, ax-general.c, ax.h, breakpoint.c, breakpoint.h,
btrace.c, btrace.h, build-id.c, build-id.h, c-lang.h, charset.c,
charset.h, cli/cli-cmds.c, cli/cli-cmds.h, cli/cli-decode.c,
cli/cli-dump.c, cli/cli-option.h, cli/cli-script.c,
coff-pe-read.c, command.h, compile/compile-c-support.c,
compile/compile-c.h, compile/compile-cplus-symbols.c,
compile/compile-cplus-types.c, compile/compile-cplus.h,
compile/compile-loc2c.c, compile/compile.c, completer.c,
completer.h, contrib/ari/gdb_ari.sh, corefile.c, corelow.c,
cp-support.c, cp-support.h, cp-valprint.c, csky-tdep.c, ctf.c,
darwin-nat.c, debug.c, defs.h, disasm-selftests.c, disasm.c,
disasm.h, dtrace-probe.c, dwarf-index-cache.c,
dwarf-index-cache.h, dwarf-index-write.c, dwarf2-frame.c,
dwarf2expr.c, dwarf2loc.c, dwarf2read.c, event-loop.c,
event-top.c, exceptions.c, exec.c, extension.h, fbsd-nat.c,
features/aarch64-core.c, features/aarch64-fpu.c,
features/aarch64-pauth.c, features/aarch64-sve.c,
features/i386/32bit-avx.c, features/i386/32bit-avx512.c,
features/i386/32bit-core.c, features/i386/32bit-linux.c,
features/i386/32bit-mpx.c, features/i386/32bit-pkeys.c,
features/i386/32bit-segments.c, features/i386/32bit-sse.c,
features/i386/64bit-avx.c, features/i386/64bit-avx512.c,
features/i386/64bit-core.c, features/i386/64bit-linux.c,
features/i386/64bit-mpx.c, features/i386/64bit-pkeys.c,
features/i386/64bit-segments.c, features/i386/64bit-sse.c,
features/i386/x32-core.c, features/riscv/32bit-cpu.c,
features/riscv/32bit-csr.c, features/riscv/32bit-fpu.c,
features/riscv/64bit-cpu.c, features/riscv/64bit-csr.c,
features/riscv/64bit-fpu.c, features/tic6x-c6xp.c,
features/tic6x-core.c, features/tic6x-gp.c, filename-seen-cache.h,
findcmd.c, findvar.c, fork-child.c, gcore.c, gdb_bfd.c, gdb_bfd.h,
gdb_proc_service.h, gdb_regex.c, gdb_select.h, gdb_usleep.c,
gdbarch-selftests.c, gdbthread.h, gdbtypes.h, gnu-nat.c,
go32-nat.c, guile/guile.c, guile/scm-ports.c,
guile/scm-safe-call.c, guile/scm-type.c, i386-fbsd-nat.c,
i386-fbsd-tdep.c, i386-go32-tdep.c, i386-linux-nat.c,
i386-linux-tdep.c, i386-tdep.c, i387-tdep.c,
ia64-libunwind-tdep.c, ia64-linux-nat.c, inf-child.c,
inf-ptrace.c, infcall.c, infcall.h, infcmd.c, inferior-iter.h,
inferior.c, inferior.h, inflow.c, inflow.h, infrun.c, infrun.h,
inline-frame.c, language.h, linespec.c, linux-fork.c, linux-nat.c,
linux-tdep.c, linux-thread-db.c, location.c, machoread.c,
macrotab.h, main.c, maint.c, maint.h, memattr.c, memrange.h,
mi/mi-cmd-break.h, mi/mi-cmd-env.c, mi/mi-cmd-stack.c,
mi/mi-cmd-var.c, mi/mi-interp.c, mi/mi-main.c, mi/mi-parse.h,
minsyms.c, mips-linux-tdep.c, namespace.h,
nat/aarch64-linux-hw-point.c, nat/aarch64-linux-hw-point.h,
nat/aarch64-linux.c, nat/aarch64-sve-linux-ptrace.c,
nat/amd64-linux-siginfo.c, nat/fork-inferior.c,
nat/linux-btrace.c, nat/linux-btrace.h, nat/linux-namespaces.c,
nat/linux-nat.h, nat/linux-osdata.c, nat/linux-personality.c,
nat/linux-procfs.c, nat/linux-ptrace.c, nat/linux-ptrace.h,
nat/linux-waitpid.c, nat/mips-linux-watch.c,
nat/mips-linux-watch.h, nat/ppc-linux.c, nat/x86-dregs.c,
nat/x86-dregs.h, nat/x86-linux-dregs.c, nat/x86-linux.c,
nto-procfs.c, nto-tdep.c, objfile-flags.h, objfiles.c, objfiles.h,
obsd-nat.c, observable.h, osdata.c, p-valprint.c, parse.c,
parser-defs.h, ppc-linux-nat.c, printcmd.c, probe.c, proc-api.c,
procfs.c, producer.c, progspace.h, psymtab.h,
python/py-framefilter.c, python/py-inferior.c, python/py-ref.h,
python/py-type.c, python/python.c, record-btrace.c, record-full.c,
record.c, record.h, regcache-dump.c, regcache.c, regcache.h,
remote-fileio.c, remote-fileio.h, remote-sim.c, remote.c,
riscv-tdep.c, rs6000-aix-tdep.c, rust-exp.y, s12z-tdep.c,
selftest-arch.c, ser-base.c, ser-event.c, ser-pipe.c, ser-tcp.c,
ser-unix.c, skip.c, solib-aix.c, solib-target.c, solib.c,
source-cache.c, source.c, source.h, sparc-nat.c, spu-linux-nat.c,
stack.c, stap-probe.c, symfile-add-flags.h, symfile.c, symfile.h,
symtab.c, symtab.h, target-descriptions.c, target-descriptions.h,
target-memory.c, target.c, target.h, target/waitstatus.c,
target/waitstatus.h, thread-iter.h, thread.c, tilegx-tdep.c,
top.c, top.h, tracefile-tfile.c, tracefile.c, tracepoint.c,
tracepoint.h, tui/tui-io.c, ui-file.c, ui-out.h,
unittests/array-view-selftests.c,
unittests/child-path-selftests.c, unittests/cli-utils-selftests.c,
unittests/common-utils-selftests.c,
unittests/copy_bitwise-selftests.c, unittests/environ-selftests.c,
unittests/format_pieces-selftests.c,
unittests/function-view-selftests.c,
unittests/lookup_name_info-selftests.c,
unittests/memory-map-selftests.c, unittests/memrange-selftests.c,
unittests/mkdir-recursive-selftests.c,
unittests/observable-selftests.c,
unittests/offset-type-selftests.c, unittests/optional-selftests.c,
unittests/parse-connection-spec-selftests.c,
unittests/ptid-selftests.c, unittests/rsp-low-selftests.c,
unittests/scoped_fd-selftests.c,
unittests/scoped_mmap-selftests.c,
unittests/scoped_restore-selftests.c,
unittests/string_view-selftests.c, unittests/style-selftests.c,
unittests/tracepoint-selftests.c, unittests/unpack-selftests.c,
unittests/utils-selftests.c, unittests/xml-utils-selftests.c,
utils.c, utils.h, valarith.c, valops.c, valprint.c, value.c,
value.h, varobj.c, varobj.h, windows-nat.c, x86-linux-nat.c,
xml-support.c, xml-support.h, xml-tdesc.h, xstormy16-tdep.c,
xtensa-linux-nat.c, dwarf2read.h: Change common to gdbsupport.
gdb/gdbserver/ChangeLog
2019-07-09 Tom Tromey <tom@tromey.com>
* configure: Rebuild.
* configure.ac: Change common to gdbsupport.
* acinclude.m4: Change common to gdbsupport.
* Makefile.in (SFILES, OBS, GDBREPLAY_OBS, IPA_OBJS)
(version-generated.c, gdbsupport/%-ipa.o, gdbsupport/%.o): Change
common to gdbsupport.
* ax.c, event-loop.c, fork-child.c, gdb_proc_service.h,
gdbreplay.c, gdbthread.h, hostio-errno.c, hostio.c, i387-fp.c,
inferiors.c, inferiors.h, linux-aarch64-tdesc-selftest.c,
linux-amd64-ipa.c, linux-i386-ipa.c, linux-low.c,
linux-tic6x-low.c, linux-x86-low.c, linux-x86-tdesc-selftest.c,
linux-x86-tdesc.c, lynx-i386-low.c, lynx-low.c, mem-break.h,
nto-x86-low.c, regcache.c, regcache.h, remote-utils.c, server.c,
server.h, spu-low.c, symbol.c, target.h, tdesc.c, tdesc.h,
thread-db.c, tracepoint.c, win32-i386-low.c, win32-low.c: Change
common to gdbsupport.
2019-05-06 10:29:24 +08:00
|
|
|
#include "gdbsupport/x86-xstate.h"
|
2017-09-05 16:54:54 +08:00
|
|
|
#ifdef __x86_64__
|
|
|
|
#include "arch/amd64.h"
|
|
|
|
#endif
|
gdbserver/Windows: crash during connection establishment phase
On Windows, starting a new process with GDBserver seems to work,
in the sense that the program does get started, and GDBserver
confirms that it is listening for GDB to connect. However, as soon as
GDB establishes the connection with GDBserver, and starts discussing
with it, GDBserver crashes, with a SEGV.
This SEGV occurs in remote-utils.c::prepare_resume_reply...
| regp = current_target_desc ()->expedite_regs;
| [...]
| while (*regp)
... because, in our case, REGP is NULL.
This patches fixes the issues by adding a parameter to init_target_desc,
in order to make sure that we always provide the list of registers when
we initialize a target description.
gdb/ChangeLog:
PR server/23158:
* regformats/regdat.sh: Adjust script, following the addition
of the new expedite_regs parameter to init_target_desc.
gdb/gdbserver/ChangeLog:
PR server/23158:
* tdesc.h (init_target_desc) <expedite_regs>: New parameter.
* tdesc.c (init_target_desc) <expedite_regs>: New parameter.
Use it to set the expedite_regs field in the given tdesc.
* x86-tdesc.h: New file.
* linux-aarch64-tdesc.c (aarch64_linux_read_description):
Adjust following the addition of the new expedite_regs parameter
to init_target_desc.
* linux-tic6x-low.c (tic6x_read_description): Likewise.
* linux-x86-tdesc.c: #include "x86-tdesc.h".
(i386_linux_read_description, amd64_linux_read_description):
Adjust following the addition of the new expedite_regs parameter
to init_target_desc.
* lynx-i386-low.c: #include "x86-tdesc.h".
(lynx_i386_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
* nto-x86-low.c: #include "x86-tdesc.h".
(nto_x86_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
* win32-i386-low.c: #include "x86-tdesc.h".
(i386_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
2018-05-10 23:27:13 +08:00
|
|
|
#include "x86-tdesc.h"
|
2017-09-05 16:54:53 +08:00
|
|
|
|
2017-09-05 16:54:54 +08:00
|
|
|
/* Return the right x86_linux_tdesc index for a given XCR0. Return
|
|
|
|
X86_TDESC_LAST if can't find a match. */
|
2017-09-05 16:54:53 +08:00
|
|
|
|
2017-09-05 16:54:54 +08:00
|
|
|
static enum x86_linux_tdesc
|
|
|
|
xcr0_to_tdesc_idx (uint64_t xcr0, bool is_x32)
|
2017-09-05 16:54:53 +08:00
|
|
|
{
|
|
|
|
if (xcr0 & X86_XSTATE_PKRU)
|
2017-09-05 16:54:54 +08:00
|
|
|
{
|
|
|
|
if (is_x32)
|
|
|
|
{
|
|
|
|
/* No x32 MPX and PKU, fall back to avx_avx512. */
|
|
|
|
return X86_TDESC_AVX_AVX512;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return X86_TDESC_AVX_MPX_AVX512_PKU;
|
|
|
|
}
|
2017-09-05 16:54:53 +08:00
|
|
|
else if (xcr0 & X86_XSTATE_AVX512)
|
2017-09-05 16:54:54 +08:00
|
|
|
return X86_TDESC_AVX_AVX512;
|
2017-09-05 16:54:53 +08:00
|
|
|
else if ((xcr0 & X86_XSTATE_AVX_MPX_MASK) == X86_XSTATE_AVX_MPX_MASK)
|
2017-09-05 16:54:54 +08:00
|
|
|
{
|
|
|
|
if (is_x32) /* No MPX on x32. */
|
|
|
|
return X86_TDESC_AVX;
|
|
|
|
else
|
|
|
|
return X86_TDESC_AVX_MPX;
|
|
|
|
}
|
2017-09-05 16:54:53 +08:00
|
|
|
else if (xcr0 & X86_XSTATE_MPX)
|
2017-09-05 16:54:54 +08:00
|
|
|
{
|
|
|
|
if (is_x32) /* No MPX on x32. */
|
|
|
|
return X86_TDESC_AVX;
|
|
|
|
else
|
|
|
|
return X86_TDESC_MPX;
|
|
|
|
}
|
2017-09-05 16:54:53 +08:00
|
|
|
else if (xcr0 & X86_XSTATE_AVX)
|
2017-09-05 16:54:54 +08:00
|
|
|
return X86_TDESC_AVX;
|
2017-09-05 16:54:53 +08:00
|
|
|
else if (xcr0 & X86_XSTATE_SSE)
|
2017-09-05 16:54:54 +08:00
|
|
|
return X86_TDESC_SSE;
|
2017-09-05 16:54:53 +08:00
|
|
|
else if (xcr0 & X86_XSTATE_X87)
|
2017-09-05 16:54:54 +08:00
|
|
|
return X86_TDESC_MMX;
|
|
|
|
else
|
|
|
|
return X86_TDESC_LAST;
|
|
|
|
}
|
2017-09-05 16:54:53 +08:00
|
|
|
|
2017-09-05 16:54:54 +08:00
|
|
|
#if defined __i386__ || !defined IN_PROCESS_AGENT
|
|
|
|
|
2018-07-09 02:09:22 +08:00
|
|
|
static struct target_desc *i386_tdescs[X86_TDESC_LAST] = { };
|
|
|
|
|
2017-09-05 16:54:54 +08:00
|
|
|
/* Return the target description according to XCR0. */
|
|
|
|
|
|
|
|
const struct target_desc *
|
|
|
|
i386_linux_read_description (uint64_t xcr0)
|
|
|
|
{
|
|
|
|
enum x86_linux_tdesc idx = xcr0_to_tdesc_idx (xcr0, false);
|
|
|
|
|
|
|
|
if (idx == X86_TDESC_LAST)
|
2017-09-05 16:54:53 +08:00
|
|
|
return NULL;
|
|
|
|
|
2017-09-05 16:54:54 +08:00
|
|
|
struct target_desc **tdesc = &i386_tdescs[idx];
|
|
|
|
|
2017-09-05 16:54:53 +08:00
|
|
|
if (*tdesc == NULL)
|
|
|
|
{
|
2019-03-13 04:39:02 +08:00
|
|
|
*tdesc = i386_create_target_description (xcr0, true, false);
|
2017-09-05 16:54:53 +08:00
|
|
|
|
gdbserver/Windows: crash during connection establishment phase
On Windows, starting a new process with GDBserver seems to work,
in the sense that the program does get started, and GDBserver
confirms that it is listening for GDB to connect. However, as soon as
GDB establishes the connection with GDBserver, and starts discussing
with it, GDBserver crashes, with a SEGV.
This SEGV occurs in remote-utils.c::prepare_resume_reply...
| regp = current_target_desc ()->expedite_regs;
| [...]
| while (*regp)
... because, in our case, REGP is NULL.
This patches fixes the issues by adding a parameter to init_target_desc,
in order to make sure that we always provide the list of registers when
we initialize a target description.
gdb/ChangeLog:
PR server/23158:
* regformats/regdat.sh: Adjust script, following the addition
of the new expedite_regs parameter to init_target_desc.
gdb/gdbserver/ChangeLog:
PR server/23158:
* tdesc.h (init_target_desc) <expedite_regs>: New parameter.
* tdesc.c (init_target_desc) <expedite_regs>: New parameter.
Use it to set the expedite_regs field in the given tdesc.
* x86-tdesc.h: New file.
* linux-aarch64-tdesc.c (aarch64_linux_read_description):
Adjust following the addition of the new expedite_regs parameter
to init_target_desc.
* linux-tic6x-low.c (tic6x_read_description): Likewise.
* linux-x86-tdesc.c: #include "x86-tdesc.h".
(i386_linux_read_description, amd64_linux_read_description):
Adjust following the addition of the new expedite_regs parameter
to init_target_desc.
* lynx-i386-low.c: #include "x86-tdesc.h".
(lynx_i386_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
* nto-x86-low.c: #include "x86-tdesc.h".
(nto_x86_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
* win32-i386-low.c: #include "x86-tdesc.h".
(i386_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
2018-05-10 23:27:13 +08:00
|
|
|
init_target_desc (*tdesc, i386_expedite_regs);
|
2017-09-05 16:54:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return *tdesc;;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2017-09-05 16:54:54 +08:00
|
|
|
#ifdef __x86_64__
|
|
|
|
|
|
|
|
static target_desc *amd64_tdescs[X86_TDESC_LAST] = { };
|
|
|
|
static target_desc *x32_tdescs[X86_TDESC_LAST] = { };
|
|
|
|
|
|
|
|
const struct target_desc *
|
|
|
|
amd64_linux_read_description (uint64_t xcr0, bool is_x32)
|
|
|
|
{
|
|
|
|
enum x86_linux_tdesc idx = xcr0_to_tdesc_idx (xcr0, is_x32);
|
|
|
|
|
|
|
|
if (idx == X86_TDESC_LAST)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
struct target_desc **tdesc = NULL;
|
|
|
|
|
|
|
|
if (is_x32)
|
|
|
|
tdesc = &x32_tdescs[idx];
|
|
|
|
else
|
|
|
|
tdesc = &amd64_tdescs[idx];
|
|
|
|
|
|
|
|
if (*tdesc == NULL)
|
|
|
|
{
|
Add missing parameter to 'amd64_create_target_description' (and unbreak build)
While building gdbserver on GNU/Linux, the build failed with:
../../../binutils-gdb/gdb/gdbserver/linux-x86-tdesc.c: In function ‘const target_desc* amd64_linux_read_description(uint64_t, bool)’:
../../../binutils-gdb/gdb/gdbserver/linux-x86-tdesc.c:121:67: error: too few arguments to function ‘target_desc* amd64_create_target_description(uint64_t, bool, bool, bool)’
*tdesc = amd64_create_target_description (xcr0, is_x32, true);
^
In file included from ../../../binutils-gdb/gdb/gdbserver/linux-x86-tdesc.c:26:0:
../../../binutils-gdb/gdb/gdbserver/../arch/amd64.h:21:14: note: declared here
target_desc *amd64_create_target_description (uint64_t xcr0, bool is_x32,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
According to Joel Brobecker:
> I think the parameter should be set to "true". Otherwise, it will
> not include the fs_base and gs_base register in the list of registers.
> Although the name of the source file says x86, the code itself is
> protected by...
>
> #ifdef __x86_64__
>
> ... and is inside a function called amd64_linux_read_description.
> I also verified that this file gets compiled on amd64-linux platforms.
> See gdb/gdbserver/configure.srv:
>
> x86_64-*-linux*) srv_regobj="$srv_amd64_linux_regobj $srv_i386_linux_regobj"
>
> The last piece of confirmation is that setting the parameter to "true"
> provides the behavior before the parameter was added; and the reason
> for adding the parameter was to remove the {fs,gs}_base registers
> from the list for Windows only.
Therefore I'm pushing the patch to unbreak the build.
gdb/gdbserver/ChangeLog:
2018-06-29 Joel Brobecker <brobecker@adacore.com>
* linux-x86-tdesc.c (amd64_linux_read_description): Add missing
parameter in call to 'amd64_create_target_description'.
2018-06-30 09:36:42 +08:00
|
|
|
*tdesc = amd64_create_target_description (xcr0, is_x32, true, true);
|
2017-09-05 16:54:54 +08:00
|
|
|
|
gdbserver/Windows: crash during connection establishment phase
On Windows, starting a new process with GDBserver seems to work,
in the sense that the program does get started, and GDBserver
confirms that it is listening for GDB to connect. However, as soon as
GDB establishes the connection with GDBserver, and starts discussing
with it, GDBserver crashes, with a SEGV.
This SEGV occurs in remote-utils.c::prepare_resume_reply...
| regp = current_target_desc ()->expedite_regs;
| [...]
| while (*regp)
... because, in our case, REGP is NULL.
This patches fixes the issues by adding a parameter to init_target_desc,
in order to make sure that we always provide the list of registers when
we initialize a target description.
gdb/ChangeLog:
PR server/23158:
* regformats/regdat.sh: Adjust script, following the addition
of the new expedite_regs parameter to init_target_desc.
gdb/gdbserver/ChangeLog:
PR server/23158:
* tdesc.h (init_target_desc) <expedite_regs>: New parameter.
* tdesc.c (init_target_desc) <expedite_regs>: New parameter.
Use it to set the expedite_regs field in the given tdesc.
* x86-tdesc.h: New file.
* linux-aarch64-tdesc.c (aarch64_linux_read_description):
Adjust following the addition of the new expedite_regs parameter
to init_target_desc.
* linux-tic6x-low.c (tic6x_read_description): Likewise.
* linux-x86-tdesc.c: #include "x86-tdesc.h".
(i386_linux_read_description, amd64_linux_read_description):
Adjust following the addition of the new expedite_regs parameter
to init_target_desc.
* lynx-i386-low.c: #include "x86-tdesc.h".
(lynx_i386_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
* nto-x86-low.c: #include "x86-tdesc.h".
(nto_x86_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
* win32-i386-low.c: #include "x86-tdesc.h".
(i386_arch_setup): Adjust following the addition of the new
expedite_regs parameter to init_target_desc.
2018-05-10 23:27:13 +08:00
|
|
|
init_target_desc (*tdesc, amd64_expedite_regs);
|
2017-09-05 16:54:54 +08:00
|
|
|
}
|
|
|
|
return *tdesc;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2017-09-05 16:54:53 +08:00
|
|
|
#ifndef IN_PROCESS_AGENT
|
2017-09-05 16:54:54 +08:00
|
|
|
|
2017-09-05 16:54:53 +08:00
|
|
|
int
|
|
|
|
i386_get_ipa_tdesc_idx (const struct target_desc *tdesc)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < X86_TDESC_LAST; i++)
|
|
|
|
{
|
|
|
|
if (tdesc == i386_tdescs[i])
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If none tdesc is found, return the one with minimum features. */
|
|
|
|
return X86_TDESC_MMX;
|
|
|
|
}
|
|
|
|
|
2017-09-05 16:54:54 +08:00
|
|
|
#if defined __x86_64__
|
|
|
|
int
|
|
|
|
amd64_get_ipa_tdesc_idx (const struct target_desc *tdesc)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < X86_TDESC_LAST; i++)
|
|
|
|
{
|
|
|
|
if (tdesc == amd64_tdescs[i])
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
for (int i = 0; i < X86_TDESC_LAST; i++)
|
|
|
|
{
|
|
|
|
if (tdesc == x32_tdescs[i])
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
return X86_TDESC_SSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
2017-09-05 16:54:53 +08:00
|
|
|
#endif
|