1/* Native-dependent code for Motorola 88000 BSD's. 2 3 Copyright (C) 2004, 2007 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20#include "defs.h" 21#include "inferior.h" 22#include "regcache.h" 23#include "target.h" 24 25#include <sys/types.h> 26#include <sys/ptrace.h> 27#include <machine/reg.h> 28 29#include "m88k-tdep.h" 30#include "inf-ptrace.h" 31 32/* Supply the general-purpose registers stored in GREGS to REGCACHE. */ 33 34static void 35m88kbsd_supply_gregset (struct regcache *regcache, const void *gregs) 36{ 37 const char *regs = gregs; 38 int regnum; 39 40 for (regnum = 0; regnum < M88K_NUM_REGS; regnum++) 41 regcache_raw_supply (regcache, regnum, regs + regnum * 4); 42} 43 44/* Collect the general-purpose registers from REGCACHE and store them 45 in GREGS. */ 46 47static void 48m88kbsd_collect_gregset (const struct regcache *regcache, 49 void *gregs, int regnum) 50{ 51 char *regs = gregs; 52 int i; 53 54 for (i = 0; i < M88K_NUM_REGS; i++) 55 { 56 if (regnum == -1 || regnum == i) 57 regcache_raw_collect (regcache, i, regs + i * 4); 58 } 59} 60 61 62/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this 63 for all registers. */ 64 65static void 66m88kbsd_fetch_inferior_registers (struct regcache *regcache, int regnum) 67{ 68 struct reg regs; 69 70 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), 71 (PTRACE_TYPE_ARG3) ®s, 0) == -1) 72 perror_with_name (_("Couldn't get registers")); 73 74 m88kbsd_supply_gregset (regcache, ®s); 75} 76 77/* Store register REGNUM back into the inferior. If REGNUM is -1, do 78 this for all registers. */ 79 80static void 81m88kbsd_store_inferior_registers (struct regcache *regcache, int regnum) 82{ 83 struct reg regs; 84 85 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), 86 (PTRACE_TYPE_ARG3) ®s, 0) == -1) 87 perror_with_name (_("Couldn't get registers")); 88 89 m88kbsd_collect_gregset (regcache, ®s, regnum); 90 91 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), 92 (PTRACE_TYPE_ARG3) ®s, 0) == -1) 93 perror_with_name (_("Couldn't write registers")); 94} 95 96 97/* Provide a prototype to silence -Wmissing-prototypes. */ 98void _initialize_m88kbsd_nat (void); 99 100void 101_initialize_m88kbsd_nat (void) 102{ 103 struct target_ops *t; 104 105 t = inf_ptrace_target (); 106 t->to_fetch_registers = m88kbsd_fetch_inferior_registers; 107 t->to_store_registers = m88kbsd_store_inferior_registers; 108 add_target (t); 109} 110