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 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/* 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
86  (*the_target->read_memory) (where, (unsigned char *) &insn,
87			      cris_breakpoint_len);
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,
114  (const unsigned char *) &cris_breakpoint,
115  cris_breakpoint_len,
116  cris_reinsert_addr,
117  0,
118  cris_breakpoint_at,
119  0,
120  0,
121  0,
122  0,
123};
124