OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [gdb/] [m68kbsd-nat.c] - Blame information for rev 461

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 24 jeremybenn
/* Native-dependent code for Motorola 68000 BSD's.
2
 
3
   Copyright (C) 2004, 2007, 2008 Free Software Foundation, Inc.
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
9
   the Free Software Foundation; either version 3 of the License, or
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
18
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
 
20
#include "defs.h"
21
#include "gdbcore.h"
22
#include "inferior.h"
23
#include "regcache.h"
24
 
25
#include "gdb_assert.h"
26
#include <sys/types.h>
27
#include <sys/ptrace.h>
28
#include <machine/reg.h>
29
 
30
#include "m68k-tdep.h"
31
#include "inf-ptrace.h"
32
 
33
static int
34
m68kbsd_gregset_supplies_p (int regnum)
35
{
36
  return (regnum >= M68K_D0_REGNUM && regnum <= M68K_PC_REGNUM);
37
}
38
 
39
static int
40
m68kbsd_fpregset_supplies_p (int regnum)
41
{
42
  return (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FPI_REGNUM);
43
}
44
 
45
/* Supply the general-purpose registers stored in GREGS to REGCACHE.  */
46
 
47
static void
48
m68kbsd_supply_gregset (struct regcache *regcache, const void *gregs)
49
{
50
  const char *regs = gregs;
51
  int regnum;
52
 
53
  for (regnum = M68K_D0_REGNUM; regnum <= M68K_PC_REGNUM; regnum++)
54
    regcache_raw_supply (regcache, regnum, regs + regnum * 4);
55
}
56
 
57
/* Supply the floating-point registers stored in FPREGS to REGCACHE.  */
58
 
59
static void
60
m68kbsd_supply_fpregset (struct regcache *regcache, const void *fpregs)
61
{
62
  const char *regs = fpregs;
63
  int regnum;
64
 
65
  for (regnum = M68K_FP0_REGNUM; regnum <= M68K_FPI_REGNUM; regnum++)
66
    regcache_raw_supply (regcache, regnum,
67
                         regs + m68kbsd_fpreg_offset (regnum));
68
}
69
 
70
/* Collect the general-purpose registers from REGCACHE and store them
71
   in GREGS.  */
72
 
73
static void
74
m68kbsd_collect_gregset (const struct regcache *regcache,
75
                         void *gregs, int regnum)
76
{
77
  char *regs = gregs;
78
  int i;
79
 
80
  for (i = M68K_D0_REGNUM; i <= M68K_PC_REGNUM; i++)
81
    {
82
      if (regnum == -1 || regnum == i)
83
        regcache_raw_collect (regcache, i, regs + i * 4);
84
    }
85
}
86
 
87
/* Collect the floating-point registers from REGCACHE and store them
88
   in FPREGS.  */
89
 
90
static void
91
m68kbsd_collect_fpregset (struct regcache *regcache,
92
                          void *fpregs, int regnum)
93
{
94
  char *regs = fpregs;
95
  int i;
96
 
97
  for (i = M68K_FP0_REGNUM; i <= M68K_FPI_REGNUM; i++)
98
    {
99
      if (regnum == -1 || regnum == i)
100
        regcache_raw_collect (regcache, i, regs + m68kbsd_fpreg_offset (i));
101
    }
102
}
103
 
104
 
105
/* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
106
   for all registers (including the floating-point registers).  */
107
 
108
static void
109
m68kbsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
110
{
111
  if (regnum == -1 || m68kbsd_gregset_supplies_p (regnum))
112
    {
113
      struct reg regs;
114
 
115
      if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
116
                  (PTRACE_TYPE_ARG3) &regs, 0) == -1)
117
        perror_with_name (_("Couldn't get registers"));
118
 
119
      m68kbsd_supply_gregset (regcache, &regs);
120
    }
121
 
122
  if (regnum == -1 || m68kbsd_fpregset_supplies_p (regnum))
