25 #include <sys/types.h>
26 #include <sys/ptrace.h>
27 #include <machine/reg.h>
28 #include <machine/frame.h>
42 #define REG_OFFSET(member) offsetof (struct reg, member)
63 #ifdef HAVE_STRUCT_REG_R_FS
68 #ifdef HAVE_STRUCT_REG_R_GS
76 #define GETREGS_SUPPLIES(regnum) \
77 ((0 <= (regnum) && (regnum) <= 15))
79 #ifdef HAVE_PT_GETXMMREGS
82 static int have_ptrace_xmmregs = -1;
85 #ifdef PT_GETXSTATE_INFO
95 const char *regs = gregs;
98 for (regnum = 0; regnum < ARRAY_SIZE (i386bsd_r_reg_offset); regnum++)
113 void *gregs,
int regnum)
118 for (i = 0; i < ARRAY_SIZE (i386bsd_r_reg_offset); i++)
120 if (regnum == -1 || regnum == i)
122 int offset = i386bsd_r_reg_offset[i];
153 #ifdef HAVE_PT_GETXMMREGS
157 #ifdef PT_GETXSTATE_INFO
158 if (i386bsd_xsave_len != 0)
162 xstateregs = alloca (i386bsd_xsave_len);
172 #ifdef HAVE_PT_GETXMMREGS
173 if (have_ptrace_xmmregs != 0
177 have_ptrace_xmmregs = 1;
182 have_ptrace_xmmregs = 0;
189 #ifdef HAVE_PT_GETXMMREGS
223 #ifdef HAVE_PT_GETXMMREGS
227 #ifdef PT_GETXSTATE_INFO
228 if (i386bsd_xsave_len != 0)
232 xstateregs = alloca (i386bsd_xsave_len);
246 #ifdef HAVE_PT_GETXMMREGS
247 if (have_ptrace_xmmregs != 0
251 have_ptrace_xmmregs = 1;
261 have_ptrace_xmmregs = 0;
272 #ifdef HAVE_PT_GETXMMREGS
295 #ifdef HAVE_PT_GETDBREGS
300 #define DBREG_DRX(d, x) ((&d->dr0)[x])
304 i386bsd_dr_get (
ptid_t ptid,
int regnum)
312 return DBREG_DRX ((&dbregs), regnum);
316 i386bsd_dr_set (
int regnum,
unsigned int value)
327 DBREG_DRX ((&dbregs), 7) &= ~(0x0000fc00);
329 DBREG_DRX ((&dbregs), regnum) = value;
339 i386bsd_dr_set (7, control);
347 i386bsd_dr_set (regnum, addr);
385 #if defined (__FreeBSD_version) && __FreeBSD_version >= 400011
386 #define SC_REG_OFFSET i386fbsd4_sc_reg_offset
387 #elif defined (__FreeBSD_version) && __FreeBSD_version >= 300005
388 #define SC_REG_OFFSET i386fbsd_sc_reg_offset
389 #elif defined (NetBSD) || defined (__NetBSD_Version__)
390 #define SC_REG_OFFSET i386nbsd_sc_reg_offset
391 #elif defined (OpenBSD)
392 #define SC_REG_OFFSET i386obsd_sc_reg_offset
403 #define SC_PC_OFFSET SC_REG_OFFSET[I386_EIP_REGNUM]
404 #define SC_SP_OFFSET SC_REG_OFFSET[I386_ESP_REGNUM]
405 #define SC_FP_OFFSET SC_REG_OFFSET[I386_EBP_REGNUM]
409 offset = offsetof (
struct sigcontext, sc_pc);
411 if (SC_PC_OFFSET != offset)
414 offsetof (struct sigcontext, sc_pc) yields %d instead of %d.\n\
415 Please report this to <bug-gdb@gnu.org>."),
416 offset, SC_PC_OFFSET);
422 offset = offsetof (
struct sigcontext, sc_sp);
424 if (SC_SP_OFFSET != offset)
427 offsetof (struct sigcontext, sc_sp) yields %d instead of %d.\n\
428 Please report this to <bug-gdb@gnu.org>."),
429 offset, SC_SP_OFFSET);
435 offset = offsetof (
struct sigcontext, sc_fp);
437 if (SC_FP_OFFSET != offset)
440 offsetof (struct sigcontext, sc_fp) yields %d instead of %d.\n\
441 Please report this to <bug-gdb@gnu.org>."),
442 offset, SC_FP_OFFSET);
struct target_ops * i386bsd_target(void)
void i387_collect_fsave(const struct regcache *regcache, int regnum, void *fsave)
#define GETREGS_SUPPLIES(regnum)
static void i386bsd_collect_gregset(const struct regcache *regcache, void *gregs, int regnum)
void warning(const char *fmt,...)
void i387_supply_fxsave(struct regcache *regcache, int regnum, const void *fxsave)
void _initialize_i386bsd_nat(void)
static void i386bsd_store_inferior_registers(struct target_ops *ops, struct regcache *regcache, int regnum)
void i387_supply_fsave(struct regcache *regcache, int regnum, const void *fsave)
struct target_ops * inf_ptrace_target(void)
static void i386bsd_fetch_inferior_registers(struct target_ops *ops, struct regcache *regcache, int regnum)
void i387_collect_fxsave(const struct regcache *regcache, int regnum, void *fxsave)
#define REG_OFFSET(member)
CORE_ADDR i386bsd_dr_get_addr(int regnum)
static int i386bsd_r_reg_offset[]
void i387_collect_xsave(const struct regcache *regcache, int regnum, void *xsave, int gcore)
int ptid_get_pid(ptid_t ptid)
void i386bsd_dr_set_control(unsigned long control)
void i386bsd_dr_set_addr(int regnum, CORE_ADDR addr)
void(* to_fetch_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_IGNORE()
void void void void void void void void void perror_with_name(const char *string) ATTRIBUTE_NORETURN
unsigned long i386bsd_dr_get_status(void)
void regcache_raw_supply(struct regcache *regcache, int regnum, const void *buf)
void regcache_raw_collect(const struct regcache *regcache, int regnum, void *buf)
void i387_supply_xsave(struct regcache *regcache, int regnum, const void *xsave)
unsigned long i386bsd_dr_get_control(void)
void(* to_store_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_NORETURN(noprocess())
static void i386bsd_supply_gregset(struct regcache *regcache, const void *gregs)