OSDN Git Service

r284@cf-ppc-macosx: monabuilder | 2008-12-07 10:57:41 +0900
[pf3gnuchains/pf3gnuchains3x.git] / gdb / gdbserver / linux-cris-low.c
1 /* GNU/Linux/CRIS specific low level interface, for the remote server for GDB.
2    Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3    2007, 2008 Free Software Foundation, Inc.
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
9    the Free Software Foundation; either version 3 of the License, or
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
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "server.h"
21 #include "linux-low.h"
22 #include <sys/ptrace.h>
23
24 /* Defined in auto-generated file reg-cris.c.  */
25 void init_registers_cris (void);
26
27 /* CRISv10 */
28 #define cris_num_regs 32
29
30 /* Locations need to match <include/asm/arch/ptrace.h>.  */
31 static 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
41   
42 };
43
44 static int
45 cris_cannot_store_register (int regno)
46 {
47   if (cris_regmap[regno] == -1)
48     return 1;
49   
50   return (regno >= cris_num_regs);
51 }
52
53 static int
54 cris_cannot_fetch_register (int regno)
55 {
56   if (cris_regmap[regno] == -1)
57     return 1;
58
59   return (regno >= cris_num_regs);
60 }
61
62 extern int debug_threads;
63
64 static CORE_ADDR
65 cris_get_pc (void)
66 {
67   unsigned long pc;
68   collect_register_by_name ("pc", &pc);
69   if (debug_threads)
70     fprintf (stderr, "stop pc is %08lx\n", pc);
71   return pc;
72 }
73
74 static void
75 cris_set_pc (CORE_ADDR pc)
76 {
77   unsigned long newpc = pc;
78   supply_register_by_name ("pc", &newpc);
79 }
80
81 static const unsigned short cris_breakpoint = 0xe938;
82 #define cris_breakpoint_len 2
83
84 static int
85 cris_breakpoint_at (CORE_ADDR where)
86 {
87   unsigned short insn;
88
89   (*the_target->read_memory) (where, (unsigned char *) &insn,
90                               cris_breakpoint_len);
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.  */
102 static CORE_ADDR
103 cris_reinsert_addr (void)
104 {
105   unsigned long pc;
106   collect_register_by_name ("srp", &pc);
107   return pc;
108 }
109
110 struct linux_target_ops the_low_target = {
111   init_registers_cris,
112   cris_num_regs,
113   cris_regmap,
114   cris_cannot_fetch_register,
115   cris_cannot_store_register,
116   cris_get_pc,
117   cris_set_pc,
118   (const unsigned char *) &cris_breakpoint,
119   cris_breakpoint_len,
120   cris_reinsert_addr,
121   0,
122   cris_breakpoint_at,
123   0,
124   0,
125   0,
126   0,
127 };