X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Farmnbsd-nat.c;h=a06f786899637adcb337e1c402a637fd12ed4e90;hb=f390c311bee3c0e8752faea434f9416b7d737732;hp=9cf29bb7c2cd8425ddf5a51cf6a4bf6bb96acecc;hpb=01f0fe5e0450edf168c1f612feb93cf588e4e7ea;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/armnbsd-nat.c b/gdb/armnbsd-nat.c index 9cf29bb7c2..a06f786899 100644 --- a/gdb/armnbsd-nat.c +++ b/gdb/armnbsd-nat.c @@ -1,13 +1,13 @@ /* Native-dependent code for BSD Unix running on ARM's, for GDB. - Copyright (C) 1988, 1989, 1991, 1992, 1994, 1996, 1999, 2002, 2004 - Free Software Foundation, Inc. + Copyright (C) 1988, 1989, 1991, 1992, 1994, 1996, 1999, 2002, 2004, 2007, + 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "gdbcore.h" @@ -38,46 +36,46 @@ extern int arm_apcs_32; static void -supply_gregset (struct reg *gregset) +arm_supply_gregset (struct regcache *regcache, struct reg *gregset) { int regno; CORE_ADDR r_pc; /* Integer registers. */ for (regno = ARM_A1_REGNUM; regno < ARM_SP_REGNUM; regno++) - regcache_raw_supply (current_regcache, regno, (char *) &gregset->r[regno]); + regcache_raw_supply (regcache, regno, (char *) &gregset->r[regno]); - regcache_raw_supply (current_regcache, ARM_SP_REGNUM, + regcache_raw_supply (regcache, ARM_SP_REGNUM, (char *) &gregset->r_sp); - regcache_raw_supply (current_regcache, ARM_LR_REGNUM, + regcache_raw_supply (regcache, ARM_LR_REGNUM, (char *) &gregset->r_lr); /* This is ok: we're running native... */ - r_pc = ADDR_BITS_REMOVE (gregset->r_pc); - regcache_raw_supply (current_regcache, ARM_PC_REGNUM, (char *) &r_pc); + r_pc = gdbarch_addr_bits_remove (get_regcache_arch (regcache), gregset->r_pc); + regcache_raw_supply (regcache, ARM_PC_REGNUM, (char *) &r_pc); if (arm_apcs_32) - regcache_raw_supply (current_regcache, ARM_PS_REGNUM, + regcache_raw_supply (regcache, ARM_PS_REGNUM, (char *) &gregset->r_cpsr); else - regcache_raw_supply (current_regcache, ARM_PS_REGNUM, + regcache_raw_supply (regcache, ARM_PS_REGNUM, (char *) &gregset->r_pc); } static void -supply_fparegset (struct fpreg *fparegset) +arm_supply_fparegset (struct regcache *regcache, struct fpreg *fparegset) { int regno; for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++) - regcache_raw_supply (current_regcache, regno, + regcache_raw_supply (regcache, regno, (char *) &fparegset->fpr[regno - ARM_F0_REGNUM]); - regcache_raw_supply (current_regcache, ARM_FPS_REGNUM, + regcache_raw_supply (regcache, ARM_FPS_REGNUM, (char *) &fparegset->fpr_fpsr); } static void -fetch_register (int regno) +fetch_register (struct regcache *regcache, int regno) { struct reg inferior_registers; int ret; @@ -94,40 +92,42 @@ fetch_register (int regno) switch (regno) { case ARM_SP_REGNUM: - regcache_raw_supply (current_regcache, ARM_SP_REGNUM, + regcache_raw_supply (regcache, ARM_SP_REGNUM, (char *) &inferior_registers.r_sp); break; case ARM_LR_REGNUM: - regcache_raw_supply (current_regcache, ARM_LR_REGNUM, + regcache_raw_supply (regcache, ARM_LR_REGNUM, (char *) &inferior_registers.r_lr); break; case ARM_PC_REGNUM: - /* This is ok: we're running native... */ - inferior_registers.r_pc = ADDR_BITS_REMOVE (inferior_registers.r_pc); - regcache_raw_supply (current_regcache, ARM_PC_REGNUM, + /* This is ok: we're running native... */ + inferior_registers.r_pc = gdbarch_addr_bits_remove + (get_regcache_arch (regcache), + inferior_registers.r_pc); + regcache_raw_supply (regcache, ARM_PC_REGNUM, (char *) &inferior_registers.r_pc); break; case ARM_PS_REGNUM: if (arm_apcs_32) - regcache_raw_supply (current_regcache, ARM_PS_REGNUM, + regcache_raw_supply (regcache, ARM_PS_REGNUM, (char *) &inferior_registers.r_cpsr); else - regcache_raw_supply (current_regcache, ARM_PS_REGNUM, + regcache_raw_supply (regcache, ARM_PS_REGNUM, (char *) &inferior_registers.r_pc); break; default: - regcache_raw_supply (current_regcache, regno, + regcache_raw_supply (regcache, regno, (char *) &inferior_registers.r[regno]); break; } } static void -fetch_regs (void) +fetch_regs (struct regcache *regcache) { struct reg inferior_registers; int ret; @@ -142,11 +142,11 @@ fetch_regs (void) return; } - supply_gregset (&inferior_registers); + arm_supply_gregset (regcache, &inferior_registers); } static void -fetch_fp_register (int regno) +fetch_fp_register (struct regcache *regcache, int regno) { struct fpreg inferior_fp_registers; int ret; @@ -163,19 +163,19 @@ fetch_fp_register (int regno) switch (regno) { case ARM_FPS_REGNUM: - regcache_raw_supply (current_regcache, ARM_FPS_REGNUM, + regcache_raw_supply (regcache, ARM_FPS_REGNUM, (char *) &inferior_fp_registers.fpr_fpsr); break; default: - regcache_raw_supply (current_regcache, regno, + regcache_raw_supply (regcache, regno, (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); break; } } static void -fetch_fp_regs (void) +fetch_fp_regs (struct regcache *regcache) { struct fpreg inferior_fp_registers; int ret; @@ -190,30 +190,32 @@ fetch_fp_regs (void) return; } - supply_fparegset (&inferior_fp_registers); + arm_supply_fparegset (regcache, &inferior_fp_registers); } static void -armnbsd_fetch_registers (int regno) +armnbsd_fetch_registers (struct target_ops *ops, + struct regcache *regcache, int regno) { if (regno >= 0) { if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM) - fetch_register (regno); + fetch_register (regcache, regno); else - fetch_fp_register (regno); + fetch_fp_register (regcache, regno); } else { - fetch_regs (); - fetch_fp_regs (); + fetch_regs (regcache); + fetch_fp_regs (regcache); } } static void -store_register (int regno) +store_register (const struct regcache *regcache, int regno) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); struct reg inferior_registers; int ret; @@ -229,52 +231,53 @@ store_register (int regno) switch (regno) { case ARM_SP_REGNUM: - regcache_raw_collect (current_regcache, ARM_SP_REGNUM, + regcache_raw_collect (regcache, ARM_SP_REGNUM, (char *) &inferior_registers.r_sp); break; case ARM_LR_REGNUM: - regcache_raw_collect (current_regcache, ARM_LR_REGNUM, + regcache_raw_collect (regcache, ARM_LR_REGNUM, (char *) &inferior_registers.r_lr); break; case ARM_PC_REGNUM: if (arm_apcs_32) - regcache_raw_collect (current_regcache, ARM_PC_REGNUM, + regcache_raw_collect (regcache, ARM_PC_REGNUM, (char *) &inferior_registers.r_pc); else { unsigned pc_val; - regcache_raw_collect (current_regcache, ARM_PC_REGNUM, + regcache_raw_collect (regcache, ARM_PC_REGNUM, (char *) &pc_val); - pc_val = ADDR_BITS_REMOVE (pc_val); - inferior_registers.r_pc - ^= ADDR_BITS_REMOVE (inferior_registers.r_pc); + pc_val = gdbarch_addr_bits_remove (gdbarch, pc_val); + inferior_registers.r_pc ^= gdbarch_addr_bits_remove + (gdbarch, inferior_registers.r_pc); inferior_registers.r_pc |= pc_val; } break; case ARM_PS_REGNUM: if (arm_apcs_32) - regcache_raw_collect (current_regcache, ARM_PS_REGNUM, + regcache_raw_collect (regcache, ARM_PS_REGNUM, (char *) &inferior_registers.r_cpsr); else { unsigned psr_val; - regcache_raw_collect (current_regcache, ARM_PS_REGNUM, + regcache_raw_collect (regcache, ARM_PS_REGNUM, (char *) &psr_val); - psr_val ^= ADDR_BITS_REMOVE (psr_val); - inferior_registers.r_pc = ADDR_BITS_REMOVE (inferior_registers.r_pc); + psr_val ^= gdbarch_addr_bits_remove (gdbarch, psr_val); + inferior_registers.r_pc = gdbarch_addr_bits_remove + (gdbarch, inferior_registers.r_pc); inferior_registers.r_pc |= psr_val; } break; default: - regcache_raw_collect (current_regcache, regno, + regcache_raw_collect (regcache, regno, (char *) &inferior_registers.r[regno]); break; } @@ -287,27 +290,28 @@ store_register (int regno) } static void -store_regs (void) +store_regs (const struct regcache *regcache) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); struct reg inferior_registers; int ret; int regno; for (regno = ARM_A1_REGNUM; regno < ARM_SP_REGNUM; regno++) - regcache_raw_collect (current_regcache, regno, + regcache_raw_collect (regcache, regno, (char *) &inferior_registers.r[regno]); - regcache_raw_collect (current_regcache, ARM_SP_REGNUM, + regcache_raw_collect (regcache, ARM_SP_REGNUM, (char *) &inferior_registers.r_sp); - regcache_raw_collect (current_regcache, ARM_LR_REGNUM, + regcache_raw_collect (regcache, ARM_LR_REGNUM, (char *) &inferior_registers.r_lr); if (arm_apcs_32) { - regcache_raw_collect (current_regcache, ARM_PC_REGNUM, + regcache_raw_collect (regcache, ARM_PC_REGNUM, (char *) &inferior_registers.r_pc); - regcache_raw_collect (current_regcache, ARM_PS_REGNUM, + regcache_raw_collect (regcache, ARM_PS_REGNUM, (char *) &inferior_registers.r_cpsr); } else @@ -315,13 +319,13 @@ store_regs (void) unsigned pc_val; unsigned psr_val; - regcache_raw_collect (current_regcache, ARM_PC_REGNUM, + regcache_raw_collect (regcache, ARM_PC_REGNUM, (char *) &pc_val); - regcache_raw_collect (current_regcache, ARM_PS_REGNUM, + regcache_raw_collect (regcache, ARM_PS_REGNUM, (char *) &psr_val); - pc_val = ADDR_BITS_REMOVE (pc_val); - psr_val ^= ADDR_BITS_REMOVE (psr_val); + pc_val = gdbarch_addr_bits_remove (gdbarch, pc_val); + psr_val ^= gdbarch_addr_bits_remove (gdbarch, psr_val); inferior_registers.r_pc = pc_val | psr_val; } @@ -334,7 +338,7 @@ store_regs (void) } static void -store_fp_register (int regno) +store_fp_register (const struct regcache *regcache, int regno) { struct fpreg inferior_fp_registers; int ret; @@ -351,12 +355,12 @@ store_fp_register (int regno) switch (regno) { case ARM_FPS_REGNUM: - regcache_raw_collect (current_regcache, ARM_FPS_REGNUM, + regcache_raw_collect (regcache, ARM_FPS_REGNUM, (char *) &inferior_fp_registers.fpr_fpsr); break; default: - regcache_raw_collect (current_regcache, regno, + regcache_raw_collect (regcache, regno, (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); break; } @@ -369,7 +373,7 @@ store_fp_register (int regno) } static void -store_fp_regs (void) +store_fp_regs (const struct regcache *regcache) { struct fpreg inferior_fp_registers; int ret; @@ -377,10 +381,10 @@ store_fp_regs (void) for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++) - regcache_raw_collect (current_regcache, regno, + regcache_raw_collect (regcache, regno, (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); - regcache_raw_collect (current_regcache, ARM_FPS_REGNUM, + regcache_raw_collect (regcache, ARM_FPS_REGNUM, (char *) &inferior_fp_registers.fpr_fpsr); ret = ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), @@ -391,19 +395,20 @@ store_fp_regs (void) } static void -armnbsd_store_registers (int regno) +armnbsd_store_registers (struct target_ops *ops, + struct regcache *regcache, int regno) { if (regno >= 0) { if (regno < ARM_F0_REGNUM || regno > ARM_FPS_REGNUM) - store_register (regno); + store_register (regcache, regno); else - store_fp_register (regno); + store_fp_register (regcache, regno); } else { - store_regs (); - store_fp_regs (); + store_regs (regcache); + store_fp_regs (regcache); } } @@ -414,19 +419,21 @@ struct md_core }; static void -fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, +fetch_core_registers (struct regcache *regcache, + char *core_reg_sect, unsigned core_reg_size, int which, CORE_ADDR ignore) { struct md_core *core_reg = (struct md_core *) core_reg_sect; int regno; CORE_ADDR r_pc; - supply_gregset (&core_reg->intreg); - supply_fparegset (&core_reg->freg); + arm_supply_gregset (regcache, &core_reg->intreg); + arm_supply_fparegset (regcache, &core_reg->freg); } static void -fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, +fetch_elfcore_registers (struct regcache *regcache, + char *core_reg_sect, unsigned core_reg_size, int which, CORE_ADDR ignore) { struct reg gregset; @@ -442,7 +449,7 @@ fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, /* The memcpy may be unnecessary, but we can't really be sure of the alignment of the data in the core file. */ memcpy (&gregset, core_reg_sect, sizeof (gregset)); - supply_gregset (&gregset); + arm_supply_gregset (regcache, &gregset); } break; @@ -454,7 +461,7 @@ fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, /* The memcpy may be unnecessary, but we can't really be sure of the alignment of the data in the core file. */ memcpy (&fparegset, core_reg_sect, sizeof (fparegset)); - supply_fparegset (&fparegset); + arm_supply_fparegset (regcache, &fparegset); } break;