/* Target-dependent code for GNU/Linux x86-64.
- Copyright (C) 2001-2017 Free Software Foundation, Inc.
+ Copyright (C) 2001-2020 Free Software Foundation, Inc.
Contributed by Jiri Smid, SuSE Labs.
This file is part of GDB.
#include "amd64-linux-tdep.h"
#include "i386-linux-tdep.h"
#include "linux-tdep.h"
-#include "x86-xstate.h"
+#include "gdbsupport/x86-xstate.h"
#include "amd64-tdep.h"
#include "solib-svr4.h"
#include "xml-syscall.h"
#include "glibc-tdep.h"
+#include "arch/amd64.h"
#include "target-descriptions.h"
-#include "features/i386/64bit-avx.c"
-#include "features/i386/64bit-avx512.c"
-#include "features/i386/64bit-core.c"
-#include "features/i386/64bit-linux.c"
-#include "features/i386/64bit-mpx.c"
-#include "features/i386/64bit-pkeys.c"
-#include "features/i386/64bit-segments.c"
-#include "features/i386/64bit-sse.c"
-
-#include "features/i386/x32-core.c"
-
/* The syscall's XML filename for i386. */
#define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml"
static LONGEST
amd64_linux_get_syscall_number (struct gdbarch *gdbarch,
- ptid_t ptid)
+ thread_info *thread)
{
- struct regcache *regcache = get_thread_regcache (ptid);
+ struct regcache *regcache = get_thread_regcache (thread);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
/* The content of a register. */
gdb_byte buf[8];
/* Getting the system call number from the register.
When dealing with x86_64 architecture, this information
is stored at %rax register. */
- regcache_cooked_read (regcache, AMD64_LINUX_ORIG_RAX_REGNUM, buf);
+ regcache->cooked_read (AMD64_LINUX_ORIG_RAX_REGNUM, buf);
ret = extract_signed_integer (buf, 8, byte_order);
static enum gdb_syscall
amd64_canonicalize_syscall (enum amd64_syscall syscall_number)
{
+ DIAGNOSTIC_PUSH
+ DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES
+
switch (syscall_number) {
case amd64_sys_read:
case amd64_x32_sys_read:
default:
return gdb_sys_no_syscall;
}
+
+ DIAGNOSTIC_POP
}
/* Parse the arguments of current system call instruction and record
}
if (*tdesc == NULL)
- {
- *tdesc = allocate_target_description ();
-
- set_tdesc_architecture (*tdesc,
- is_x32 ? "i386:x64-32" : "i386:x86-64");
-
- set_tdesc_osabi (*tdesc, osabi_from_tdesc_string ("GNU/Linux"));
-
- long regnum = 0;
-
- if (is_x32)
- regnum = create_feature_i386_x32_core (*tdesc, regnum);
- else
- regnum = create_feature_i386_64bit_core (*tdesc, regnum);
-
- regnum = create_feature_i386_64bit_sse (*tdesc, regnum);
- regnum = create_feature_i386_64bit_linux (*tdesc, regnum);
- regnum = create_feature_i386_64bit_segments (*tdesc, regnum);
-
- if (xcr0_features_bit & X86_XSTATE_AVX)
- regnum = create_feature_i386_64bit_avx (*tdesc, regnum);
-
- if ((xcr0_features_bit & X86_XSTATE_MPX) && !is_x32)
- regnum = create_feature_i386_64bit_mpx (*tdesc, regnum);
-
- if (xcr0_features_bit & X86_XSTATE_AVX512)
- regnum = create_feature_i386_64bit_avx512 (*tdesc, regnum);
-
- if ((xcr0_features_bit & X86_XSTATE_PKRU) && !is_x32)
- regnum = create_feature_i386_64bit_pkeys (*tdesc, regnum);
- }
+ *tdesc = amd64_create_target_description (xcr0_features_bit, is_x32,
+ true, true);
return *tdesc;
}
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
- cb (".reg", 27 * 8, &i386_gregset, NULL, cb_data);
- cb (".reg2", 512, &amd64_fpregset, NULL, cb_data);
- cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0),
+ cb (".reg", 27 * 8, 27 * 8, &i386_gregset, NULL, cb_data);
+ cb (".reg2", 512, 512, &amd64_fpregset, NULL, cb_data);
+ cb (".reg-xstate", X86_XSTATE_SIZE (tdep->xcr0), X86_XSTATE_SIZE (tdep->xcr0),
&amd64_linux_xstateregset, "XSAVE extended state", cb_data);
}
static void
amd64_dtrace_parse_probe_argument (struct gdbarch *gdbarch,
- struct parser_state *pstate,
+ struct expr_builder *builder,
int narg)
{
struct stoken str;
int regno = arg_reg_map[narg];
const char *regname = user_reg_map_regnum_to_name (gdbarch, regno);
- write_exp_elt_opcode (pstate, OP_REGISTER);
+ write_exp_elt_opcode (builder, OP_REGISTER);
str.ptr = regname;
str.length = strlen (regname);
- write_exp_string (pstate, str);
- write_exp_elt_opcode (pstate, OP_REGISTER);
+ write_exp_string (builder, str);
+ write_exp_elt_opcode (builder, OP_REGISTER);
}
else
{
const char *regname = user_reg_map_regnum_to_name (gdbarch, AMD64_RSP_REGNUM);
/* Displacement. */
- write_exp_elt_opcode (pstate, OP_LONG);
- write_exp_elt_type (pstate, builtin_type (gdbarch)->builtin_long);
- write_exp_elt_longcst (pstate, narg - 6);
- write_exp_elt_opcode (pstate, OP_LONG);
+ write_exp_elt_opcode (builder, OP_LONG);
+ write_exp_elt_type (builder, builtin_type (gdbarch)->builtin_long);
+ write_exp_elt_longcst (builder, narg - 6);
+ write_exp_elt_opcode (builder, OP_LONG);
/* Register: SP. */
- write_exp_elt_opcode (pstate, OP_REGISTER);
+ write_exp_elt_opcode (builder, OP_REGISTER);
str.ptr = regname;
str.length = strlen (regname);
- write_exp_string (pstate, str);
- write_exp_elt_opcode (pstate, OP_REGISTER);
+ write_exp_string (builder, str);
+ write_exp_elt_opcode (builder, OP_REGISTER);
- write_exp_elt_opcode (pstate, BINOP_ADD);
+ write_exp_elt_opcode (builder, BINOP_ADD);
/* Cast to long. */
- write_exp_elt_opcode (pstate, UNOP_CAST);
- write_exp_elt_type (pstate,
+ write_exp_elt_opcode (builder, UNOP_CAST);
+ write_exp_elt_type (builder,
lookup_pointer_type (builtin_type (gdbarch)->builtin_long));
- write_exp_elt_opcode (pstate, UNOP_CAST);
+ write_exp_elt_opcode (builder, UNOP_CAST);
- write_exp_elt_opcode (pstate, UNOP_IND);
+ write_exp_elt_opcode (builder, UNOP_IND);
}
}
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
}
-\f
-
-/* Provide a prototype to silence -Wmissing-prototypes. */
-extern void _initialize_amd64_linux_tdep (void);
void
_initialize_amd64_linux_tdep (void)
GDB_OSABI_LINUX, amd64_linux_init_abi);
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x64_32,
GDB_OSABI_LINUX, amd64_x32_linux_init_abi);
-
-#if GDB_SELF_TEST
- struct
- {
- const char *xml;
- uint64_t mask;
- } xml_masks[] = {
- { "i386/amd64-linux.xml", X86_XSTATE_SSE_MASK },
- { "i386/amd64-avx-linux.xml", X86_XSTATE_AVX_MASK },
- { "i386/amd64-mpx-linux.xml", X86_XSTATE_MPX_MASK },
- { "i386/amd64-avx-mpx-linux.xml", X86_XSTATE_AVX_MPX_MASK },
- { "i386/amd64-avx-avx512-linux.xml", X86_XSTATE_AVX_AVX512_MASK },
- { "i386/amd64-avx-mpx-avx512-pku-linux.xml",
- X86_XSTATE_AVX_MPX_AVX512_PKU_MASK },
- { "i386/x32-linux.xml", X86_XSTATE_SSE_MASK },
- { "i386/x32-avx-linux.xml", X86_XSTATE_AVX_MASK },
- { "i386/x32-avx-avx512-linux.xml", X86_XSTATE_AVX_AVX512_MASK },
- };
-
- for (auto &a : xml_masks)
- {
- auto tdesc = amd64_linux_read_description (a.mask,
- startswith (a.xml,
- "i386/x32"));
-
- selftests::record_xml_tdesc (a.xml, tdesc);
- }
-#endif /* GDB_SELF_TEST */
}