Home | History | Annotate | Download | only in gdb
      1 /* This file defines the interface between the simulator and gdb.
      2 
      3    Copyright (C) 1993-2016 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 #if !defined (REMOTE_SIM_H)
     21 #define REMOTE_SIM_H 1
     22 
     23 #ifdef __cplusplus
     24 extern "C" {
     25 #endif
     26 
     27 /* This file is used when building stand-alone simulators, so isolate this
     28    file from gdb.  */
     29 
     30 /* Pick up CORE_ADDR_TYPE if defined (from gdb), otherwise use same value as
     31    gdb does (unsigned int - from defs.h).  */
     32 
     33 #ifndef CORE_ADDR_TYPE
     34 typedef unsigned int SIM_ADDR;
     35 #else
     36 typedef CORE_ADDR_TYPE SIM_ADDR;
     37 #endif
     38 
     39 
     40 /* Semi-opaque type used as result of sim_open and passed back to all
     41    other routines.  "desc" is short for "descriptor".
     42    It is up to each simulator to define `sim_state'.  */
     43 
     44 typedef struct sim_state *SIM_DESC;
     45 
     46 
     47 /* Values for `kind' arg to sim_open.  */
     48 
     49 typedef enum {
     50   SIM_OPEN_STANDALONE, /* simulator used standalone (run.c) */
     51   SIM_OPEN_DEBUG       /* simulator used by debugger (gdb) */
     52 } SIM_OPEN_KIND;
     53 
     54 
     55 /* Return codes from various functions.  */
     56 
     57 typedef enum {
     58   SIM_RC_FAIL = 0,
     59   SIM_RC_OK = 1
     60 } SIM_RC;
     61 
     62 
     63 /* Some structs, as opaque types.  */
     64 
     65 struct bfd;
     66 struct host_callback_struct;
     67 
     68 
     69 /* Main simulator entry points.  */
     70 
     71 
     72 /* Create a fully initialized simulator instance.
     73 
     74    (This function is called when the simulator is selected from the
     75    gdb command line.)
     76 
     77    KIND specifies how the simulator shall be used.  Currently there
     78    are only two kinds: stand-alone and debug.
     79 
     80    CALLBACK specifies a standard host callback (defined in callback.h).
     81 
     82    ABFD, when non NULL, designates a target program.  The program is
     83    not loaded.
     84 
     85    ARGV is a standard ARGV pointer such as that passed from the
     86    command line.  The syntax of the argument list is is assumed to be
     87    ``SIM-PROG { SIM-OPTION } [ TARGET-PROGRAM { TARGET-OPTION } ]''.
     88    The trailing TARGET-PROGRAM and args are only valid for a
     89    stand-alone simulator.
     90 
     91    On success, the result is a non NULL descriptor that shall be
     92    passed to the other sim_foo functions.  While the simulator
     93    configuration can be parameterized by (in decreasing precedence)
     94    ARGV's SIM-OPTION, ARGV's TARGET-PROGRAM and the ABFD argument, the
     95    successful creation of the simulator shall not dependent on the
     96    presence of any of these arguments/options.
     97 
     98    Hardware simulator: The created simulator shall be sufficiently
     99    initialized to handle, with out restrictions any client requests
    100    (including memory reads/writes, register fetch/stores and a
    101    resume).
    102 
    103    Process simulator: that process is not created until a call to
    104    sim_create_inferior.  FIXME: What should the state of the simulator
    105    be? */
    106 
    107 SIM_DESC sim_open (SIM_OPEN_KIND kind, struct host_callback_struct *callback,
    108 		   struct bfd *abfd, char * const *argv);
    109 
    110 
    111 /* Destory a simulator instance.
    112 
    113    QUITTING is non-zero if we cannot hang on errors.
    114 
    115    This may involve freeing target memory and closing any open files
    116    and mmap'd areas.  You cannot assume sim_kill has already been
    117    called. */
    118 
    119 void sim_close (SIM_DESC sd, int quitting);
    120 
    121 
    122 /* Load program PROG into the simulators memory.
    123 
    124    If ABFD is non-NULL, the bfd for the file has already been opened.
    125    The result is a return code indicating success.
    126 
    127    Hardware simulator: Normally, each program section is written into
    128    memory according to that sections LMA using physical (direct)
    129    addressing.  The exception being systems, such as PPC/CHRP, which
    130    support more complicated program loaders.  A call to this function
    131    should not effect the state of the processor registers.  Multiple
    132    calls to this function are permitted and have an accumulative
    133    effect.
    134 
    135    Process simulator: Calls to this function may be ignored.
    136 
    137    FIXME: Most hardware simulators load the image at the VMA using
    138    virtual addressing.
    139 
    140    FIXME: For some hardware targets, before a loaded program can be
    141    executed, it requires the manipulation of VM registers and tables.
    142    Such manipulation should probably (?) occure in
    143    sim_create_inferior. */
    144 
    145 SIM_RC sim_load (SIM_DESC sd, const char *prog, struct bfd *abfd, int from_tty);
    146 
    147 
    148 /* Prepare to run the simulated program.
    149 
    150    ABFD, if not NULL, provides initial processor state information.
    151    ARGV and ENV, if non NULL, are NULL terminated lists of pointers.
    152 
    153    Hardware simulator: This function shall initialize the processor
    154    registers to a known value.  The program counter and possibly stack
    155    pointer shall be set using information obtained from ABFD (or
    156    hardware reset defaults).  ARGV and ENV, dependant on the target
    157    ABI, may be written to memory.
    158 
    159    Process simulator: After a call to this function, a new process
    160    instance shall exist. The TEXT, DATA, BSS and stack regions shall
    161    all be initialized, ARGV and ENV shall be written to process
    162    address space (according to the applicable ABI) and the program
    163    counter and stack pointer set accordingly. */
    164 
    165 SIM_RC sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
    166 			    char * const *argv, char * const *env);
    167 
    168 
    169 /* Fetch LENGTH bytes of the simulated program's memory.  Start fetch
    170    at virtual address MEM and store in BUF.  Result is number of bytes
    171    read, or zero if error.  */
    172 
    173 int sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length);
    174 
    175 
    176 /* Store LENGTH bytes from BUF into the simulated program's
    177    memory. Store bytes starting at virtual address MEM. Result is
    178    number of bytes write, or zero if error.  */
    179 
    180 int sim_write (SIM_DESC sd, SIM_ADDR mem, const unsigned char *buf, int length);
    181 
    182 
    183 /* Fetch register REGNO storing its raw (target endian) value in the
    184    LENGTH byte buffer BUF.  Return the actual size of the register or
    185    zero if REGNO is not applicable.
    186 
    187    Legacy implementations ignore LENGTH and always return -1.
    188 
    189    If LENGTH does not match the size of REGNO no data is transfered
    190    (the actual register size is still returned). */
    191 
    192 int sim_fetch_register (SIM_DESC sd, int regno, unsigned char *buf, int length);
    193 
    194 
    195 /* Store register REGNO from the raw (target endian) value in BUF.
    196 
    197    Return the actual size of the register, any size not equal to
    198    LENGTH indicates the register was not updated correctly.
    199 
    200    Return a LENGTH of -1 to indicate the register was not updated
    201    and an error has occurred.
    202 
    203    Return a LENGTH of 0 to indicate the register was not updated
    204    but no error has occurred. */
    205 
    206 int sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length);
    207 
    208 
    209 /* Print whatever statistics the simulator has collected.
    210 
    211    VERBOSE is currently unused and must always be zero.  */
    212 
    213 void sim_info (SIM_DESC sd, int verbose);
    214 
    215 
    216 /* Run (or resume) the simulated program.
    217 
    218    STEP, when non-zero indicates that only a single simulator cycle
    219    should be emulated.
    220 
    221    SIGGNAL, if non-zero is a (HOST) SIGRC value indicating the type of
    222    event (hardware interrupt, signal) to be delivered to the simulated
    223    program.
    224 
    225    Hardware simulator: If the SIGRC value returned by
    226    sim_stop_reason() is passed back to the simulator via SIGGNAL then
    227    the hardware simulator shall correctly deliver the hardware event
    228    indicated by that signal.  If a value of zero is passed in then the
    229    simulation will continue as if there were no outstanding signal.
    230    The effect of any other SIGGNAL value is is implementation
    231    dependant.
    232 
    233    Process simulator: If SIGRC is non-zero then the corresponding
    234    signal is delivered to the simulated program and execution is then
    235    continued.  A zero SIGRC value indicates that the program should
    236    continue as normal. */
    237 
    238 void sim_resume (SIM_DESC sd, int step, int siggnal);
    239 
    240 
    241 /* Asynchronous request to stop the simulation.
    242    A nonzero return indicates that the simulator is able to handle
    243    the request */
    244 
    245 int sim_stop (SIM_DESC sd);
    246 
    247 
    248 /* Fetch the REASON why the program stopped.
    249 
    250    SIM_EXITED: The program has terminated. SIGRC indicates the target
    251    dependant exit status.
    252 
    253    SIM_STOPPED: The program has stopped.  SIGRC uses the host's signal
    254    numbering as a way of identifying the reaon: program interrupted by
    255    user via a sim_stop request (SIGINT); a breakpoint instruction
    256    (SIGTRAP); a completed single step (SIGTRAP); an internal error
    257    condition (SIGABRT); an illegal instruction (SIGILL); Access to an
    258    undefined memory region (SIGSEGV); Mis-aligned memory access
    259    (SIGBUS).  For some signals information in addition to the signal
    260    number may be retained by the simulator (e.g. offending address),
    261    that information is not directly accessable via this interface.
    262 
    263    SIM_SIGNALLED: The program has been terminated by a signal. The
    264    simulator has encountered target code that causes the the program
    265    to exit with signal SIGRC.
    266 
    267    SIM_RUNNING, SIM_POLLING: The return of one of these values
    268    indicates a problem internal to the simulator. */
    269 
    270 enum sim_stop { sim_running, sim_polling, sim_exited, sim_stopped, sim_signalled };
    271 
    272 void sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc);
    273 
    274 
    275 /* Passthru for other commands that the simulator might support.
    276    Simulators should be prepared to deal with any combination of NULL
    277    or empty CMD. */
    278 
    279 void sim_do_command (SIM_DESC sd, const char *cmd);
    280 
    281 /* Complete a command based on the available sim commands.  Returns an
    282    array of possible matches.  */
    283 
    284 char **sim_complete_command (SIM_DESC sd, const char *text, const char *word);
    285 
    286 #ifdef __cplusplus
    287 }
    288 #endif
    289 
    290 #endif /* !defined (REMOTE_SIM_H) */
    291