diff options
author | Jeff Law <law@redhat.com> | 1995-08-31 04:21:32 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1995-08-31 04:21:32 +0000 |
commit | c1bce9f662c8472a33a83821bbeb7fc86ec252d4 (patch) | |
tree | effab746489c1c1e77fa564733c913467dbc4c7f /sim/sh/interp.c | |
parent | c928c81fb72df4dade3b36935a8e05d3ad58440d (diff) | |
download | gdb-c1bce9f662c8472a33a83821bbeb7fc86ec252d4.zip gdb-c1bce9f662c8472a33a83821bbeb7fc86ec252d4.tar.gz gdb-c1bce9f662c8472a33a83821bbeb7fc86ec252d4.tar.bz2 |
* interp.c (FPSCR, FPUL): Define.
(struct save_state): Add fields for floating point registers,
FPSCR and FPUL.
(sim_resume): Add 'F' for accessing floating point registers
in the save state structure.
* gencode.c: Add sh3e opcodes.
(gensym): Define a buffer for int<->fp conversions.
First cut at simulating sh3e instructions. Basic stuff should work;
instructions using fpul and fpscr are completely untested... Sanitized
away for now (sh3e).
Diffstat (limited to 'sim/sh/interp.c')
-rw-r--r-- | sim/sh/interp.c | 70 |
1 files changed, 64 insertions, 6 deletions
diff --git a/sim/sh/interp.c b/sim/sh/interp.c index f1fa22c..3c26526 100644 --- a/sim/sh/interp.c +++ b/sim/sh/interp.c @@ -60,6 +60,10 @@ #define M saved_state.asregs.sr.bits.m #define Q saved_state.asregs.sr.bits.q #define S saved_state.asregs.sr.bits.s +/* start-sanitize-sh3e */ +#define FPSCR saved_state.asregs.fpscr +#define FPUL saved_state.asregs.fpul +/* end-sanitize-sh3e */ #define GET_SR() (saved_state.asregs.sr.bits.t = T, saved_state.asregs.sr.word) #define SET_SR(x) {saved_state.asregs.sr.word = (x); T =saved_state.asregs.sr.bits.t;} @@ -96,6 +100,8 @@ int valid[16]; #define UNDEF(x) #endif +static void parse_and_set_memory_size PARAMS ((char *str)); + static int IOMEM PARAMS ((int addr, int write, int value)); /* These variables are at file scope so that functions other than @@ -114,6 +120,9 @@ typedef union { int regs[16]; +/* start-sanitize-sh3e */ + float fregs[16]; +/* end-sanitize-sh3e */ int pc; int pr; @@ -122,6 +131,10 @@ typedef union int mach; int macl; +/* start-sanitize-sh3e */ + float fpscr; + int fpul; +/* end-sanitize-sh3e */ union { @@ -473,7 +486,9 @@ trap (i, regs, memory, maskl, maskw, little_endian) regs[0] = trap12 (); break; #endif - case 3: + + case 3: /* FIXME: for backwards compat, should be removed */ + case 34: { extern int errno; int perrno = errno; @@ -490,9 +505,11 @@ trap (i, regs, memory, maskl, maskw, little_endian) case SYS_execve: regs[0] = execve (ptr (regs[5]), ptr (regs[6]), ptr (regs[7])); break; +#ifdef SYS_execv /* May be implemented as execve(arg,arg,0) */ case SYS_execv: regs[0] = execv (ptr (regs[5]), ptr (regs[6])); break; +#endif case SYS_pipe: { char *buf; @@ -594,7 +611,6 @@ trap (i, regs, memory, maskl, maskw, little_endian) regs[1] = errno; errno = perrno; } - break; case 0xc3: @@ -916,6 +932,9 @@ sim_resume (step, siggnal) register unsigned char *jump_table = sh_jump_table0; register int *R = &(saved_state.asregs.regs[0]); +/* start-sanitize-sh3e */ + register float *F = &(saved_state.asregs.fregs[0]); +/* end-sanitize-sh3e */ register int T; register int PR; @@ -923,7 +942,7 @@ sim_resume (step, siggnal) register int maskw = ((saved_state.asregs.msize - 1) & ~1); register int maskl = ((saved_state.asregs.msize - 1) & ~3); register unsigned char *memory; - register unsigned int sbit = (1 << 31); + register unsigned int sbit = ((unsigned int) 1 << 31); prev = signal (SIGINT, control_c); @@ -1155,10 +1174,28 @@ sim_set_profile_size (n) void -sim_open (name) - char *name; +sim_open (args) + char *args; { - /* nothing to do */ + int n; + + if (args != NULL) + { + parse_and_set_memory_size (args); + } +} + +static void +parse_and_set_memory_size (str) + char *str; +{ + int n; + + n = strtol (str, NULL, 10); + if (n > 0 && n <= 24) + sim_memory_size = n; + else + printf_filtered ("Bad memory size %d; must be 1 to 24, inclusive\n", n); } void @@ -1192,3 +1229,24 @@ sim_kill () /* nothing to do */ } +void +sim_do_command (cmd) + char *cmd; +{ + int n; + char *sms_cmd = "set-memory-size"; + + if (strncmp (cmd, sms_cmd, strlen (sms_cmd)) == 0 + && strchr (" ", cmd[strlen(sms_cmd)])) + parse_and_set_memory_size (cmd + strlen(sms_cmd) + 1); + + else if (strcmp (cmd, "help") == 0) + { + printf_filtered ("List of SH simulator commands:\n\n"); + printf_filtered ("set-memory-size <n> -- Set the number of address bits to use\n"); + printf_filtered ("\n"); + } + else + fprintf (stderr, "Error: \"%s\" is not a valid SH simulator command.\n", + cmd); +} |