/* Simulator watchpoint support.
   Copyright (C) 1997-2021 Free Software Foundation, Inc.
   Contributed by Cygnus Support.

This file is part of GDB, the GNU debugger.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.  */


#ifndef SIM_WATCH_H
#define SIM_WATCH_H

typedef enum {
  invalid_watchpoint = -1,
  pc_watchpoint,
  clock_watchpoint,
  cycles_watchpoint,
  nr_watchpoint_types,
} watchpoint_type;

typedef struct _sim_watch_point sim_watch_point;
struct _sim_watch_point {
  int ident;
  watchpoint_type type;
  int interrupt_nr; /* == nr_interrupts -> breakpoint */
  int is_periodic;
  int is_within;
  unsigned long arg0;
  unsigned long arg1;
  sim_event *event;
  sim_watch_point *next;
};


typedef struct _sim_watchpoints {

  /* Pointer into the host's data structures specifying the
     address/size of the program-counter */
  /* FIXME: In the future this shall be generalized so that any of the
     N processors M registers can be watched */

  /* Pointer to the handler for interrupt watchpoints */
  /* FIXME: can this be done better? */
  /* NOTE: For the DATA arg, the handler is passed a (char**) pointer
     that is an offset into the INTERRUPT_NAMES vector.  Use
     arithmetic to determine the interrupt-nr. */
  sim_event_handler *interrupt_handler;

  /* Pointer to a null terminated list of interrupt names */
  /* FIXME: can this be done better?  Look at the PPC's interrupt
     mechanism and table for a rough idea of where it will go next */
  int nr_interrupts;
  const char **interrupt_names;

  /* active watchpoints */
  int last_point_nr;
  sim_watch_point *points;

} sim_watchpoints;

/* Watch install handler.  */
MODULE_INSTALL_FN sim_watchpoint_install;

#endif /* SIM_WATCH_H */
