1*63addd46Skettenis /* Native-dependent code for modern VAX BSD's.
252ba75afSkettenis
352ba75afSkettenis Copyright 2004 Free Software Foundation, Inc.
452ba75afSkettenis
552ba75afSkettenis This file is part of GDB.
652ba75afSkettenis
752ba75afSkettenis This program is free software; you can redistribute it and/or modify
852ba75afSkettenis it under the terms of the GNU General Public License as published by
952ba75afSkettenis the Free Software Foundation; either version 2 of the License, or
1052ba75afSkettenis (at your option) any later version.
1152ba75afSkettenis
1252ba75afSkettenis This program is distributed in the hope that it will be useful,
1352ba75afSkettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
1452ba75afSkettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1552ba75afSkettenis GNU General Public License for more details.
1652ba75afSkettenis
1752ba75afSkettenis You should have received a copy of the GNU General Public License
1852ba75afSkettenis along with this program; if not, write to the Free Software
1952ba75afSkettenis Foundation, Inc., 59 Temple Place - Suite 330,
2052ba75afSkettenis Boston, MA 02111-1307, USA. */
2152ba75afSkettenis
2252ba75afSkettenis #include "defs.h"
2352ba75afSkettenis #include "inferior.h"
2452ba75afSkettenis #include "regcache.h"
25*63addd46Skettenis #include "target.h"
2652ba75afSkettenis
2752ba75afSkettenis #include <sys/types.h>
2852ba75afSkettenis #include <sys/ptrace.h>
2952ba75afSkettenis #include <machine/reg.h>
3052ba75afSkettenis
3152ba75afSkettenis #include "vax-tdep.h"
32*63addd46Skettenis #include "inf-ptrace.h"
3352ba75afSkettenis
3452ba75afSkettenis /* Supply the general-purpose registers stored in GREGS to REGCACHE. */
3552ba75afSkettenis
3652ba75afSkettenis static void
vaxbsd_supply_gregset(struct regcache * regcache,const void * gregs)3752ba75afSkettenis vaxbsd_supply_gregset (struct regcache *regcache, const void *gregs)
3852ba75afSkettenis {
3952ba75afSkettenis const char *regs = gregs;
4052ba75afSkettenis int regnum;
4152ba75afSkettenis
4252ba75afSkettenis for (regnum = 0; regnum < VAX_NUM_REGS; regnum++)
4352ba75afSkettenis regcache_raw_supply (regcache, regnum, regs + regnum * 4);
4452ba75afSkettenis }
4552ba75afSkettenis
4652ba75afSkettenis /* Collect the general-purpose registers from REGCACHE and store them
4752ba75afSkettenis in GREGS. */
4852ba75afSkettenis
4952ba75afSkettenis static void
vaxbsd_collect_gregset(const struct regcache * regcache,void * gregs,int regnum)5052ba75afSkettenis vaxbsd_collect_gregset (const struct regcache *regcache,
5152ba75afSkettenis void *gregs, int regnum)
5252ba75afSkettenis {
5352ba75afSkettenis char *regs = gregs;
5452ba75afSkettenis int i;
5552ba75afSkettenis
5652ba75afSkettenis for (i = 0; i <= VAX_NUM_REGS; i++)
5752ba75afSkettenis {
5852ba75afSkettenis if (regnum == -1 || regnum == i)
59bf8695e8Skettenis regcache_raw_collect (regcache, i, regs + i * 4);
6052ba75afSkettenis }
6152ba75afSkettenis }
6252ba75afSkettenis
6352ba75afSkettenis
6452ba75afSkettenis /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
6552ba75afSkettenis for all registers. */
6652ba75afSkettenis
67*63addd46Skettenis static void
vaxbsd_fetch_inferior_registers(int regnum)68*63addd46Skettenis vaxbsd_fetch_inferior_registers (int regnum)
6952ba75afSkettenis {
7052ba75afSkettenis struct reg regs;
7152ba75afSkettenis
7252ba75afSkettenis if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
73*63addd46Skettenis (PTRACE_TYPE_ARG3) ®s, 0) == -1)
7452ba75afSkettenis perror_with_name ("Couldn't get registers");
7552ba75afSkettenis
7652ba75afSkettenis vaxbsd_supply_gregset (current_regcache, ®s);
7752ba75afSkettenis }
7852ba75afSkettenis
7952ba75afSkettenis /* Store register REGNUM back into the inferior. If REGNUM is -1, do
8052ba75afSkettenis this for all registers. */
8152ba75afSkettenis
82*63addd46Skettenis static void
vaxbsd_store_inferior_registers(int regnum)83*63addd46Skettenis vaxbsd_store_inferior_registers (int regnum)
8452ba75afSkettenis {
8552ba75afSkettenis struct reg regs;
8652ba75afSkettenis
8752ba75afSkettenis if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
88*63addd46Skettenis (PTRACE_TYPE_ARG3) ®s, 0) == -1)
8952ba75afSkettenis perror_with_name ("Couldn't get registers");
9052ba75afSkettenis
9152ba75afSkettenis vaxbsd_collect_gregset (current_regcache, ®s, regnum);
9252ba75afSkettenis
9352ba75afSkettenis if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
94*63addd46Skettenis (PTRACE_TYPE_ARG3) ®s, 0) == -1)
9552ba75afSkettenis perror_with_name ("Couldn't write registers");
9652ba75afSkettenis }
97bf8695e8Skettenis
98bf8695e8Skettenis
99bf8695e8Skettenis /* Support for debugging kernel virtual memory images. */
100bf8695e8Skettenis
101bf8695e8Skettenis #include <sys/types.h>
102bf8695e8Skettenis #include <machine/pcb.h>
103bf8695e8Skettenis
104bf8695e8Skettenis #include "bsd-kvm.h"
105bf8695e8Skettenis
106bf8695e8Skettenis static int
vaxbsd_supply_pcb(struct regcache * regcache,struct pcb * pcb)107bf8695e8Skettenis vaxbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
108bf8695e8Skettenis {
109bf8695e8Skettenis int regnum;
110bf8695e8Skettenis
111bf8695e8Skettenis /* The following is true for OpenBSD 3.5:
112bf8695e8Skettenis
113bf8695e8Skettenis The pcb contains the register state at the context switch inside
114bf8695e8Skettenis cpu_switch(). */
115bf8695e8Skettenis
116bf8695e8Skettenis /* The stack pointer shouldn't be zero. */
117bf8695e8Skettenis if (pcb->KSP == 0)
118bf8695e8Skettenis return 0;
119bf8695e8Skettenis
120bf8695e8Skettenis for (regnum = VAX_R0_REGNUM; regnum < VAX_AP_REGNUM; regnum++)
121bf8695e8Skettenis regcache_raw_supply (regcache, regnum, &pcb->R[regnum - VAX_R0_REGNUM]);
122bf8695e8Skettenis regcache_raw_supply (regcache, VAX_AP_REGNUM, &pcb->AP);
123bf8695e8Skettenis regcache_raw_supply (regcache, VAX_FP_REGNUM, &pcb->FP);
124bf8695e8Skettenis regcache_raw_supply (regcache, VAX_SP_REGNUM, &pcb->KSP);
125bf8695e8Skettenis regcache_raw_supply (regcache, VAX_PC_REGNUM, &pcb->PC);
126bf8695e8Skettenis regcache_raw_supply (regcache, VAX_PS_REGNUM, &pcb->PSL);
127bf8695e8Skettenis
128bf8695e8Skettenis return 1;
129bf8695e8Skettenis }
130bf8695e8Skettenis
131bf8695e8Skettenis
132bf8695e8Skettenis /* Provide a prototype to silence -Wmissing-prototypes. */
133bf8695e8Skettenis void _initialize_vaxbsd_nat (void);
134bf8695e8Skettenis
135bf8695e8Skettenis void
_initialize_vaxbsd_nat(void)136bf8695e8Skettenis _initialize_vaxbsd_nat (void)
137bf8695e8Skettenis {
138*63addd46Skettenis struct target_ops *t;
139*63addd46Skettenis
140*63addd46Skettenis t = inf_ptrace_target ();
141*63addd46Skettenis t->to_fetch_registers = vaxbsd_fetch_inferior_registers;
142*63addd46Skettenis t->to_store_registers = vaxbsd_store_inferior_registers;
143*63addd46Skettenis add_target (t);
144*63addd46Skettenis
145bf8695e8Skettenis /* Support debugging kernel virtual memory images. */
146bf8695e8Skettenis bsd_kvm_add_target (vaxbsd_supply_pcb);
147bf8695e8Skettenis }
148