*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / vaxbsd-nat.c
CommitLineData
b9e1c0d6 1/* Native-dependent code for modern VAX BSD's.
53284fc1 2
6aba47ca 3 Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
53284fc1
MK
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
53284fc1
MK
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
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
53284fc1
MK
19
20#include "defs.h"
21#include "inferior.h"
22#include "regcache.h"
ba0cd111 23#include "target.h"
53284fc1
MK
24
25#include <sys/types.h>
26#include <sys/ptrace.h>
27#include <machine/reg.h>
28
29#include "vax-tdep.h"
ba0cd111 30#include "inf-ptrace.h"
53284fc1
MK
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{
8cc49c48 37 const gdb_byte *regs = gregs;
53284fc1
MK
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{
8cc49c48 51 gdb_byte *regs = gregs;
53284fc1
MK
52 int i;
53
54 for (i = 0; i <= VAX_NUM_REGS; i++)
55 {
56 if (regnum == -1 || regnum == i)
5df97fde 57 regcache_raw_collect (regcache, i, regs + i * 4);
53284fc1
MK
58 }
59}
60\f
61
62/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
63 for all registers. */
64
ba0cd111 65static void
56be3814 66vaxbsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
53284fc1
MK
67{
68 struct reg regs;
69
70 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 71 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 72 perror_with_name (_("Couldn't get registers"));
53284fc1 73
56be3814 74 vaxbsd_supply_gregset (regcache, &regs);
53284fc1
MK
75}
76
77/* Store register REGNUM back into the inferior. If REGNUM is -1, do
78 this for all registers. */
79
ba0cd111 80static void
56be3814 81vaxbsd_store_inferior_registers (struct regcache *regcache, int regnum)
53284fc1
MK
82{
83 struct reg regs;
84
85 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 86 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 87 perror_with_name (_("Couldn't get registers"));
53284fc1 88
56be3814 89 vaxbsd_collect_gregset (regcache, &regs, regnum);
53284fc1
MK
90
91 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 92 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 93 perror_with_name (_("Couldn't write registers"));
53284fc1 94}
7ddd7709
MK
95\f
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\f
129
130/* Provide a prototype to silence -Wmissing-prototypes. */
131void _initialize_vaxbsd_nat (void);
132
133void
134_initialize_vaxbsd_nat (void)
135{
ba0cd111
MK
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
7ddd7709
MK
143 /* Support debugging kernel virtual memory images. */
144 bsd_kvm_add_target (vaxbsd_supply_pcb);
145}
This page took 0.495708 seconds and 4 git commands to generate.