/* Native-dependent code for FreeBSD/amd64.
- Copyright (C) 2003-2015 Free Software Foundation, Inc.
+ Copyright (C) 2003-2016 Free Software Foundation, Inc.
This file is part of GDB.
#include "fbsd-nat.h"
#include "amd64-tdep.h"
#include "amd64-nat.h"
-#include "amd64bsd-nat.h"
+#include "x86bsd-nat.h"
#include "x86-nat.h"
\f
}
\f
-static void (*super_mourn_inferior) (struct target_ops *ops);
+/* Implement the to_read_description method. */
-static void
-amd64fbsd_mourn_inferior (struct target_ops *ops)
+static const struct target_desc *
+amd64fbsd_read_description (struct target_ops *ops)
{
-#ifdef HAVE_PT_GETDBREGS
- x86_cleanup_dregs ();
+#ifdef PT_GETXSTATE_INFO
+ static int xsave_probed;
+ static uint64_t xcr0;
#endif
- super_mourn_inferior (ops);
+ struct reg regs;
+ int is64;
+
+ if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) ®s, 0) == -1)
+ perror_with_name (_("Couldn't get registers"));
+ is64 = (regs.r_cs == GSEL (GUCODE_SEL, SEL_UPL));
+#ifdef PT_GETXSTATE_INFO
+ if (!xsave_probed)
+ {
+ struct ptrace_xstate_info info;
+
+ if (ptrace (PT_GETXSTATE_INFO, ptid_get_pid (inferior_ptid),
+ (PTRACE_TYPE_ARG3) &info, sizeof (info)) == 0)
+ {
+ x86bsd_xsave_len = info.xsave_len;
+ xcr0 = info.xsave_mask;
+ }
+ xsave_probed = 1;
+ }
+
+ if (x86bsd_xsave_len != 0)
+ {
+ if (is64)
+ return amd64_target_description (xcr0);
+ else
+ return i386_target_description (xcr0);
+ }
+#endif
+ if (is64)
+ return tdesc_amd64;
+ else
+ return tdesc_i386;
}
/* Provide a prototype to silence -Wmissing-prototypes. */
/* Add some extra features to the common *BSD/i386 target. */
t = amd64bsd_target ();
+ t->to_read_description = amd64fbsd_read_description;
-#ifdef HAVE_PT_GETDBREGS
-
- x86_use_watchpoints (t);
-
- x86_dr_low.set_control = amd64bsd_dr_set_control;
- x86_dr_low.set_addr = amd64bsd_dr_set_addr;
- x86_dr_low.get_addr = amd64bsd_dr_get_addr;
- x86_dr_low.get_status = amd64bsd_dr_get_status;
- x86_dr_low.get_control = amd64bsd_dr_get_control;
- x86_set_debug_register_length (8);
-
-#endif /* HAVE_PT_GETDBREGS */
-
- super_mourn_inferior = t->to_mourn_inferior;
- t->to_mourn_inferior = amd64fbsd_mourn_inferior;
-
- t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
- t->to_find_memory_regions = fbsd_find_memory_regions;
- add_target (t);
+ fbsd_nat_add_target (t);
/* Support debugging kernel virtual memory images. */
bsd_kvm_add_target (amd64fbsd_supply_pcb);