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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [gdb/] [alphabsd-nat.c] - Blame information for rev 1181

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

Line No. Rev Author Line
1 1181 sfurman
/* Native-dependent code for Alpha BSD's.
2
   Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
3
 
4
   This file is part of GDB.
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 2 of the License, or
9
   (at your option) any later version.
10
 
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
 
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 59 Temple Place - Suite 330,
19
   Boston, MA 02111-1307, USA.  */
20
 
21
#include "defs.h"
22
#include "inferior.h"
23
#include "regcache.h"
24
 
25
#include "alpha-tdep.h"
26
#include "alphabsd-tdep.h"
27
 
28
#include <sys/types.h>
29
#include <sys/ptrace.h>
30
#include <machine/reg.h>
31
 
32
#ifdef HAVE_SYS_PROCFS_H
33
#include <sys/procfs.h>
34
#endif
35
 
36
#ifndef HAVE_GREGSET_T
37
typedef struct reg gregset_t;
38
#endif
39
 
40
#ifndef HAVE_FPREGSET_T 
41
typedef struct fpreg fpregset_t;
42
#endif 
43
 
44
#include "gregset.h"
45
 
46
/* Provide *regset() wrappers around the generic Alpha BSD register
47
   supply/fill routines.  */
48
 
49
void
50
supply_gregset (gregset_t *gregsetp)
51
{
52
  alphabsd_supply_reg ((char *) gregsetp, -1);
53
}
54
 
55
void
56
fill_gregset (gregset_t *gregsetp, int regno)
57
{
58
  alphabsd_fill_reg ((char *) gregsetp, regno);
59
}
60
 
61
void
62
supply_fpregset (fpregset_t *fpregsetp)
63
{
64
  alphabsd_supply_fpreg ((char *) fpregsetp, -1);
65
}
66
 
67
void
68
fill_fpregset (fpregset_t *fpregsetp, int regno)
69
{
70
  alphabsd_fill_fpreg ((char *) fpregsetp, regno);
71
}
72
 
73
/* Determine if PT_GETREGS fetches this register.  */
74
 
75
static int
76
getregs_supplies (int regno)
77
{
78
 
79
  return ((regno >= ALPHA_V0_REGNUM && regno <= ALPHA_ZERO_REGNUM)
80
          || regno >= PC_REGNUM);
81
}
82
 
83
 
84
/* Fetch register REGNO from the inferior.  If REGNO is -1, do this
85
   for all registers (including the floating point registers).  */
86
 
87
void
88
fetch_inferior_registers (int regno)
89
{
90
 
91
  if (regno == -1 || getregs_supplies (regno))
92
    {
93
      struct reg gregs;
94
 
95
      if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
96
                  (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
97
        perror_with_name ("Couldn't get registers");
98
 
99
      alphabsd_supply_reg ((char *) &gregs, regno);
100
      if (regno != -1)
101
        return;
102
    }
103
 
104
  if (regno == -1 || regno >= FP0_REGNUM)
105
    {
106
      struct fpreg fpregs;
107
 
108
      if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
109
                  (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
110
        perror_with_name ("Couldn't get floating point status");
111
 
112
      alphabsd_supply_fpreg ((char *) &fpregs, regno);
113
    }
114
 
115
  /* Reset virtual frame pointer.  */
116
  supply_register (FP_REGNUM, NULL);
117
}
118
 
119
/* Store register REGNO back into the inferior.  If REGNO is -1, do
120
   this for all registers (including the floating point registers).  */
121
 
122
void
123
store_inferior_registers (int regno)
124
{
125
 
126
  if (regno == -1 || getregs_supplies (regno))
127
    {
128
      struct reg gregs;
129
      if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
130
                  (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
131
        perror_with_name ("Couldn't get registers");
132
 
133
      alphabsd_fill_reg ((char *) &gregs, regno);
134
 
135
      if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
136
                  (PTRACE_ARG3_TYPE) &gregs, 0) == -1)
137
        perror_with_name ("Couldn't write registers");
138
 
139
      if (regno != -1)
140
        return;
141
    }
142
 
143
  if (regno == -1 || regno >= FP0_REGNUM)
144
    {
145
      struct fpreg fpregs;
146
 
147
      if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
148
                  (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
149
        perror_with_name ("Couldn't get floating point status");
150
 
151
      alphabsd_fill_fpreg ((char *) &fpregs, regno);
152
 
153
      if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
154
                  (PTRACE_ARG3_TYPE) &fpregs, 0) == -1)
155
        perror_with_name ("Couldn't write floating point status");
156
    }
157
}

powered by: WebSVN 2.1.0

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