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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [m68klinux-nat.c] - Blame information for rev 105

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

Line No. Rev Author Line
1 104 markom
/* Motorola m68k native support for Linux
2
   Copyright (C) 1996,1998 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 "frame.h"
23
#include "inferior.h"
24
#include "language.h"
25
#include "gdbcore.h"
26
 
27
#ifdef USG
28
#include <sys/types.h>
29
#endif
30
 
31
#include <sys/param.h>
32
#include <sys/dir.h>
33
#include <signal.h>
34
#include <sys/user.h>
35
#include <sys/ioctl.h>
36
#include <fcntl.h>
37
#include <sys/procfs.h>
38
 
39
#include <sys/file.h>
40
#include "gdb_stat.h"
41
 
42
#include "floatformat.h"
43
 
44
#include "target.h"
45
 
46
 
47
/* This table must line up with REGISTER_NAMES in tm-m68k.h */
48
static const int regmap[] =
49
{
50
  PT_D0, PT_D1, PT_D2, PT_D3, PT_D4, PT_D5, PT_D6, PT_D7,
51
  PT_A0, PT_A1, PT_A2, PT_A3, PT_A4, PT_A5, PT_A6, PT_USP,
52
  PT_SR, PT_PC,
53
  /* PT_FP0, ..., PT_FP7 */
54
  21, 24, 27, 30, 33, 36, 39, 42,
55
  /* PT_FPCR, PT_FPSR, PT_FPIAR */
56
  45, 46, 47
57
};
58
 
59
/* BLOCKEND is the value of u.u_ar0, and points to the place where GS
60
   is stored.  */
61
 
62
int
63
m68k_linux_register_u_addr (blockend, regnum)
64
     int blockend;
65
     int regnum;
66
{
67
  return (blockend + 4 * regmap[regnum]);
68
}
69
 
70
/*  Given a pointer to a general register set in /proc format (gregset_t *),
71
   unpack the register contents and supply them as gdb's idea of the current
72
   register values. */
73
 
74
 
75
/* Note both m68k-tdep.c and m68klinux-nat.c contain definitions
76
   for supply_gregset and supply_fpregset. The definitions
77
   in m68k-tdep.c are valid if USE_PROC_FS is defined. Otherwise,
78
   the definitions in m68klinux-nat.c will be used. This is a
79
   bit of a hack. The supply_* routines do not belong in
80
   *_tdep.c files. But, there are several lynx ports that currently
81
   depend on these definitions. */
82
 
83
#ifndef USE_PROC_FS
84
 
85
void
86
supply_gregset (gregsetp)
87
     gregset_t *gregsetp;
88
{
89
  int regi;
90
 
91
  for (regi = D0_REGNUM; regi <= SP_REGNUM; regi++)
92
    supply_register (regi, (char *) (*gregsetp + regmap[regi]));
93
  supply_register (PS_REGNUM, (char *) (*gregsetp + PT_SR));
94
  supply_register (PC_REGNUM, (char *) (*gregsetp + PT_PC));
95
}
96
 
97
/*  Given a pointer to a floating point register set in /proc format
98
   (fpregset_t *), unpack the register contents and supply them as gdb's
99
   idea of the current floating point register values. */
100
 
101
void
102
supply_fpregset (fpregsetp)
103
     fpregset_t *fpregsetp;
104
{
105
  int regi;
106
 
107
  for (regi = FP0_REGNUM; regi < FPC_REGNUM; regi++)
108
    supply_register (regi, (char *) &fpregsetp->fpregs[(regi - FP0_REGNUM) * 3]);
109
  supply_register (FPC_REGNUM, (char *) &fpregsetp->fpcntl[0]);
110
  supply_register (FPS_REGNUM, (char *) &fpregsetp->fpcntl[1]);
111
  supply_register (FPI_REGNUM, (char *) &fpregsetp->fpcntl[2]);
112
}
113
 
114
#endif
115
 
116
 
117
int
118
kernel_u_size ()
119
{
120
  return (sizeof (struct user));
121
}
122
 
123
/* Return non-zero if PC points into the signal trampoline.  */
124
 
125
int
126
in_sigtramp (pc)
127
     CORE_ADDR pc;
128
{
129
  CORE_ADDR sp;
130
  char buf[TARGET_SHORT_BIT / TARGET_CHAR_BIT];
131
  int insn;
132
 
133
  sp = read_register (SP_REGNUM);
134
  if (pc - 2 < sp)
135
    return 0;
136
 
137
  if (read_memory_nobpt (pc, buf, sizeof (buf)))
138
    return 0;
139
  insn = extract_unsigned_integer (buf, sizeof (buf));
140
  if (insn == 0xdefc            /* addaw #,sp */
141
      || insn == 0x7077         /* moveq #119,d0 */
142
      || insn == 0x4e40         /* trap #0 */
143
      || insn == 0x203c /* movel #,d0 */ )
144
    return 1;
145
 
146
  if (read_memory_nobpt (pc - 2, buf, sizeof (buf)))
147
    return 0;
148
  insn = extract_unsigned_integer (buf, sizeof (buf));
149
  if (insn == 0xdefc            /* addaw #,sp */
150
      || insn == 0x7077         /* moveq #119,d0 */
151
      || insn == 0x4e40         /* trap #0 */
152
      || insn == 0x203c /* movel #,d0 */ )
153
    return 1;
154
 
155
  return 0;
156
}

powered by: WebSVN 2.1.0

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