aboutsummaryrefslogtreecommitdiff
path: root/sim/d10v/interp.c
diff options
context:
space:
mode:
authorMichael Meissner <gnu@the-meissners.org>1996-10-15 15:44:10 +0000
committerMichael Meissner <gnu@the-meissners.org>1996-10-15 15:44:10 +0000
commit57bc1a721a6b00bf4f01897cdba81ca42fa94f6d (patch)
tree2110550623484b141711058196ae6655c78e4045 /sim/d10v/interp.c
parent684d50a53eb1b63c327205f2a712379cfa912da5 (diff)
downloadgdb-57bc1a721a6b00bf4f01897cdba81ca42fa94f6d.zip
gdb-57bc1a721a6b00bf4f01897cdba81ca42fa94f6d.tar.gz
gdb-57bc1a721a6b00bf4f01897cdba81ca42fa94f6d.tar.bz2
Better error messages when a program stops due to signal; support d10v getpid/kill
Diffstat (limited to 'sim/d10v/interp.c')
-rw-r--r--sim/d10v/interp.c119
1 files changed, 79 insertions, 40 deletions
diff --git a/sim/d10v/interp.c b/sim/d10v/interp.c
index d34c116..11a18c4 100644
--- a/sim/d10v/interp.c
+++ b/sim/d10v/interp.c
@@ -180,7 +180,7 @@ do_2_short (ins1, ins2, leftright)
(h->ops->func)();
/* If the PC has changed (ie, a jump), don't do the second instruction */
- if (orig_pc == PC)
+ if (orig_pc == PC && !State.exception)
{
h = lookup_hash (ins2, 0);
get_operands (h->ops, ins2);
@@ -234,10 +234,13 @@ do_parallel (ins1, ins2)
State.ins_type = INS_LEFT_PARALLEL;
ins_type_counters[ (int)State.ins_type ]++;
(h1->ops->func)();
- get_operands (h2->ops, ins2);
- State.ins_type = INS_RIGHT_PARALLEL;
- ins_type_counters[ (int)State.ins_type ]++;
- (h2->ops->func)();
+ if (!State.exception)
+ {
+ get_operands (h2->ops, ins2);
+ State.ins_type = INS_RIGHT_PARALLEL;
+ ins_type_counters[ (int)State.ins_type ]++;
+ (h2->ops->func)();
+ }
}
}
@@ -261,6 +264,9 @@ sim_size (power)
exit(1);
}
+ State.mem_min = 1<<IMEM_SIZE;
+ State.mem_max = 0;
+
#ifdef DEBUG
if ((d10v_debug & DEBUG_MEMSIZE) != 0)
{
@@ -283,14 +289,21 @@ sim_write (addr, buffer, size)
unsigned char *buffer;
int size;
{
- int i;
init_system ();
- /* (*d10v_callback->printf_filtered) (d10v_callback, "sim_write %d bytes to 0x%x\n",size,addr); */
- for (i = 0; i < size; i++)
- {
- State.imem[i+addr] = buffer[i];
- }
+#ifdef DEBUG
+ if ((d10v_debug & DEBUG_INSTRUCTION) != 0)
+ (*d10v_callback->printf_filtered) (d10v_callback, "sim_write %d bytes to 0x%x, min = 0x%x, max = 0x%x\n",
+ size, addr, State.mem_min, State.mem_max);
+#endif
+
+ if (State.mem_min > addr)
+ State.mem_min = addr;
+
+ if (State.mem_max < addr+size-1)
+ State.mem_max = addr+size-1;
+
+ memcpy (State.imem+addr, buffer, size);
return size;
}
@@ -374,39 +387,50 @@ sim_resume (step, siggnal)
do
{
- inst = RLW (PC << 2);
- oldpc = PC;
- switch (inst & 0xC0000000)
+ uint32 byte_pc = ((uint32)PC) << 2;
+ if ((byte_pc < State.mem_min) || (byte_pc > State.mem_max))
{
- case 0xC0000000:
- /* long instruction */
- do_long (inst & 0x3FFFFFFF);
- break;
- case 0x80000000:
- /* R -> L */
- do_2_short ( inst & 0x7FFF, (inst & 0x3FFF8000) >> 15, 0);
- break;
- case 0x40000000:
- /* L -> R */
- do_2_short ((inst & 0x3FFF8000) >> 15, inst & 0x7FFF, 1);
- break;
- case 0:
- do_parallel ((inst & 0x3FFF8000) >> 15, inst & 0x7FFF);
- break;
+ (*d10v_callback->printf_filtered) (d10v_callback,
+ "PC (0x%lx) out of range, oldpc = 0x%lx, min = 0x%lx, max = 0x%lx\n",
+ (long)byte_pc, (long)oldpc, (long)State.mem_min, (long)State.mem_max);
+ State.exception = SIGILL;
}
-
- if (State.RP && PC == RPT_E)
+ else
{
- RPT_C -= 1;
- if (RPT_C == 0)
- State.RP = 0;
- else
- PC = RPT_S;
- }
+ inst = RLW (byte_pc);
+ oldpc = PC;
+ switch (inst & 0xC0000000)
+ {
+ case 0xC0000000:
+ /* long instruction */
+ do_long (inst & 0x3FFFFFFF);
+ break;
+ case 0x80000000:
+ /* R -> L */
+ do_2_short ( inst & 0x7FFF, (inst & 0x3FFF8000) >> 15, 0);
+ break;
+ case 0x40000000:
+ /* L -> R */
+ do_2_short ((inst & 0x3FFF8000) >> 15, inst & 0x7FFF, 1);
+ break;
+ case 0:
+ do_parallel ((inst & 0x3FFF8000) >> 15, inst & 0x7FFF);
+ break;
+ }
- /* FIXME */
- if (PC == oldpc)
- PC++;
+ if (State.RP && PC == RPT_E)
+ {
+ RPT_C -= 1;
+ if (RPT_C == 0)
+ State.RP = 0;
+ else
+ PC = RPT_S;
+ }
+
+ /* FIXME */
+ if (PC == oldpc)
+ PC++;
+ }
}
while (!State.exception);
}
@@ -463,10 +487,25 @@ sim_create_inferior (start_address, argv, env)
char **argv;
char **env;
{
+ uint8 *imem, *dmem;
+ uint32 mem_min, mem_max;
#ifdef DEBUG
if (d10v_debug)
(*d10v_callback->printf_filtered) (d10v_callback, "sim_create_inferior: PC=0x%x\n", start_address);
#endif
+ /* save memory pointers */
+ imem = State.imem;
+ dmem = State.dmem;
+ mem_min = State.mem_min;
+ mem_max = State.mem_max;
+ /* reset all state information */
+ memset (&State, 0, sizeof(State));
+ /* restore memory pointers */
+ State.imem = imem;
+ State.dmem = dmem;
+ State.mem_min = mem_min;
+ State.mem_max = mem_max;
+ /* set PC */
PC = start_address >> 2;
}