2011-02-11 Yao Qi <yao@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-m32r-low.c
CommitLineData
7cfbc4a0 1/* GNU/Linux/m32r specific low level interface, for the remote server for GDB.
7b6bb8da
JB
2 Copyright (C) 2005, 2007, 2008, 2009, 2010, 2011
3 Free Software Foundation, Inc.
7cfbc4a0
KI
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
7cfbc4a0
KI
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/>. */
7cfbc4a0
KI
19
20#include "server.h"
21#include "linux-low.h"
22
23#ifdef HAVE_SYS_REG_H
24#include <sys/reg.h>
25#endif
26
d05b4ac3
UW
27/* Defined in auto-generated file reg-m32r.c. */
28void init_registers_m32r (void);
29
7cfbc4a0
KI
30#define m32r_num_regs 25
31
32static int m32r_regmap[] = {
33#ifdef PT_R0
34 PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5, PT_R6, PT_R7,
35 PT_R8, PT_R9, PT_R10, PT_R11, PT_R12, PT_FP, PT_LR, PT_SPU,
36 PT_PSW, PT_CBR, PT_SPI, PT_SPU, PT_BPC, PT_PC, PT_ACCL, PT_ACCH, PT_EVB
37#else
38 4 * 4, 4 * 5, 4 * 6, 4 * 7, 4 * 0, 4 * 1, 4 * 2, 4 * 8,
39 4 * 9, 4 * 10, 4 * 11, 4 * 12, 4 * 13, 4 * 24, 4 * 25, 4 * 23,
40 4 * 19, 4 * 31, 4 * 26, 4 * 23, 4 * 20, 4 * 30, 4 * 16, 4 * 15, 4 * 32
41#endif
42};
43
44static int
45m32r_cannot_store_register (int regno)
46{
47 return (regno >= m32r_num_regs);
48}
49
50static int
51m32r_cannot_fetch_register (int regno)
52{
53 return (regno >= m32r_num_regs);
54}
55
56static CORE_ADDR
442ea881 57m32r_get_pc (struct regcache *regcache)
7cfbc4a0
KI
58{
59 unsigned long pc;
442ea881
PA
60 collect_register_by_name (regcache, "pc", &pc);
61 if (debug_threads)
62 fprintf (stderr, "stop pc is %08lx\n", pc);
7cfbc4a0
KI
63 return pc;
64}
65
66static void
442ea881 67m32r_set_pc (struct regcache *regcache, CORE_ADDR pc)
7cfbc4a0
KI
68{
69 unsigned long newpc = pc;
442ea881 70 supply_register_by_name (regcache, "pc", &newpc);
7cfbc4a0
KI
71}
72
73static const unsigned short m32r_breakpoint = 0x10f1;
74#define m32r_breakpoint_len 2
75
76static int
77m32r_breakpoint_at (CORE_ADDR where)
78{
79 unsigned short insn;
80
f450004a
DJ
81 (*the_target->read_memory) (where, (unsigned char *) &insn,
82 m32r_breakpoint_len);
7cfbc4a0
KI
83 if (insn == m32r_breakpoint)
84 return 1;
85
86 /* If necessary, recognize more trap instructions here. GDB only uses the
87 one. */
88 return 0;
89}
90
91struct linux_target_ops the_low_target = {
d05b4ac3 92 init_registers_m32r,
7cfbc4a0
KI
93 m32r_num_regs,
94 m32r_regmap,
95 m32r_cannot_fetch_register,
96 m32r_cannot_store_register,
97 m32r_get_pc,
98 m32r_set_pc,
f450004a 99 (const unsigned char *) &m32r_breakpoint,
7cfbc4a0
KI
100 m32r_breakpoint_len,
101 NULL,
102 0,
103 m32r_breakpoint_at,
104};
This page took 0.440868 seconds and 4 git commands to generate.