1/* Native-dependent code for modern VAX BSD's. 2 3 Copyright (C) 2004, 2005, 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 "vax-tdep.h" 30#include "inf-ptrace.h" 31 32/* Supply the general-purpose registers stored in GREGS to REGCACHE. */ 33 34static void 35vaxbsd_supply_gregset (struct regcache *regcache, const void *gregs) 36{ 37 const gdb_byte *regs = gregs; 38 int regnum; 39 40 for (regnum = 0; regnum < VAX_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 48vaxbsd_collect_gregset (const struct regcache *regcache, 49 void *gregs, int regnum) 50{ 51 gdb_byte *regs = gregs; 52 int i; 53 54 for (i = 0; i <= VAX_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 66vaxbsd_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 vaxbsd_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 81vaxbsd_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 vaxbsd_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/* Support for debugging kernel virtual memory images. */ 98 99#include <sys/types.h> 100#include <machine/pcb.h> 101 102#include "bsd-kvm.h" 103 104static int 105vaxbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) 106{ 107 int regnum; 108 109 /* The following is true for OpenBSD 3.5: 110 111 The pcb contains the register state at the context switch inside 112 cpu_switch(). */ 113 114 /* The stack pointer shouldn't be zero. */ 115 if (pcb->KSP == 0) 116 return 0; 117 118 for (regnum = VAX_R0_REGNUM; regnum < VAX_AP_REGNUM; regnum++) 119 regcache_raw_supply (regcache, regnum, &pcb->R[regnum - VAX_R0_REGNUM]); 120 regcache_raw_supply (regcache, VAX_AP_REGNUM, &pcb->AP); 121 regcache_raw_supply (regcache, VAX_FP_REGNUM, &pcb->FP); 122 regcache_raw_supply (regcache, VAX_SP_REGNUM, &pcb->KSP); 123 regcache_raw_supply (regcache, VAX_PC_REGNUM, &pcb->PC); 124 regcache_raw_supply (regcache, VAX_PS_REGNUM, &pcb->PSL); 125 126 return 1; 127} 128 129 130/* Provide a prototype to silence -Wmissing-prototypes. */ 131void _initialize_vaxbsd_nat (void); 132 133void 134_initialize_vaxbsd_nat (void) 135{ 136 struct target_ops *t; 137 138 t = inf_ptrace_target (); 139 t->to_fetch_registers = vaxbsd_fetch_inferior_registers; 140 t->to_store_registers = vaxbsd_store_inferior_registers; 141 add_target (t); 142 143 /* Support debugging kernel virtual memory images. */ 144 bsd_kvm_add_target (vaxbsd_supply_pcb); 145} 146