gdb/
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-cris-low.c
CommitLineData
45b134e5 1/* GNU/Linux/CRIS specific low level interface, for the remote server for GDB.
6aba47ca 2 Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
7b6bb8da 3 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
45b134e5
OF
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
45b134e5
OF
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/>. */
45b134e5
OF
19
20#include "server.h"
21#include "linux-low.h"
22#include <sys/ptrace.h>
23
d05b4ac3
UW
24/* Defined in auto-generated file reg-cris.c. */
25void init_registers_cris (void);
26
45b134e5
OF
27/* CRISv10 */
28#define cris_num_regs 32
29
30/* Locations need to match <include/asm/arch/ptrace.h>. */
31static int cris_regmap[] = {
32 15*4, 14*4, 13*4, 12*4,
33 11*4, 10*4, 9*4, 8*4,
34 7*4, 6*4, 5*4, 4*4,
35 3*4, 2*4, 23*4, 19*4,
36
37 -1, -1, -1, -1,
38 -1, 17*4, -1, 16*4,
39 -1, -1, -1, 18*4,
40 -1, 17*4, -1, -1
1b3f6016 41
45b134e5
OF
42};
43
44static int
45cris_cannot_store_register (int regno)
46{
47 if (cris_regmap[regno] == -1)
48 return 1;
1b3f6016 49
45b134e5
OF
50 return (regno >= cris_num_regs);
51}
52
53static int
54cris_cannot_fetch_register (int regno)
55{
56 if (cris_regmap[regno] == -1)
57 return 1;
58
59 return (regno >= cris_num_regs);
60}
61
62extern int debug_threads;
63
64static CORE_ADDR
442ea881 65cris_get_pc (struct regcache *regcache, void)
45b134e5
OF
66{
67 unsigned long pc;
442ea881 68 collect_register_by_name (regcache, "pc", &pc);
45b134e5
OF
69 if (debug_threads)
70 fprintf (stderr, "stop pc is %08lx\n", pc);
71 return pc;
72}
73
74static void
442ea881 75cris_set_pc (struct regcache *regcache, CORE_ADDR pc)
45b134e5
OF
76{
77 unsigned long newpc = pc;
442ea881 78 supply_register_by_name (regcache, "pc", &newpc);
45b134e5
OF
79}
80
81static const unsigned short cris_breakpoint = 0xe938;
82#define cris_breakpoint_len 2
83
84static int
85cris_breakpoint_at (CORE_ADDR where)
86{
87 unsigned short insn;
88
f450004a
DJ
89 (*the_target->read_memory) (where, (unsigned char *) &insn,
90 cris_breakpoint_len);
45b134e5
OF
91 if (insn == cris_breakpoint)
92 return 1;
93
94 /* If necessary, recognize more trap instructions here. GDB only uses the
95 one. */
96 return 0;
97}
98
99/* We only place breakpoints in empty marker functions, and thread locking
100 is outside of the function. So rather than importing software single-step,
101 we can just run until exit. */
102static CORE_ADDR
103cris_reinsert_addr (void)
104{
442ea881 105 struct regcache *regcache = get_thread_regcache (current_inferior, 1);
45b134e5 106 unsigned long pc;
442ea881 107 collect_register_by_name (regcache, "srp", &pc);
45b134e5
OF
108 return pc;
109}
110
111struct linux_target_ops the_low_target = {
d05b4ac3 112 init_registers_cris,
45b134e5
OF
113 cris_num_regs,
114 cris_regmap,
115 cris_cannot_fetch_register,
116 cris_cannot_store_register,
117 cris_get_pc,
118 cris_set_pc,
f450004a 119 (const unsigned char *) &cris_breakpoint,
45b134e5
OF
120 cris_breakpoint_len,
121 cris_reinsert_addr,
122 0,
123 cris_breakpoint_at,
124 0,
125 0,
126 0,
127 0,
128};
This page took 0.522264 seconds and 4 git commands to generate.