From 310a98e10257728271c1d3b817f7bfeb5c3cb88f Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Mon, 15 Oct 2007 19:49:53 +0000 Subject: [PATCH] * ppc-linux-nat.c (ppc_linux_read_description): New. (_initialize_ppc_linux_nat): Set to_read_description. * ppc-tdep.h (tdesc_powerpc_e500): Declare. --- gdb/ChangeLog | 6 ++++++ gdb/ppc-linux-nat.c | 29 +++++++++++++++++++++++++++++ gdb/ppc-tdep.h | 2 ++ 3 files changed, 37 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 38a3993053e..c8f1e9ea309 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2007-10-15 Daniel Jacobowitz + + * ppc-linux-nat.c (ppc_linux_read_description): New. + (_initialize_ppc_linux_nat): Set to_read_description. + * ppc-tdep.h (tdesc_powerpc_e500): Declare. + 2007-10-15 Daniel Jacobowitz * NEWS: Document target described register support for PowerPC. diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c index d86c9f85573..1e43640b516 100644 --- a/gdb/ppc-linux-nat.c +++ b/gdb/ppc-linux-nat.c @@ -940,6 +940,33 @@ fill_fpregset (const struct regcache *regcache, fpregsetp, sizeof (*fpregsetp)); } +static const struct target_desc * +ppc_linux_read_description (struct target_ops *ops) +{ + if (have_ptrace_getsetevrregs) + { + struct gdb_evrregset_t evrregset; + int tid = TIDGET (inferior_ptid); + + if (tid == 0) + tid = PIDGET (inferior_ptid); + + if (ptrace (PTRACE_GETEVRREGS, tid, 0, &evrregset) >= 0) + return tdesc_powerpc_e500; + else + { + /* EIO means that the PTRACE_GETEVRREGS request isn't supported. */ + if (errno == EIO) + return NULL; + else + /* Anything else needs to be reported. */ + perror_with_name (_("Unable to fetch SPE registers")); + } + } + + return NULL; +} + void _initialize_ppc_linux_nat (void); void @@ -962,6 +989,8 @@ _initialize_ppc_linux_nat (void) t->to_stopped_by_watchpoint = ppc_linux_stopped_by_watchpoint; t->to_stopped_data_address = ppc_linux_stopped_data_address; + t->to_read_description = ppc_linux_read_description; + /* Register the target. */ linux_nat_add_target (t); linux_nat_set_new_thread (t, ppc_linux_new_thread); diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h index 76fcf9e76ab..2b566dfb254 100644 --- a/gdb/ppc-tdep.h +++ b/gdb/ppc-tdep.h @@ -227,4 +227,6 @@ enum { /* Estimate for the maximum number of instrctions in a function epilogue. */ #define PPC_MAX_EPILOGUE_INSTRUCTIONS 52 +extern struct target_desc *tdesc_powerpc_e500; + #endif /* ppc-tdep.h */ -- 2.30.2