1/* Simulator watchpoint support. 2 Copyright (C) 1997, 2007, 2008, 2009, 2010, 2011 3 Free Software Foundation, Inc. 4 Contributed by Cygnus Support. 5 6This file is part of GDB, the GNU debugger. 7 8This program is free software; you can redistribute it and/or modify 9it under the terms of the GNU General Public License as published by 10the Free Software Foundation; either version 3 of the License, or 11(at your option) any later version. 12 13This program is distributed in the hope that it will be useful, 14but WITHOUT ANY WARRANTY; without even the implied warranty of 15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License 19along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20 21 22#ifndef SIM_WATCH_H 23#define SIM_WATCH_H 24 25typedef enum { 26 invalid_watchpoint = -1, 27 pc_watchpoint, 28 clock_watchpoint, 29 cycles_watchpoint, 30 nr_watchpoint_types, 31} watchpoint_type; 32 33typedef struct _sim_watch_point sim_watch_point; 34struct _sim_watch_point { 35 int ident; 36 watchpoint_type type; 37 int interrupt_nr; /* == nr_interrupts -> breakpoint */ 38 int is_periodic; 39 int is_within; 40 unsigned long arg0; 41 unsigned long arg1; 42 sim_event *event; 43 sim_watch_point *next; 44}; 45 46 47typedef struct _sim_watchpoints { 48 49 /* Pointer into the host's data structures specifying the 50 address/size of the program-counter */ 51 /* FIXME: In the future this shall be generalized so that any of the 52 N processors M registers can be watched */ 53 void *pc; 54 int sizeof_pc; 55 56 /* Pointer to the handler for interrupt watchpoints */ 57 /* FIXME: can this be done better? */ 58 /* NOTE: For the DATA arg, the handler is passed a (char**) pointer 59 that is an offset into the INTERRUPT_NAMES vector. Use 60 arithmetic to determine the interrupt-nr. */ 61 sim_event_handler *interrupt_handler; 62 63 /* Pointer to a null terminated list of interrupt names */ 64 /* FIXME: can this be done better? Look at the PPC's interrupt 65 mechanism and table for a rough idea of where it will go next */ 66 int nr_interrupts; 67 const char **interrupt_names; 68 69 /* active watchpoints */ 70 int last_point_nr; 71 sim_watch_point *points; 72 73} sim_watchpoints; 74 75/* Watch install handler. */ 76MODULE_INSTALL_FN sim_watchpoint_install; 77 78#endif /* SIM_WATCH_H */ 79