xref: /openbsd-src/gnu/usr.bin/binutils/gdb/vaxbsd-nat.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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) &regs, 0) == -1)
7452ba75afSkettenis     perror_with_name ("Couldn't get registers");
7552ba75afSkettenis 
7652ba75afSkettenis   vaxbsd_supply_gregset (current_regcache, &regs);
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) &regs, 0) == -1)
8952ba75afSkettenis     perror_with_name ("Couldn't get registers");
9052ba75afSkettenis 
9152ba75afSkettenis   vaxbsd_collect_gregset (current_regcache, &regs, regnum);
9252ba75afSkettenis 
9352ba75afSkettenis   if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
94*63addd46Skettenis 	      (PTRACE_TYPE_ARG3) &regs, 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