static const struct target_desc * i386fbsd_read_description (struct target_ops *ops) { static int xsave_probed; static uint64_t xcr0; 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) { return i386_target_description (xcr0); } else return tdesc_i386; }
static const struct target_desc * i386fbsd_core_read_description (struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd) { return i386_target_description (i386fbsd_core_read_xcr0 (abfd)); }
static const struct target_desc * amd64fbsd_read_description (struct target_ops *ops) { #ifdef PT_GETXSTATE_INFO static int xsave_probed; static uint64_t xcr0; #endif 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) { amd64bsd_xsave_len = info.xsave_len; xcr0 = info.xsave_mask; } xsave_probed = 1; } if (amd64bsd_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; }