1 /* Native-dependent code for modern VAX BSD's. 2 3 Copyright (C) 2004-2020 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 /* We define this to get types like register_t. */ 21 #include "defs.h" 22 #include "inferior.h" 23 #include "regcache.h" 24 #include "target.h" 25 26 #include <sys/types.h> 27 #include <sys/ptrace.h> 28 #include <machine/reg.h> 29 30 #include "vax-tdep.h" 31 #include "inf-ptrace.h" 32 #include "nbsd-nat.h" 33 34 struct vax_bsd_nat_target final : public nbsd_nat_target 35 { 36 void fetch_registers (struct regcache *, int) override; 37 void store_registers (struct regcache *, int) override; 38 }; 39 40 static vax_bsd_nat_target the_vax_bsd_nat_target; 41 42 /* Supply the general-purpose registers stored in GREGS to REGCACHE. */ 43 44 static void 45 vaxbsd_supply_gregset (struct regcache *regcache, const void *gregs) 46 { 47 const gdb_byte *regs = (const gdb_byte *)gregs; 48 int regnum; 49 50 for (regnum = 0; regnum < VAX_NUM_REGS; regnum++) 51 regcache->raw_supply (regnum, regs + regnum * 4); 52 } 53 54 /* Collect the general-purpose registers from REGCACHE and store them 55 in GREGS. */ 56 57 static void 58 vaxbsd_collect_gregset (const struct regcache *regcache, 59 void *gregs, int regnum) 60 { 61 gdb_byte *regs = (gdb_byte *)gregs; 62 int i; 63 64 for (i = 0; i <= VAX_NUM_REGS; i++) 65 { 66 if (regnum == -1 || regnum == i) 67 regcache->raw_collect (i, regs + i * 4); 68 } 69 } 70 71 72 /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this 73 for all registers. */ 74 75 void 76 vax_bsd_nat_target::fetch_registers (struct regcache *regcache, int regnum) 77 { 78 struct reg regs; 79 pid_t pid = regcache->ptid ().pid (); 80 int lwp = regcache->ptid ().lwp (); 81 82 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, lwp) == -1) 83 perror_with_name (_("Couldn't get registers")); 84 85 vaxbsd_supply_gregset (regcache, ®s); 86 } 87 88 /* Store register REGNUM back into the inferior. If REGNUM is -1, do 89 this for all registers. */ 90 91 void 92 vax_bsd_nat_target::store_registers (struct regcache *regcache, int regnum) 93 { 94 struct reg regs; 95 pid_t pid = regcache->ptid ().pid (); 96 int lwp = regcache->ptid ().lwp (); 97 98 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, lwp) == -1) 99 perror_with_name (_("Couldn't get registers")); 100 101 vaxbsd_collect_gregset (regcache, ®s, regnum); 102 103 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, lwp) == -1) 104 perror_with_name (_("Couldn't write registers")); 105 } 106 107 108 /* Support for debugging kernel virtual memory images. */ 109 110 #include <machine/pcb.h> 111 112 #include "bsd-kvm.h" 113 114 static int 115 vaxbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) 116 { 117 int regnum; 118 119 /* The following is true for OpenBSD 3.5: 120 121 The pcb contains the register state at the context switch inside 122 cpu_switch(). */ 123 124 /* The stack pointer shouldn't be zero. */ 125 if (pcb->KSP == 0) 126 return 0; 127 128 for (regnum = VAX_R0_REGNUM; regnum < VAX_AP_REGNUM; regnum++) 129 regcache->raw_supply (regnum, &pcb->R[regnum - VAX_R0_REGNUM]); 130 regcache->raw_supply (VAX_AP_REGNUM, &pcb->AP); 131 regcache->raw_supply (VAX_FP_REGNUM, &pcb->FP); 132 regcache->raw_supply (VAX_SP_REGNUM, &pcb->KSP); 133 regcache->raw_supply (VAX_PC_REGNUM, &pcb->PC); 134 regcache->raw_supply (VAX_PS_REGNUM, &pcb->PSL); 135 136 return 1; 137 } 138 139 void _initialize_vaxbsd_nat (); 140 void 141 _initialize_vaxbsd_nat () 142 { 143 add_inf_child_target (&the_vax_bsd_nat_target); 144 145 /* Support debugging kernel virtual memory images. */ 146 bsd_kvm_add_target (vaxbsd_supply_pcb); 147 } 148