* gdb.texinfo (Omissions from Ada): Remove incorrect documentation
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-m68k-low.c
CommitLineData
0a30fbc4 1/* GNU/Linux/m68k specific low level interface, for the remote server for GDB.
6aba47ca 2 Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
9b254dd1 3 2007, 2008 Free Software Foundation, Inc.
0a30fbc4
DJ
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
0a30fbc4
DJ
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/>. */
0a30fbc4
DJ
19
20#include "server.h"
58caa3dc 21#include "linux-low.h"
0a30fbc4 22
d05b4ac3
UW
23/* Defined in auto-generated file reg-m68k.c. */
24void init_registers_m68k (void);
25
0a30fbc4
DJ
26#ifdef HAVE_SYS_REG_H
27#include <sys/reg.h>
28#endif
29
4c0711e0 30#define m68k_num_regs 29
db1d3e1b 31#define m68k_num_gregs 18
0a30fbc4
DJ
32
33/* This table must line up with REGISTER_NAMES in tm-m68k.h */
2ec06d2e 34static int m68k_regmap[] =
0a30fbc4
DJ
35{
36#ifdef PT_D0
37 PT_D0 * 4, PT_D1 * 4, PT_D2 * 4, PT_D3 * 4,
38 PT_D4 * 4, PT_D5 * 4, PT_D6 * 4, PT_D7 * 4,
39 PT_A0 * 4, PT_A1 * 4, PT_A2 * 4, PT_A3 * 4,
40 PT_A4 * 4, PT_A5 * 4, PT_A6 * 4, PT_USP * 4,
41 PT_SR * 4, PT_PC * 4,
42#else
43 14 * 4, 0 * 4, 1 * 4, 2 * 4, 3 * 4, 4 * 4, 5 * 4, 6 * 4,
44 7 * 4, 8 * 4, 9 * 4, 10 * 4, 11 * 4, 12 * 4, 13 * 4, 15 * 4,
45 17 * 4, 18 * 4,
46#endif
47#ifdef PT_FP0
48 PT_FP0 * 4, PT_FP1 * 4, PT_FP2 * 4, PT_FP3 * 4,
49 PT_FP4 * 4, PT_FP5 * 4, PT_FP6 * 4, PT_FP7 * 4,
50 PT_FPCR * 4, PT_FPSR * 4, PT_FPIAR * 4
51#else
52 21 * 4, 24 * 4, 27 * 4, 30 * 4, 33 * 4, 36 * 4,
53 39 * 4, 42 * 4, 45 * 4, 46 * 4, 47 * 4
54#endif
55};
56
2ec06d2e
DJ
57static int
58m68k_cannot_store_register (int regno)
0a30fbc4 59{
2ec06d2e 60 return (regno >= m68k_num_regs);
0a30fbc4
DJ
61}
62
2ec06d2e
DJ
63static int
64m68k_cannot_fetch_register (int regno)
0a30fbc4 65{
2ec06d2e 66 return (regno >= m68k_num_regs);
0a30fbc4 67}
2ec06d2e 68
e9d25b98 69#ifdef HAVE_PTRACE_GETREGS
db1d3e1b
AS
70#include <sys/procfs.h>
71#include <sys/ptrace.h>
72
73static void
74m68k_fill_gregset (void *buf)
75{
76 int i;
77
78 for (i = 0; i < m68k_num_gregs; i++)
79 collect_register (i, (char *) buf + m68k_regmap[i]);
80}
81
82static void
83m68k_store_gregset (const void *buf)
84{
85 int i;
86
87 for (i = 0; i < m68k_num_gregs; i++)
88 supply_register (i, (const char *) buf + m68k_regmap[i]);
89}
90
91static void
92m68k_fill_fpregset (void *buf)
93{
94 int i;
95
96 for (i = m68k_num_gregs; i < m68k_num_regs; i++)
97 collect_register (i, ((char *) buf
98 + (m68k_regmap[i] - m68k_regmap[m68k_num_gregs])));
99}
100
101static void
102m68k_store_fpregset (const void *buf)
103{
104 int i;
105
106 for (i = m68k_num_gregs; i < m68k_num_regs; i++)
107 supply_register (i, ((const char *) buf
108 + (m68k_regmap[i] - m68k_regmap[m68k_num_gregs])));
109}
110
e9d25b98 111#endif /* HAVE_PTRACE_GETREGS */
db1d3e1b
AS
112
113struct regset_info target_regsets[] = {
e9d25b98 114#ifdef HAVE_PTRACE_GETREGS
db1d3e1b
AS
115 { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
116 GENERAL_REGS,
117 m68k_fill_gregset, m68k_store_gregset },
118 { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
119 FP_REGS,
120 m68k_fill_fpregset, m68k_store_fpregset },
e9d25b98 121#endif /* HAVE_PTRACE_GETREGS */
db1d3e1b
AS
122 { 0, 0, -1, -1, NULL, NULL }
123};
124
f450004a 125static const unsigned char m68k_breakpoint[] = { 0x4E, 0x4F };
db1d3e1b
AS
126#define m68k_breakpoint_len 2
127
128static CORE_ADDR
129m68k_get_pc ()
130{
131 unsigned long pc;
132
133 collect_register_by_name ("pc", &pc);
134 return pc;
135}
136
137static void
138m68k_set_pc (CORE_ADDR value)
139{
140 unsigned long newpc = value;
141
142 supply_register_by_name ("pc", &newpc);
143}
144
145static int
146m68k_breakpoint_at (CORE_ADDR pc)
147{
148 unsigned char c[2];
149
150 read_inferior_memory (pc, c, 2);
151 if (c[0] == 0x4E && c[1] == 0x4F)
152 return 1;
153
154 return 0;
155}
156
2ec06d2e 157struct linux_target_ops the_low_target = {
d05b4ac3 158 init_registers_m68k,
2ec06d2e
DJ
159 m68k_num_regs,
160 m68k_regmap,
161 m68k_cannot_fetch_register,
162 m68k_cannot_store_register,
db1d3e1b
AS
163 m68k_get_pc,
164 m68k_set_pc,
165 m68k_breakpoint,
166 m68k_breakpoint_len,
167 NULL,
168 2,
169 m68k_breakpoint_at,
2ec06d2e 170};
This page took 0.474146 seconds and 4 git commands to generate.