123
    {
124
      struct fpreg fpregs;
125
 
126
      if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
127
                  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
128
        perror_with_name (_("Couldn't get floating point status"));
129
 
130
      m68kbsd_supply_fpregset (regcache, &fpregs);
131
    }
132
}
133
 
134
/* Store register REGNUM back into the inferior.  If REGNUM is -1, do
135
   this for all registers (including the floating-point registers).  */
136
 
137
static void
138
m68kbsd_store_inferior_registers (struct regcache *regcache, int regnum)
139
{
140
  if (regnum == -1 || m68kbsd_gregset_supplies_p (regnum))
141
    {
142
      struct reg regs;
143
 
144
      if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
145
                  (PTRACE_TYPE_ARG3) &regs, 0) == -1)
146
        perror_with_name (_("Couldn't get registers"));
147
 
148
      m68kbsd_collect_gregset (regcache, &regs, regnum);
149
 
150
      if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
151
                  (PTRACE_TYPE_ARG3) &regs, 0) == -1)
152
        perror_with_name (_("Couldn't write registers"));
153
    }
154
 
155
  if (regnum == -1 || m68kbsd_fpregset_supplies_p (regnum))
156
    {
157
      struct fpreg fpregs;
158
 
159
      if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
160
                  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
161
        perror_with_name (_("Couldn't get floating point status"));
162
 
163
      m68kbsd_collect_fpregset (regcache, &fpregs, regnum);
164
 
165
      if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
166
                  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
167
        perror_with_name (_("Couldn't write floating point status"));
168
    }
169
}
170
 
171
 
172
/* Support for debugging kernel virtual memory images.  */
173
 
174
#include <sys/types.h>
175
#include <machine/pcb.h>
176
 
177
#include "bsd-kvm.h"
178
 
179
/* OpenBSD doesn't have these.  */
180
#ifndef PCB_REGS_FP
181
#define PCB_REGS_FP 10
182
#endif
183
#ifndef PCB_REGS_SP
184
#define PCB_REGS_SP 11
185
#endif
186
 
187
static int
188
m68kbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
189
{
190
  int regnum, tmp;
191
  int i = 0;
192
 
193
  /* The following is true for NetBSD 1.6.2:
194
 
195
     The pcb contains %d2...%d7, %a2...%a7 and %ps.  This accounts for
196
     all callee-saved registers.  From this information we reconstruct
197
     the register state as it would look when we just returned from
198
     cpu_switch().  */
199
 
200
  /* The stack pointer shouldn't be zero.  */
201
  if (pcb->pcb_regs[PCB_REGS_SP] == 0)
202
    return 0;
203
 
204
  for (regnum = M68K_D2_REGNUM; regnum <= M68K_D7_REGNUM; regnum++)
205
    regcache_raw_supply (regcache, regnum, &pcb->pcb_regs[i++]);
206
  for (regnum = M68K_A2_REGNUM; regnum <= M68K_SP_REGNUM; regnum++)
207
    regcache_raw_supply (regcache, regnum, &pcb->pcb_regs[i++]);
208
 
209
  tmp = pcb->pcb_ps & 0xffff;
210
  regcache_raw_supply (regcache, M68K_PS_REGNUM, &tmp);
211
 
212
  read_memory (pcb->pcb_regs[PCB_REGS_FP] + 4, (char *) &tmp, sizeof tmp);
213
  regcache_raw_supply (regcache, M68K_PC_REGNUM, &tmp);
214
 
215
  return 1;
216
}
217
 
218
 
219
/* Provide a prototype to silence -Wmissing-prototypes.  */
220
void _initialize_m68kbsd_nat (void);
221
 
222
void
223
_initialize_m68kbsd_nat (void)
224
{
225
  struct target_ops *t;
226
 
227
  t = inf_ptrace_target ();
228
  t->to_fetch_registers = m68kbsd_fetch_inferior_registers;
229
  t->to_store_registers = m68kbsd_store_inferior_registers;
230
  add_target (t);
231
 
232
  /* Support debugging kernel virtual memory images.  */
233
  bsd_kvm_add_target (m68kbsd_supply_pcb);
234
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.