2009-10-23 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / vax-nat.c
CommitLineData
b9e1c0d6
MK
1/* Native-dependent code for VAX UNIXen (including older BSD's).
2
0fb0cc75 3 Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
b9e1c0d6
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
b9e1c0d6
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/>. */
b9e1c0d6
MK
19
20#include "defs.h"
21#include "inferior.h"
22
23#include "gdb_assert.h"
24#include <sys/types.h>
25#include <sys/dir.h>
26#include <sys/user.h>
27
28#ifdef HAVE_SYS_PTRACE_H
29#include <sys/ptrace.h>
30#endif
31
32#ifndef PT_READ_U
33#define PT_READ_U 3
34#endif
35
36#ifdef SYS_REG_H
37/* UNIX 32V and derivatives (including 3BSD). */
38#include <sys/reg.h>
39#else
40/* 4.2BSD and derivatives. */
41#include <machine/reg.h>
42#endif
43
44#include "vax-tdep.h"
2a2de4ce 45#include "inf-ptrace.h"
b9e1c0d6
MK
46
47/* Address of the user structure. This is the the value for 32V; 3BSD
48 uses a different value, but hey, who's still using those systems? */
de732108 49static CORE_ADDR vax_kernel_u_addr = 0x80020000;
b9e1c0d6
MK
50
51/* Location of the user's stored registers; usage is `u.u_ar0[XX]'.
52 For 4.2BSD and ULTRIX these are negative! See <machine/reg.h>. */
53static int vax_register_index[] =
54{
55 R0, R1, R2, R3, R4, R5,
56 R6, R7, R8, R9, R10, R11,
57 AP, FP, SP, PC, PS
58};
59
de732108 60static CORE_ADDR
b9e1c0d6
MK
61vax_register_u_addr (CORE_ADDR u_ar0, int regnum)
62{
63 gdb_assert (regnum >= 0 && regnum < ARRAY_SIZE (vax_register_index));
64
65 /* Type is `int *u_ar0'. See <sys/user.h>. */
66 return u_ar0 + vax_register_index[regnum - VAX_R0_REGNUM] * 4;
67}
b9e1c0d6 68
2a2de4ce 69static CORE_ADDR
7714d83a 70vax_register_u_offset (struct gdbarch *gdbarch, int regnum, int store_p)
b9e1c0d6
MK
71{
72 size_t u_ar0_offset = offsetof (struct user, u_ar0);
73 CORE_ADDR u_ar0;
74 int pid;
75
76 errno = 0;
77 pid = PIDGET (inferior_ptid);
78 u_ar0 = ptrace (PT_READ_U, pid, u_ar0_offset, 0);
79 if (errno)
e2e0b3e5 80 perror_with_name (_("Unable to determine location of registers"));
b9e1c0d6
MK
81
82 return vax_register_u_addr (u_ar0, regnum) - vax_kernel_u_addr;
83}
84\f
85
86#include <nlist.h>
87
88#ifndef _PATH_UNIX
89#define _PATH_UNIX "/vmunix"
90#endif
91
92/* Provide a prototype to silence -Wmissing-prototypes. */
93void _initialize_vax_nat (void);
94
95void
96_initialize_vax_nat (void)
97{
98 struct nlist names[2];
99
100 names[0].n_name = "_u";
101 names[1].n_name = NULL;
102 if (nlist (_PATH_UNIX, names) == 0)
103 vax_kernel_u_addr = names[0].n_value;
2a2de4ce
MK
104
105 add_target (inf_ptrace_trad_target (vax_register_u_offset));
b9e1c0d6 106}
This page took 0.469944 seconds and 4 git commands to generate.