X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fi386bsd-nat.c;h=f5f4a0ff2fae0a1a4f07350ecb5faa980ac173f5;hb=945e0f82dad31db89a107b496532886fe215c011;hp=9bd1e6c675f42a2fb4a14238d9d99df3f4d6e9a0;hpb=dfd4cc6311a8cf56cd6f4e0249fc243cface5a7f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386bsd-nat.c b/gdb/i386bsd-nat.c index 9bd1e6c675..f5f4a0ff2f 100644 --- a/gdb/i386bsd-nat.c +++ b/gdb/i386bsd-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for modern i386 BSD's. - Copyright (C) 2000-2013 Free Software Foundation, Inc. + Copyright (C) 2000-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -21,9 +21,7 @@ #include "inferior.h" #include "regcache.h" -#include "gdb_assert.h" #include -#include #include #include #include @@ -83,6 +81,10 @@ static int i386bsd_r_reg_offset[] = so that we try PT_GETXMMREGS the first time around. */ static int have_ptrace_xmmregs = -1; #endif + +#ifdef PT_GETXSTATE_INFO +size_t i386bsd_xsave_len; +#endif /* Supply the general-purpose registers in GREGS, to REGCACHE. */ @@ -90,7 +92,7 @@ static int have_ptrace_xmmregs = -1; static void i386bsd_supply_gregset (struct regcache *regcache, const void *gregs) { - const char *regs = gregs; + const char *regs = (const char *) gregs; int regnum; for (regnum = 0; regnum < ARRAY_SIZE (i386bsd_r_reg_offset); regnum++) @@ -110,7 +112,7 @@ static void i386bsd_collect_gregset (const struct regcache *regcache, void *gregs, int regnum) { - char *regs = gregs; + char *regs = (char *) gregs; int i; for (i = 0; i < ARRAY_SIZE (i386bsd_r_reg_offset); i++) @@ -136,7 +138,7 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -150,9 +152,26 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, struct fpreg fpregs; #ifdef HAVE_PT_GETXMMREGS char xmmregs[512]; +#endif + +#ifdef PT_GETXSTATE_INFO + if (i386bsd_xsave_len != 0) + { + void *xstateregs; + + xstateregs = alloca (i386bsd_xsave_len); + if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) + perror_with_name (_("Couldn't get extended state status")); + i387_supply_xsave (regcache, -1, xstateregs); + return; + } +#endif + +#ifdef HAVE_PT_GETXMMREGS if (have_ptrace_xmmregs != 0 - && ptrace(PT_GETXMMREGS, ptid_get_pid (inferior_ptid), + && ptrace(PT_GETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == 0) { have_ptrace_xmmregs = 1; @@ -160,18 +179,15 @@ i386bsd_fetch_inferior_registers (struct target_ops *ops, } else { - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + have_ptrace_xmmregs = 0; +#endif + if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); i387_supply_fsave (regcache, -1, &fpregs); +#ifdef HAVE_PT_GETXMMREGS } -#else - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) - perror_with_name (_("Couldn't get floating point status")); - - i387_supply_fsave (regcache, -1, &fpregs); #endif } } @@ -187,13 +203,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops, { struct reg regs; - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); i386bsd_collect_gregset (regcache, ®s, regnum); - if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -206,16 +222,37 @@ i386bsd_store_inferior_registers (struct target_ops *ops, struct fpreg fpregs; #ifdef HAVE_PT_GETXMMREGS char xmmregs[512]; +#endif + +#ifdef PT_GETXSTATE_INFO + if (i386bsd_xsave_len != 0) + { + void *xstateregs; + + xstateregs = alloca (i386bsd_xsave_len); + if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) + perror_with_name (_("Couldn't get extended state status")); + i387_collect_xsave (regcache, -1, xstateregs, 0); + + if (ptrace (PT_SETXSTATE, get_ptrace_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) xstateregs, i386bsd_xsave_len) == -1) + perror_with_name (_("Couldn't write extended state status")); + return; + } +#endif + +#ifdef HAVE_PT_GETXMMREGS if (have_ptrace_xmmregs != 0 - && ptrace(PT_GETXMMREGS, ptid_get_pid (inferior_ptid), + && ptrace(PT_GETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == 0) { have_ptrace_xmmregs = 1; i387_collect_fxsave (regcache, regnum, xmmregs); - if (ptrace (PT_SETXMMREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == -1) perror_with_name (_("Couldn't write XMM registers")); } @@ -223,13 +260,13 @@ i386bsd_store_inferior_registers (struct target_ops *ops, { have_ptrace_xmmregs = 0; #endif - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); i387_collect_fsave (regcache, regnum, &fpregs); - if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't write floating point status")); #ifdef HAVE_PT_GETXMMREGS @@ -268,7 +305,7 @@ i386bsd_dr_get (ptid_t ptid, int regnum) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't read debug registers")); @@ -280,7 +317,7 @@ i386bsd_dr_set (int regnum, unsigned int value) { struct dbreg dbregs; - if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't get debug registers")); @@ -291,7 +328,7 @@ i386bsd_dr_set (int regnum, unsigned int value) DBREG_DRX ((&dbregs), regnum) = value; - if (ptrace (PT_SETDBREGS, ptid_get_pid (inferior_ptid), + if (ptrace (PT_SETDBREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) perror_with_name (_("Couldn't write debug registers")); }