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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [gdb/] [ppcnbsd-nat.c] - Blame information for rev 24

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

Line No. Rev Author Line
1 24 jeremybenn
/* Native-dependent code for NetBSD/powerpc.
2
 
3
   Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008
4
   Free Software Foundation, Inc.
5
 
6
   Contributed by Wasabi Systems, Inc.
7
 
8
   This file is part of GDB.
9
 
10
   This program is free software; you can redistribute it and/or modify
11
   it under the terms of the GNU General Public License as published by
12
   the Free Software Foundation; either version 3 of the License, or
13
   (at your option) any later version.
14
 
15
   This program is distributed in the hope that it will be useful,
16
   but WITHOUT ANY WARRANTY; without even the implied warranty of
17
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
   GNU General Public License for more details.
19
 
20
   You should have received a copy of the GNU General Public License
21
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
 
23
#include <sys/types.h>
24
#include <sys/ptrace.h>
25
#include <machine/reg.h>
26
#include <machine/frame.h>
27
#include <machine/pcb.h>
28
 
29
#include "defs.h"
30
#include "gdbcore.h"
31
#include "inferior.h"
32
#include "regcache.h"
33
 
34
#include "gdb_assert.h"
35
 
36
#include "ppc-tdep.h"
37
#include "ppcnbsd-tdep.h"
38
#include "bsd-kvm.h"
39
#include "inf-ptrace.h"
40
 
41
/* Returns true if PT_GETREGS fetches this register.  */
42
 
43
static int
44
getregs_supplies (struct gdbarch *gdbarch, int regnum)
45
{
46
  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
47
 
48
  return ((regnum >= tdep->ppc_gp0_regnum
49
           && regnum < tdep->ppc_gp0_regnum + ppc_num_gprs)
50
          || regnum == tdep->ppc_lr_regnum
51
          || regnum == tdep->ppc_cr_regnum
52
          || regnum == tdep->ppc_xer_regnum
53
          || regnum == tdep->ppc_ctr_regnum
54
          || regnum == gdbarch_pc_regnum (gdbarch));
55
}
56
 
57
/* Like above, but for PT_GETFPREGS.  */
58
 
59
static int
60
getfpregs_supplies (struct gdbarch *gdbarch, int regnum)
61
{
62
  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
63
 
64
  /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
65
     point registers.  Traditionally, GDB's register set has still
66
     listed the floating point registers for such machines, so this
67
     code is harmless.  However, the new E500 port actually omits the
68
     floating point registers entirely from the register set --- they
69
     don't even have register numbers assigned to them.
70
 
71
     It's not clear to me how best to update this code, so this assert
72
     will alert the first person to encounter the NetBSD/E500
73
     combination to the problem.  */
74
  gdb_assert (ppc_floating_point_unit_p (gdbarch));
75
 
76
  return ((regnum >= tdep->ppc_fp0_regnum
77
           && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs)
78
          || regnum == tdep->ppc_fpscr_regnum);
79
}
80
 
81
static void
82
ppcnbsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
83
{
84
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
85
 
86
  if (regnum == -1 || getregs_supplies (gdbarch, regnum))
87
    {
88
      struct reg regs;
89
 
90
      if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
91
                  (PTRACE_TYPE_ARG3) &regs, 0) == -1)
92
        perror_with_name (_("Couldn't get registers"));
93
 
94
      ppc_supply_gregset (&ppcnbsd_gregset, regcache,
95
                          regnum, &regs, sizeof regs);
96
    }
97
 
98
  if (regnum == -1 || getfpregs_supplies (gdbarch, regnum))
99
    {
100
      struct fpreg fpregs;
101
 
102
      if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
103
                  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
104
        perror_with_name (_("Couldn't get FP registers"));
105
 
106
      ppc_supply_fpregset (&ppcnbsd_fpregset, regcache,
107
                           regnum, &fpregs, sizeof fpregs);
108
    }
109
}
110
 
111
static void
112
ppcnbsd_store_inferior_registers (struct regcache *regcache, int regnum)
113
{
114
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
115
 
116
  if (regnum == -1 || getregs_supplies (gdbarch, regnum))
117
    {
118
      struct reg regs;
119
 
120
      if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
121
                  (PTRACE_TYPE_ARG3) &regs, 0) == -1)
122
        perror_with_name (_("Couldn't get registers"));
123
 
124
      ppc_collect_gregset (&ppcnbsd_gregset, regcache,
125
                           regnum, &regs, sizeof regs);
126
 
127
      if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
128
                  (PTRACE_TYPE_ARG3) &regs, 0) == -1)
129
        perror_with_name (_("Couldn't write registers"));
130
    }
131
 
132
  if (regnum == -1 || getfpregs_supplies (gdbarch, regnum))
133
    {
134
      struct fpreg fpregs;
135
 
136
      if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
137
                  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
138
        perror_with_name (_("Couldn't get FP registers"));
139
 
140
      ppc_collect_fpregset (&ppcnbsd_fpregset, regcache,
141
                            regnum, &fpregs, sizeof fpregs);
142
 
143
      if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
144
                  (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
145
        perror_with_name (_("Couldn't set FP registers"));
146
    }
147
}
148
 
149
static int
150
ppcnbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
151
{
152
  struct switchframe sf;
153
  struct callframe cf;
154
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
155
  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
156
  int i;
157
 
158
  /* The stack pointer shouldn't be zero.  */
159
  if (pcb->pcb_sp == 0)
160
    return 0;
161
 
162
  read_memory (pcb->pcb_sp, (gdb_byte *)&sf, sizeof sf);
163
  regcache_raw_supply (regcache, tdep->ppc_cr_regnum, &sf.cr);
164
  regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 2, &sf.fixreg2);
165
  for (i = 0 ; i < 19 ; i++)
166
    regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 13 + i,
167
                         &sf.fixreg[i]);
168
 
169
  read_memory(sf.sp, (gdb_byte *)&cf, sizeof(cf));
170
  regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 30, &cf.r30);
171
  regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 31, &cf.r31);
172
  regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 1, &cf.sp);
173
 
174
  read_memory(cf.sp, (gdb_byte *)&cf, sizeof(cf));
175
  regcache_raw_supply (regcache, tdep->ppc_lr_regnum, &cf.lr);
176
  regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch), &cf.lr);
177
 
178
  return 1;
179
}
180
 
181
/* Provide a prototype to silence -Wmissing-prototypes.  */
182
void _initialize_ppcnbsd_nat (void);
183
 
184
void
185
_initialize_ppcnbsd_nat (void)
186
{
187
  struct target_ops *t;
188
 
189
  /* Support debugging kernel virtual memory images.  */
190
  bsd_kvm_add_target (ppcnbsd_supply_pcb);
191
 
192
  /* Add in local overrides.  */
193
  t = inf_ptrace_target ();
194
  t->to_fetch_registers = ppcnbsd_fetch_inferior_registers;
195
  t->to_store_registers = ppcnbsd_store_inferior_registers;
196
  add_target (t);
197
}

powered by: WebSVN 2.1.0

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