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