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