* linux-m68k-low.c: Include <asm/ptrace.h>
[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,
4c38e0a4 3 2007, 2008, 2009, 2010 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
442ea881 74m68k_fill_gregset (struct regcache *regcache, void *buf)
db1d3e1b
AS
75{
76 int i;
77
78 for (i = 0; i < m68k_num_gregs; i++)
442ea881 79 collect_register (regcache, i, (char *) buf + m68k_regmap[i]);
db1d3e1b
AS
80}
81
82static void
442ea881 83m68k_store_gregset (struct regcache *regcache, const void *buf)
db1d3e1b
AS
84{
85 int i;
86
87 for (i = 0; i < m68k_num_gregs; i++)
442ea881 88 supply_register (regcache, i, (const char *) buf + m68k_regmap[i]);
db1d3e1b
AS
89}
90
91static void
442ea881 92m68k_fill_fpregset (struct regcache *regcache, void *buf)
db1d3e1b
AS
93{
94 int i;
95
96 for (i = m68k_num_gregs; i < m68k_num_regs; i++)
442ea881
PA
97 collect_register (regcache, i, ((char *) buf
98 + (m68k_regmap[i] - m68k_regmap[m68k_num_gregs])));
db1d3e1b
AS
99}
100
101static void
442ea881 102m68k_store_fpregset (struct regcache *regcache, const void *buf)
db1d3e1b
AS
103{
104 int i;
105
106 for (i = m68k_num_gregs; i < m68k_num_regs; i++)
442ea881 107 supply_register (regcache, i, ((const char *) buf
db1d3e1b
AS
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
1570b33e 115 { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t),
db1d3e1b
AS
116 GENERAL_REGS,
117 m68k_fill_gregset, m68k_store_gregset },
1570b33e 118 { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, sizeof (elf_fpregset_t),
db1d3e1b
AS
119 FP_REGS,
120 m68k_fill_fpregset, m68k_store_fpregset },
e9d25b98 121#endif /* HAVE_PTRACE_GETREGS */
1570b33e 122 { 0, 0, 0, -1, -1, NULL, NULL }
db1d3e1b
AS
123};
124
f450004a 125static const unsigned char m68k_breakpoint[] = { 0x4E, 0x4F };
db1d3e1b
AS
126#define m68k_breakpoint_len 2
127
128static CORE_ADDR
442ea881 129m68k_get_pc (struct regcache *regcache)
db1d3e1b
AS
130{
131 unsigned long pc;
132
442ea881 133 collect_register_by_name (regcache, "pc", &pc);
db1d3e1b
AS
134 return pc;
135}
136
137static void
442ea881 138m68k_set_pc (struct regcache *regcache, CORE_ADDR value)
db1d3e1b
AS
139{
140 unsigned long newpc = value;
141
442ea881 142 supply_register_by_name (regcache, "pc", &newpc);
db1d3e1b
AS
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
fea36a59
MK
157#include <asm/ptrace.h>
158
159/* Fetch the thread-local storage pointer for libthread_db. */
160
161ps_err_e
162ps_get_thread_area (const struct ps_prochandle *ph,
163 lwpid_t lwpid, int idx, void **base)
164{
165 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
166 return PS_ERR;
167
168 /* IDX is the bias from the thread pointer to the beginning of the
169 thread descriptor. It has to be subtracted due to implementation
170 quirks in libthread_db. */
171 *base = (void *) ((char *)*base - idx);
172
173 return PS_OK;
174}
175
2ec06d2e 176struct linux_target_ops the_low_target = {
d05b4ac3 177 init_registers_m68k,
2ec06d2e
DJ
178 m68k_num_regs,
179 m68k_regmap,
180 m68k_cannot_fetch_register,
181 m68k_cannot_store_register,
db1d3e1b
AS
182 m68k_get_pc,
183 m68k_set_pc,
184 m68k_breakpoint,
185 m68k_breakpoint_len,
186 NULL,
187 2,
188 m68k_breakpoint_at,
2ec06d2e 189};
This page took 0.92914 seconds and 4 git commands to generate.