2011-02-25 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / vax-nat.c
CommitLineData
b9e1c0d6
MK
1/* Native-dependent code for VAX UNIXen (including older BSD's).
2
7b6bb8da 3 Copyright (C) 2004, 2005, 2007, 2008, 2009, 2010, 2011
4c38e0a4 4 Free Software Foundation, Inc.
b9e1c0d6
MK
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
b9e1c0d6
MK
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
b9e1c0d6
MK
20
21#include "defs.h"
22#include "inferior.h"
23
24#include "gdb_assert.h"
25#include <sys/types.h>
26#include <sys/dir.h>
27#include <sys/user.h>
28
29#ifdef HAVE_SYS_PTRACE_H
30#include <sys/ptrace.h>
31#endif
32
33#ifndef PT_READ_U
34#define PT_READ_U 3
35#endif
36
37#ifdef SYS_REG_H
38/* UNIX 32V and derivatives (including 3BSD). */
39#include <sys/reg.h>
40#else
41/* 4.2BSD and derivatives. */
42#include <machine/reg.h>
43#endif
44
45#include "vax-tdep.h"
2a2de4ce 46#include "inf-ptrace.h"
b9e1c0d6 47
b021a221 48/* Address of the user structure. This is the value for 32V; 3BSD
b9e1c0d6 49 uses a different value, but hey, who's still using those systems? */
de732108 50static CORE_ADDR vax_kernel_u_addr = 0x80020000;
b9e1c0d6
MK
51
52/* Location of the user's stored registers; usage is `u.u_ar0[XX]'.
53 For 4.2BSD and ULTRIX these are negative! See <machine/reg.h>. */
54static int vax_register_index[] =
55{
56 R0, R1, R2, R3, R4, R5,
57 R6, R7, R8, R9, R10, R11,
58 AP, FP, SP, PC, PS
59};
60
de732108 61static CORE_ADDR
b9e1c0d6
MK
62vax_register_u_addr (CORE_ADDR u_ar0, int regnum)
63{
64 gdb_assert (regnum >= 0 && regnum < ARRAY_SIZE (vax_register_index));
65
66 /* Type is `int *u_ar0'. See <sys/user.h>. */
67 return u_ar0 + vax_register_index[regnum - VAX_R0_REGNUM] * 4;
68}
b9e1c0d6 69
2a2de4ce 70static CORE_ADDR
7714d83a 71vax_register_u_offset (struct gdbarch *gdbarch, int regnum, int store_p)
b9e1c0d6
MK
72{
73 size_t u_ar0_offset = offsetof (struct user, u_ar0);
74 CORE_ADDR u_ar0;
75 int pid;
76
77 errno = 0;
78 pid = PIDGET (inferior_ptid);
79 u_ar0 = ptrace (PT_READ_U, pid, u_ar0_offset, 0);
80 if (errno)
e2e0b3e5 81 perror_with_name (_("Unable to determine location of registers"));
b9e1c0d6
MK
82
83 return vax_register_u_addr (u_ar0, regnum) - vax_kernel_u_addr;
84}
85\f
86
87#include <nlist.h>
88
89#ifndef _PATH_UNIX
90#define _PATH_UNIX "/vmunix"
91#endif
92
93/* Provide a prototype to silence -Wmissing-prototypes. */
94void _initialize_vax_nat (void);
95
96void
97_initialize_vax_nat (void)
98{
99 struct nlist names[2];
100
101 names[0].n_name = "_u";
102 names[1].n_name = NULL;
103 if (nlist (_PATH_UNIX, names) == 0)
104 vax_kernel_u_addr = names[0].n_value;
2a2de4ce
MK
105
106 add_target (inf_ptrace_trad_target (vax_register_u_offset));
b9e1c0d6 107}
This page took 0.618238 seconds and 4 git commands to generate.