1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
/* This file is part of the program psim.
Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>
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 2 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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _PSIM_H_
#define _PSIM_H_
#include "basics.h"
/* the system object */
/* typedef struct _psim psim; */
/* typedef struct _device device; */
/* when the `system' stops, find out why. FIXME - at this point this
is really a bit puzzling. After all, how can there be a status
when there several processors involved */
typedef struct _psim_status {
int cpu_nr;
stop_reason reason;
int signal;
unsigned_word program_counter;
} psim_status;
/* create an initial device tree and then populate it using
information obtained from either the command line or a file */
extern device *psim_tree
(void);
extern char **psim_options
(device *root,
char **argv);
extern void psim_command
(device *root,
char **argv);
extern void psim_merge_device_file
(device *root,
const char *file_name);
extern void psim_usage
(int verbose, int help);
/* create a new simulator from the device tree */
extern psim *psim_create
(const char *file_name,
device *root);
/* Given the created simulator (re) initialize it */
extern void psim_init
(psim *system);
extern void psim_stack
(psim *system,
char **argv,
char **envp);
/* Run/stop the system */
extern void psim_step
(psim *system);
extern void psim_run
(psim *system);
extern void psim_restart
(psim *system,
int cpu_nr);
extern void psim_set_halt_and_restart
(psim *system,
void *halt_jmp_buf,
void *restart_jmp_buf);
extern void psim_clear_halt_and_restart
(psim *system);
extern void psim_stop
(psim *system);
extern void psim_halt
(psim *system,
int cpu_nr,
stop_reason reason,
int signal);
extern int psim_last_cpu
(psim *system);
extern int psim_nr_cpus
(psim *system);
extern psim_status psim_get_status
(psim *system);
/* reveal the internals of the simulation. Grant access to the
processor (cpu) device tree (device) and events (event_queue). */
extern cpu *psim_cpu
(psim *system,
int cpu_nr);
extern device *psim_device
(psim *system,
const char *path);
extern event_queue *psim_event_queue
(psim *system);
/* Manipulate the state (registers or memory) of a processor within
the system. In the case of memory, the read/write is performed
using the specified processors address translation tables.
Where applicable, WHICH_CPU == -1 indicates all processors and
WHICH_CPU == <nr_cpus> indicates the `current' processor.
The register functions return the size of the register, or 0 if the
register's name is not recognized. */
extern int psim_read_register
(psim *system,
int which_cpu,
void *host_ordered_buf,
const char reg[],
transfer_mode mode);
extern int psim_write_register
(psim *system,
int which_cpu,
const void *buf,
const char reg[],
transfer_mode mode);
extern unsigned psim_read_memory
(psim *system,
int which_cpu,
void *buf,
unsigned_word vaddr,
unsigned len);
extern unsigned psim_write_memory
(psim *system,
int which_cpu,
const void *buf,
unsigned_word vaddr,
unsigned len,
int violate_read_only_section);
extern void psim_print_info
(psim *system,
int verbose);
#endif /* _PSIM_H_ */
|