check to use prev_func_start/end instead of stop_func_start/end.
* remote-udi.c (store_register): Invalidate NPC/PC_REGNUM after
changing PC.
+Mon Oct 25 11:08:59 1993 Stu Grossman (grossman at cygnus.com)
+
+ * infrun.c (wait_for_inferior): Fix PC out of subroutine bounds
+ check to use prev_func_start/end instead of stop_func_start/end.
+ * remote-udi.c (store_register): Invalidate NPC/PC_REGNUM after
+ changing PC.
+
Mon Oct 25 14:57:45 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* gdbserver/{low-lynx.c,low-sparc.c,low-sun3.c}, standalone.c,
static CORE_ADDR prev_pc;
static CORE_ADDR prev_sp;
static CORE_ADDR prev_func_start;
+static CORE_ADDR prev_func_end;
static char *prev_func_name;
\f
or the call instruction itself saves the PC on the stack. */
|| prologue_pc != stop_func_start
|| stop_sp != prev_sp)
- && (/* I think this can only happen if stop_func_start is zero
- (e.g. stop_pc is in some objfile we don't know about).
- If the stop_pc does that (ends up someplace unknown), it
- must be some sort of subroutine call. */
- stop_pc < stop_func_start
- || stop_pc >= stop_func_end
+ && (/* PC is out of bounds of the current function. Note that this
+ seems sorta redundant w.r.t the prior test of stop_func_start
+ != prev_func_start... */
+ stop_pc < prev_func_start
+ || stop_pc >= prev_func_end
/* If we do a call, we will be at the start of a function. */
|| stop_pc == stop_func_start
original pc would not have
been at the start of a
function. */
+ prev_func_end = stop_func_end;
prev_func_name = stop_func_name;
prev_sp = stop_sp;
loop. */
prev_pc = read_pc ();
prev_func_start = stop_func_start;
+ prev_func_end = stop_func_end;
prev_func_name = stop_func_name;
prev_sp = stop_sp;
}
UDIBool HostEndian = 0;
UDIError err;
int pc[2];
+ unsigned long myregs[256];
+ int i;
From.Space = UDI29KPC;
From.Offset = 0;
printf("other pc1 = 0x%x, pc0 = 0x%x\n", *(int *)®isters[4 * PC_REGNUM],
*(int *)®isters[4 * NPC_REGNUM]);
+ /* Now, read all the registers globally */
+
+ From.Space = UDI29KGlobalRegs;
+ From.Offset = 0;
+ err = UDIRead(From, myregs, 256, 4, &CountDone, HostEndian);
+
+ printf ("err = %d, CountDone = %d\n", err, CountDone);
+
+ printf("\n");
+
+ for (i = 0; i < 256; i += 2)
+ printf("%d:\t%#10x\t%11d\t%#10x\t%11d\n", i, myregs[i], myregs[i],
+ myregs[i+1], myregs[i+1]);
+ printf("\n");
+
return pc[0];
}
#endif
To.Space = UDI29KPC;
To.Offset = 0; /* PC1 */
result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
+
+ /* Writing to this loc actually changes the values of pc0 & pc1 */
+
+ register_valid[PC_REGNUM] = 0; /* pc1 */
+ register_valid[NPC_REGNUM] = 0; /* pc0 */
}
else /* An unprotected or protected special register */
{
FILE* EchoFile = 0; /* used for debugging */
int QuietMode = 0; /* used for debugging */
\f
+#ifdef NO_HIF_SUPPORT
+service_HIF(msg)
+ union msg_t *msg;
+{
+ return(0); /* Emulate a failure */
+}
+#endif
+\f
/* Target_ops vector. Not static because there does not seem to be
any portable way to do a forward declaration of a static variable.
The RS/6000 doesn't like "extern" followed by "static"; SunOS
{
add_target (&udi_ops);
}
-
-#ifdef NO_HIF_SUPPORT
-service_HIF(msg)
-union msg_t *msg;
-{
- return(0); /* Emulate a failure */
-}
-#endif