For sim_fetch_register / sim_store_register: Add LENGTH parameter,
return actual size of register, 0 if not applicable, -1 of legacy implementation.
This commit is contained in:
parent
c5efcf3c85
commit
fbb8b6b9ab
10 changed files with 256 additions and 146 deletions
|
@ -180,15 +180,28 @@ int sim_read PARAMS ((SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
|
||||||
int sim_write PARAMS ((SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length));
|
int sim_write PARAMS ((SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length));
|
||||||
|
|
||||||
|
|
||||||
/* Fetch register REGNO and store the raw (target endian) value in
|
/* Fetch register REGNO storing its raw (target endian) value in the
|
||||||
BUF. */
|
LENGTH byte buffer BUF. Return the actual size of the register or
|
||||||
|
zero if REGNO is not applicable.
|
||||||
|
|
||||||
void sim_fetch_register PARAMS ((SIM_DESC sd, int regno, unsigned char *buf));
|
Legacy implementations ignore LENGTH and always return -1.
|
||||||
|
|
||||||
|
If LENGTH does not match the size of REGNO no data is transfered
|
||||||
|
(the actual register size is still returned). */
|
||||||
|
|
||||||
|
int sim_fetch_register PARAMS ((SIM_DESC sd, int regno, unsigned char *buf, int length));
|
||||||
|
|
||||||
|
|
||||||
/* Store register REGNO from the raw (target endian) value in BUF. */
|
/* Store register REGNO from the raw (target endian) value in BUF.
|
||||||
|
Return the actual size of the register or zero if REGNO is not
|
||||||
|
applicable.
|
||||||
|
|
||||||
void sim_store_register PARAMS ((SIM_DESC sd, int regno, unsigned char *buf));
|
Legacy implementations ignore LENGTH and always return -1.
|
||||||
|
|
||||||
|
If LENGTH does not match the size of REGNO no data is transfered
|
||||||
|
(the actual register size is still returned). */
|
||||||
|
|
||||||
|
int sim_store_register PARAMS ((SIM_DESC sd, int regno, unsigned char *buf, int length));
|
||||||
|
|
||||||
|
|
||||||
/* Print whatever statistics the simulator has collected.
|
/* Print whatever statistics the simulator has collected.
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
Tue Feb 17 12:44:38 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* sim-if.c (sim_store_register, sim_fetch_register): Pass in
|
||||||
|
length parameter. Return -1.
|
||||||
|
(sim_create_inferior): Pass 4 sim_store_register.
|
||||||
|
|
||||||
Wed Feb 11 19:53:48 1998 Doug Evans <devans@canuck.cygnus.com>
|
Wed Feb 11 19:53:48 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
* sim-main.h (CIA_GET,CIA_SET): Provide dummy definitions for now.
|
* sim-main.h (CIA_GET,CIA_SET): Provide dummy definitions for now.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Main simulator entry points for the M32R.
|
/* Main simulator entry points for the M32R.
|
||||||
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
Contributed by Cygnus Support.
|
Contributed by Cygnus Support.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -24,14 +24,49 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
#include "sim-core.h"
|
#include "sim-core.h"
|
||||||
#include "cpu-sim.h"
|
|
||||||
|
|
||||||
/* Global state until sim_open starts creating and returning it
|
static SIM_RC alloc_cpu (SIM_DESC, struct _bfd *, char **);
|
||||||
[and the other simulator i/f fns take it as an argument]. */
|
static void free_state (SIM_DESC);
|
||||||
struct sim_state sim_global_state;
|
|
||||||
|
|
||||||
/* FIXME: Do we *need* to pass state to the semantic routines? */
|
/* Records simulator descriptor so utilities like m32r_dump_regs can be
|
||||||
STATE current_state;
|
called from gdb. */
|
||||||
|
SIM_DESC current_state;
|
||||||
|
|
||||||
|
/* Scan the args and bfd to see what kind of cpus are in use and allocate
|
||||||
|
space for them. */
|
||||||
|
|
||||||
|
static SIM_RC
|
||||||
|
alloc_cpu (SIM_DESC sd, struct _bfd *abfd, char **argv)
|
||||||
|
{
|
||||||
|
/* Compute the size of the SIM_CPU struct.
|
||||||
|
For now its the max of all the possible sizes. */
|
||||||
|
int size = 0;
|
||||||
|
const MACH *mach;
|
||||||
|
|
||||||
|
for (mach = &machs[0]; MACH_NAME (mach) != NULL; ++mach)
|
||||||
|
{
|
||||||
|
int mach_size = IMP_PROPS_SIM_CPU_SIZE (MACH_IMP_PROPS (mach));
|
||||||
|
size = mach_size > size ? mach_size : size;
|
||||||
|
}
|
||||||
|
if (size == 0)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
/* `sizeof (SIM_CPU)' is the size of the generic part, and `size' is the
|
||||||
|
size of the cpu-specific part. */
|
||||||
|
STATE_CPU (sd, 0) = zalloc (sizeof (SIM_CPU) + size);
|
||||||
|
|
||||||
|
return SIM_RC_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cover function of sim_state_free to free the cpu buffers as well. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_state (SIM_DESC sd)
|
||||||
|
{
|
||||||
|
if (STATE_CPU (sd, 0))
|
||||||
|
zfree (STATE_CPU (sd, 0));
|
||||||
|
sim_state_free (sd);
|
||||||
|
}
|
||||||
|
|
||||||
/* Create an instance of the simulator. */
|
/* Create an instance of the simulator. */
|
||||||
|
|
||||||
|
@ -42,16 +77,20 @@ sim_open (kind, callback, abfd, argv)
|
||||||
struct _bfd *abfd;
|
struct _bfd *abfd;
|
||||||
char **argv;
|
char **argv;
|
||||||
{
|
{
|
||||||
int i;
|
SIM_DESC sd = sim_state_alloc (kind, callback);
|
||||||
SIM_DESC sd = &sim_global_state;
|
|
||||||
|
|
||||||
/* FIXME: until we alloc one, use the global. */
|
/* The cpu data is kept in a separately allocated chunk of memory. */
|
||||||
memset (sd, 0, sizeof (sim_global_state));
|
if (alloc_cpu (sd, abfd, argv) != SIM_RC_OK)
|
||||||
STATE_OPEN_KIND (sd) = kind;
|
{
|
||||||
STATE_CALLBACK (sd) = callback;
|
free_state (sd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
|
if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
|
||||||
return 0;
|
{
|
||||||
|
free_state (sd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#if 0 /* FIXME: 'twould be nice if we could do this */
|
#if 0 /* FIXME: 'twould be nice if we could do this */
|
||||||
/* These options override any module options.
|
/* These options override any module options.
|
||||||
|
@ -61,34 +100,72 @@ sim_open (kind, callback, abfd, argv)
|
||||||
sim_add_option_table (sd, extra_options);
|
sim_add_option_table (sd, extra_options);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Allocate core managed memory */
|
||||||
|
sim_do_commandf (sd, "memory region 0,0x%lx", M32R_DEFAULT_MEM_SIZE);
|
||||||
|
|
||||||
|
/* Allocate a handler for the MSPR register. */
|
||||||
|
sim_core_attach (sd, NULL,
|
||||||
|
0 /*level*/,
|
||||||
|
access_write,
|
||||||
|
0 /*space ???*/,
|
||||||
|
MSPR_ADDR, 1 /*nr_bytes*/, 0 /*modulo*/,
|
||||||
|
&m32r_mspr_device,
|
||||||
|
NULL /*buffer*/);
|
||||||
|
|
||||||
/* getopt will print the error message so we just have to exit if this fails.
|
/* getopt will print the error message so we just have to exit if this fails.
|
||||||
FIXME: Hmmm... in the case of gdb we need getopt to call
|
FIXME: Hmmm... in the case of gdb we need getopt to call
|
||||||
print_filtered. */
|
print_filtered. */
|
||||||
if (sim_parse_args (sd, argv) != SIM_RC_OK)
|
if (sim_parse_args (sd, argv) != SIM_RC_OK)
|
||||||
{
|
{
|
||||||
sim_module_uninstall (sd);
|
sim_module_uninstall (sd);
|
||||||
|
free_state (sd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for/establish the a reference program image */
|
||||||
|
if (sim_analyze_program (sd,
|
||||||
|
(STATE_PROG_ARGV (sd) != NULL
|
||||||
|
? *STATE_PROG_ARGV (sd)
|
||||||
|
: NULL),
|
||||||
|
abfd) != SIM_RC_OK)
|
||||||
|
{
|
||||||
|
sim_module_uninstall (sd);
|
||||||
|
free_state (sd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Establish any remaining configuration options. */
|
||||||
|
if (sim_config (sd) != SIM_RC_OK)
|
||||||
|
{
|
||||||
|
sim_module_uninstall (sd);
|
||||||
|
free_state (sd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sim_post_argv_init (sd) != SIM_RC_OK)
|
if (sim_post_argv_init (sd) != SIM_RC_OK)
|
||||||
{
|
{
|
||||||
sim_module_uninstall (sd);
|
sim_module_uninstall (sd);
|
||||||
|
free_state (sd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize various cgen things not done by common framework. */
|
/* Initialize various cgen things not done by common framework. */
|
||||||
cgen_init (sd);
|
cgen_init (sd);
|
||||||
|
|
||||||
/* FIXME:wip */
|
{
|
||||||
sim_core_attach (sd, NULL, attach_raw_memory, access_read_write_exec,
|
int i;
|
||||||
0, 0, M32R_DEFAULT_MEM_SIZE, 0, NULL, NULL);
|
|
||||||
|
|
||||||
/* Only needed for profiling, but the structure member is small. */
|
/* Only needed for profiling, but the structure member is small. */
|
||||||
for (i = 0; i < MAX_NR_PROCESSORS; ++i)
|
for (i = 0; i < MAX_NR_PROCESSORS; ++i)
|
||||||
memset (& CPU_M32R_PROFILE (STATE_CPU (sd, i)), 0,
|
memset (& CPU_M32R_MISC_PROFILE (STATE_CPU (sd, i)), 0,
|
||||||
sizeof (CPU_M32R_PROFILE (STATE_CPU (sd, i))));
|
sizeof (CPU_M32R_MISC_PROFILE (STATE_CPU (sd, i))));
|
||||||
|
}
|
||||||
|
|
||||||
return &sim_global_state;
|
/* Store in a global so things like sparc32_dump_regs can be invoked
|
||||||
|
from the gdb command line. */
|
||||||
|
current_state = sd;
|
||||||
|
|
||||||
|
return sd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -98,7 +175,7 @@ sim_close (sd, quitting)
|
||||||
{
|
{
|
||||||
sim_module_uninstall (sd);
|
sim_module_uninstall (sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
SIM_RC
|
SIM_RC
|
||||||
sim_create_inferior (sd, abfd, argv, envp)
|
sim_create_inferior (sd, abfd, argv, envp)
|
||||||
SIM_DESC sd;
|
SIM_DESC sd;
|
||||||
|
@ -106,21 +183,41 @@ sim_create_inferior (sd, abfd, argv, envp)
|
||||||
char **argv;
|
char **argv;
|
||||||
char **envp;
|
char **envp;
|
||||||
{
|
{
|
||||||
|
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
|
||||||
|
SIM_ADDR addr;
|
||||||
|
SI taddr;
|
||||||
|
|
||||||
|
if (abfd != NULL)
|
||||||
|
addr = bfd_get_start_address (abfd);
|
||||||
|
else
|
||||||
|
addr = 0;
|
||||||
|
taddr = endian_h2t_4 (addr);
|
||||||
|
sim_store_register (sd, PC_REGNUM, (unsigned char *) &taddr, 4);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
STATE_ARGV (sd) = sim_copy_argv (argv);
|
STATE_ARGV (sd) = sim_copy_argv (argv);
|
||||||
STATE_ENVP (sd) = sim_copy_argv (envp);
|
STATE_ENVP (sd) = sim_copy_argv (envp);
|
||||||
#endif
|
#endif
|
||||||
if (abfd != NULL)
|
|
||||||
STATE_CPU_CPU (sd, 0)->pc = bfd_get_start_address (abfd);
|
|
||||||
else
|
|
||||||
STATE_CPU_CPU (sd, 0)->pc = 0;
|
|
||||||
return SIM_RC_OK;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sim_stop (SIM_DESC sd)
|
sim_stop (SIM_DESC sd)
|
||||||
{
|
{
|
||||||
return engine_stop (sd);
|
switch (STATE_ARCHITECTURE (sd)->mach)
|
||||||
|
{
|
||||||
|
case bfd_mach_m32r :
|
||||||
|
return m32r_engine_stop (sd);
|
||||||
|
/* start-sanitize-m32rx */
|
||||||
|
#ifdef HAVE_CPU_M32RX
|
||||||
|
case bfd_mach_m32rx :
|
||||||
|
return m32rx_engine_stop (sd);
|
||||||
|
#endif
|
||||||
|
/* end-sanitize-m32rx */
|
||||||
|
default :
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -128,32 +225,20 @@ sim_resume (sd, step, siggnal)
|
||||||
SIM_DESC sd;
|
SIM_DESC sd;
|
||||||
int step, siggnal;
|
int step, siggnal;
|
||||||
{
|
{
|
||||||
engine_run (sd, step, siggnal);
|
switch (STATE_ARCHITECTURE (sd)->mach)
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
sim_stop_reason (sd, reason, sigrc)
|
|
||||||
SIM_DESC sd;
|
|
||||||
enum sim_stop *reason;
|
|
||||||
int *sigrc;
|
|
||||||
{
|
|
||||||
sim_cpu *cpu = STATE_CPU (sd, 0);
|
|
||||||
|
|
||||||
/* Map sim_state to sim_stop. */
|
|
||||||
switch (CPU_EXEC_STATE (cpu))
|
|
||||||
{
|
{
|
||||||
case EXEC_STATE_EXITED :
|
case bfd_mach_m32r :
|
||||||
*reason = sim_exited;
|
m32r_engine_run (sd, step, siggnal);
|
||||||
*sigrc = CPU_HALT_SIGRC (cpu);
|
|
||||||
break;
|
break;
|
||||||
case EXEC_STATE_STOPPED :
|
/* start-sanitize-m32rx */
|
||||||
*reason = sim_stopped;
|
#ifdef HAVE_CPU_M32RX
|
||||||
*sigrc = sim_signal_to_host (CPU_HALT_SIGRC (cpu));
|
case bfd_mach_m32rx :
|
||||||
break;
|
m32rx_engine_run (sd, step, siggnal);
|
||||||
case EXEC_STATE_SIGNALLED :
|
|
||||||
*reason = sim_signalled;
|
|
||||||
*sigrc = sim_signal_to_host (CPU_HALT_SIGRC (cpu));
|
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
/* end-sanitize-m32rx */
|
||||||
|
default :
|
||||||
|
abort ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +256,7 @@ print_m32r_misc_cpu (SIM_CPU *cpu, int verbose)
|
||||||
sim_io_printf (sd, " %-*s %s\n\n",
|
sim_io_printf (sd, " %-*s %s\n\n",
|
||||||
PROFILE_LABEL_WIDTH, "Fill nops:",
|
PROFILE_LABEL_WIDTH, "Fill nops:",
|
||||||
sim_add_commas (buf, sizeof (buf),
|
sim_add_commas (buf, sizeof (buf),
|
||||||
CPU_M32R_PROFILE (cpu).fillnop_count));
|
CPU_M32R_MISC_PROFILE (cpu).fillnop_count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,101 +270,56 @@ sim_info (sd, verbose)
|
||||||
|
|
||||||
/* The contents of BUF are in target byte order. */
|
/* The contents of BUF are in target byte order. */
|
||||||
|
|
||||||
void
|
int
|
||||||
sim_fetch_register (sd, rn, buf)
|
sim_fetch_register (sd, rn, buf, length)
|
||||||
SIM_DESC sd;
|
SIM_DESC sd;
|
||||||
int rn;
|
int rn;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
int length;
|
||||||
{
|
{
|
||||||
if (rn < 16)
|
switch (STATE_ARCHITECTURE (sd)->mach)
|
||||||
SETTWI (buf, STATE_CPU_CPU (sd, 0)->h_gr[rn]);
|
{
|
||||||
else if (rn < 21)
|
case bfd_mach_m32r :
|
||||||
SETTWI (buf, STATE_CPU_CPU (sd, 0)->h_cr[rn - 16]);
|
m32r_fetch_register (sd, rn, buf);
|
||||||
else switch (rn) {
|
|
||||||
case PC_REGNUM:
|
|
||||||
SETTWI (buf, STATE_CPU_CPU (sd, 0)->pc);
|
|
||||||
break;
|
break;
|
||||||
case ACCL_REGNUM:
|
/* start-sanitize-m32rx */
|
||||||
SETTWI (buf, GETLODI (STATE_CPU_CPU (sd, 0)->h_accum));
|
#ifdef HAVE_CPU_M32RX
|
||||||
|
case bfd_mach_m32rx :
|
||||||
|
m32rx_fetch_register (sd, rn, buf);
|
||||||
break;
|
break;
|
||||||
case ACCH_REGNUM:
|
|
||||||
SETTWI (buf, GETHIDI (STATE_CPU_CPU (sd, 0)->h_accum));
|
|
||||||
break;
|
|
||||||
#if 0
|
|
||||||
case 23: *reg = STATE_CPU_CPU (sd, 0)->h_cond; break;
|
|
||||||
case 24: *reg = STATE_CPU_CPU (sd, 0)->h_sm; break;
|
|
||||||
case 25: *reg = STATE_CPU_CPU (sd, 0)->h_bsm; break;
|
|
||||||
case 26: *reg = STATE_CPU_CPU (sd, 0)->h_ie; break;
|
|
||||||
case 27: *reg = STATE_CPU_CPU (sd, 0)->h_bie; break;
|
|
||||||
case 28: *reg = STATE_CPU_CPU (sd, 0)->h_bcarry; break; /* rename: bc */
|
|
||||||
case 29: memcpy (buf, &STATE_CPU_CPU (sd, 0)->h_bpc, sizeof(WI)); break; /* duplicate */
|
|
||||||
#endif
|
#endif
|
||||||
default: abort ();
|
/* end-sanitize-m32rx */
|
||||||
}
|
default :
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The contents of BUF are in target byte order. */
|
/* The contents of BUF are in target byte order. */
|
||||||
|
|
||||||
void
|
int
|
||||||
sim_store_register (sd, rn, buf)
|
sim_store_register (sd, rn, buf, length)
|
||||||
SIM_DESC sd;
|
SIM_DESC sd;
|
||||||
int rn;
|
int rn;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
int length;
|
||||||
{
|
{
|
||||||
if (rn < 16)
|
switch (STATE_ARCHITECTURE (sd)->mach)
|
||||||
STATE_CPU_CPU (sd, 0)->h_gr[rn] = GETTWI (buf);
|
{
|
||||||
else if (rn < 21)
|
case bfd_mach_m32r :
|
||||||
STATE_CPU_CPU (sd, 0)->h_cr[rn - 16] = GETTWI (buf);
|
m32r_store_register (sd, rn, buf);
|
||||||
else switch (rn) {
|
|
||||||
case PC_REGNUM:
|
|
||||||
STATE_CPU_CPU (sd, 0)->pc = GETTWI (buf);
|
|
||||||
break;
|
break;
|
||||||
case ACCL_REGNUM:
|
/* start-sanitize-m32rx */
|
||||||
SETLODI (STATE_CPU_CPU (sd, 0)->h_accum, GETTWI (buf));
|
#ifdef HAVE_CPU_M32RX
|
||||||
|
case bfd_mach_m32rx :
|
||||||
|
m32rx_store_register (sd, rn, buf);
|
||||||
break;
|
break;
|
||||||
case ACCH_REGNUM:
|
|
||||||
SETHIDI (STATE_CPU_CPU (sd, 0)->h_accum, GETTWI (buf));
|
|
||||||
break;
|
|
||||||
#if 0
|
|
||||||
case 23: STATE_CPU_CPU (sd, 0)->h_cond = *reg; break;
|
|
||||||
case 24: STATE_CPU_CPU (sd, 0)->h_sm = *reg; break;
|
|
||||||
case 25: STATE_CPU_CPU (sd, 0)->h_bsm = *reg; break;
|
|
||||||
case 26: STATE_CPU_CPU (sd, 0)->h_ie = *reg; break;
|
|
||||||
case 27: STATE_CPU_CPU (sd, 0)->h_bie = *reg; break;
|
|
||||||
case 28: STATE_CPU_CPU (sd, 0)->h_bcarry = *reg; break; /* rename: bc */
|
|
||||||
case 29: memcpy (&STATE_CPU_CPU (sd, 0)->h_bpc, buf, sizeof(DI)); break; /* duplicate */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
sim_read (sd, addr, buf, len)
|
|
||||||
SIM_DESC sd;
|
|
||||||
SIM_ADDR addr;
|
|
||||||
unsigned char *buf;
|
|
||||||
int len;
|
|
||||||
{
|
|
||||||
#if 1
|
|
||||||
return sim_core_read_buffer (sd, NULL, sim_core_read_map,
|
|
||||||
buf, addr, len);
|
|
||||||
#else
|
|
||||||
return (*STATE_MEM_READ (sd)) (sd, addr, buf, len);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
sim_write (sd, addr, buf, len)
|
|
||||||
SIM_DESC sd;
|
|
||||||
SIM_ADDR addr;
|
|
||||||
unsigned char *buf;
|
|
||||||
int len;
|
|
||||||
{
|
|
||||||
#if 1
|
|
||||||
return sim_core_write_buffer (sd, NULL, sim_core_write_map,
|
|
||||||
buf, addr, len);
|
|
||||||
#else
|
|
||||||
return (*STATE_MEM_WRITE (sd)) (sd, addr, buf, len);
|
|
||||||
#endif
|
#endif
|
||||||
|
/* end-sanitize-m32rx */
|
||||||
|
default :
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -287,5 +327,17 @@ sim_do_command (sd, cmd)
|
||||||
SIM_DESC sd;
|
SIM_DESC sd;
|
||||||
char *cmd;
|
char *cmd;
|
||||||
{
|
{
|
||||||
sim_io_error (sd, "sim_do_command - unimplemented");
|
if (sim_args_command (sd, cmd) != SIM_RC_OK)
|
||||||
|
sim_io_eprintf (sd, "Unknown command `%s'\n", cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The semantic code invokes this for illegal (unrecognized) instructions. */
|
||||||
|
|
||||||
|
void
|
||||||
|
sim_engine_illegal_insn (current_cpu, pc)
|
||||||
|
SIM_CPU *current_cpu;
|
||||||
|
PCADDR pc;
|
||||||
|
{
|
||||||
|
sim_engine_halt (CPU_STATE (current_cpu), current_cpu, NULL, pc,
|
||||||
|
sim_stopped, SIM_SIGILL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
Tue Feb 17 12:47:16 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* interp.c (sim_store_register, sim_fetch_register): Pass in
|
||||||
|
length parameter. Return -1.
|
||||||
|
|
||||||
|
Sun Feb 1 16:47:51 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
|
||||||
Sat Jan 31 18:15:41 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
Sat Jan 31 18:15:41 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
Tue Feb 17 12:50:27 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* sim-calls.c (sim_store_register, sim_fetch_register): Pass in
|
||||||
|
length parameter. Return -1.
|
||||||
|
|
||||||
Fri Feb 13 17:11:22 1998 Michael Meissner <meissner@cygnus.com>
|
Fri Feb 13 17:11:22 1998 Michael Meissner <meissner@cygnus.com>
|
||||||
|
|
||||||
* insns ({get,set}_fp_reg): Tic80 floating point is little endian,
|
* insns ({get,set}_fp_reg): Tic80 floating point is little endian,
|
||||||
|
|
|
@ -132,8 +132,8 @@ sim_close (SIM_DESC sd, int quitting)
|
||||||
#define Rn_REGNUM 31 /* Last General Purpose Register - for sim */
|
#define Rn_REGNUM 31 /* Last General Purpose Register - for sim */
|
||||||
#define An_REGNUM A3_REGNUM /* Last Accumulator register - for sim */
|
#define An_REGNUM A3_REGNUM /* Last Accumulator register - for sim */
|
||||||
|
|
||||||
void
|
int
|
||||||
sim_fetch_register (SIM_DESC sd, int regnr, unsigned char *buf)
|
sim_fetch_register (SIM_DESC sd, int regnr, unsigned char *buf, int length)
|
||||||
{
|
{
|
||||||
if (regnr == R0_REGNUM)
|
if (regnr == R0_REGNUM)
|
||||||
memset (buf, 0, sizeof (unsigned32));
|
memset (buf, 0, sizeof (unsigned32));
|
||||||
|
@ -147,12 +147,12 @@ sim_fetch_register (SIM_DESC sd, int regnr, unsigned char *buf)
|
||||||
*(unsigned64*)buf = H2T_8 (STATE_CPU (sd, 0)->acc[regnr - A0_REGNUM]);
|
*(unsigned64*)buf = H2T_8 (STATE_CPU (sd, 0)->acc[regnr - A0_REGNUM]);
|
||||||
else
|
else
|
||||||
sim_io_error (sd, "sim_fetch_register - unknown register nr %d", regnr);
|
sim_io_error (sd, "sim_fetch_register - unknown register nr %d", regnr);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
int
|
||||||
sim_store_register (SIM_DESC sd, int regnr, unsigned char *buf)
|
sim_store_register (SIM_DESC sd, int regnr, unsigned char *buf, int length)
|
||||||
{
|
{
|
||||||
if (regnr >= R0_REGNUM && regnr <= Rn_REGNUM)
|
if (regnr >= R0_REGNUM && regnr <= Rn_REGNUM)
|
||||||
STATE_CPU (sd, 0)->reg[regnr - R0_REGNUM] = T2H_4 (*(unsigned32*)buf);
|
STATE_CPU (sd, 0)->reg[regnr - R0_REGNUM] = T2H_4 (*(unsigned32*)buf);
|
||||||
|
@ -164,7 +164,7 @@ sim_store_register (SIM_DESC sd, int regnr, unsigned char *buf)
|
||||||
STATE_CPU (sd, 0)->acc[regnr - A0_REGNUM] = T2H_8 (*(unsigned64*)buf);
|
STATE_CPU (sd, 0)->acc[regnr - A0_REGNUM] = T2H_8 (*(unsigned64*)buf);
|
||||||
else
|
else
|
||||||
sim_io_error (sd, "sim_store_register - unknown register nr %d", regnr);
|
sim_io_error (sd, "sim_store_register - unknown register nr %d", regnr);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,17 @@
|
||||||
|
Tue Feb 17 12:51:18 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* interp.c (sim_store_register, sim_fetch_register): Pass in
|
||||||
|
length parameter. Return -1.
|
||||||
|
|
||||||
|
Tue Feb 3 16:24:42 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* sim-main.h (IMEM16, IMEM16_IMMED): Rename IMEM and
|
||||||
|
IMEM_IMMED. To match recent igen change.
|
||||||
|
|
||||||
|
Sun Feb 1 16:47:51 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
|
||||||
Sat Jan 31 18:15:41 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
Sat Jan 31 18:15:41 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
Tue Feb 17 12:52:24 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* run.c (main): Pass length into sim_fetch_register.
|
||||||
|
|
||||||
|
* interp.c (sim_store_register, sim_fetch_register): Pass in
|
||||||
|
length parameter. Return -1.
|
||||||
|
|
||||||
Tue Aug 26 10:43:11 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
Tue Aug 26 10:43:11 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* interp.c (sim_kill): Delete.
|
* interp.c (sim_kill): Delete.
|
||||||
|
|
|
@ -233,10 +233,11 @@ rinfo[] =
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
int
|
||||||
sim_store_register (rn, value)
|
sim_store_register (rn, value, length)
|
||||||
int rn;
|
int rn;
|
||||||
unsigned char *value;
|
unsigned char *value;
|
||||||
|
int length;
|
||||||
{
|
{
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
int i;
|
int i;
|
||||||
|
@ -247,12 +248,14 @@ sim_store_register (rn, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
*(rinfo[rn].ptr) = val;
|
*(rinfo[rn].ptr) = val;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
sim_fetch_register (rn, buf)
|
sim_fetch_register (rn, buf, length)
|
||||||
int rn;
|
int rn;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
int length;
|
||||||
{
|
{
|
||||||
unsigned int val = *(rinfo[rn].ptr);
|
unsigned int val = *(rinfo[rn].ptr);
|
||||||
int i;
|
int i;
|
||||||
|
@ -262,6 +265,7 @@ sim_fetch_register (rn, buf)
|
||||||
*buf++ = val;
|
*buf++ = val;
|
||||||
val = val >> 8;
|
val = val >> 8;
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ main (ac, av)
|
||||||
/* Find out what was in r0 and return that */
|
/* Find out what was in r0 and return that */
|
||||||
{
|
{
|
||||||
unsigned char b[4];
|
unsigned char b[4];
|
||||||
sim_fetch_register(0, b);
|
sim_fetch_register(0, b, 4);
|
||||||
return b[3];
|
return b[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue