xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/vax-bsd-nat.c (revision d16b7486a53dcb8072b60ec6fcb4373a2d0c27b7)
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) &regs, lwp) == -1)
83     perror_with_name (_("Couldn't get registers"));
84 
85   vaxbsd_supply_gregset (regcache, &regs);
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) &regs, lwp) == -1)
99     perror_with_name (_("Couldn't get registers"));
100 
101   vaxbsd_collect_gregset (regcache, &regs, regnum);
102 
103   if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 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