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