aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1994-12-28 19:33:08 +0000
committerJeff Law <law@redhat.com>1994-12-28 19:33:08 +0000
commite43169eb57828e2c67f2671ddec84604ae0a08bb (patch)
treeb8987155f0eb8ceeee670f92d1b283479b79331a
parent61c4b14e98cbae3e7fcb793e77de0c81d0b7dddc (diff)
downloadgdb-e43169eb57828e2c67f2671ddec84604ae0a08bb.zip
gdb-e43169eb57828e2c67f2671ddec84604ae0a08bb.tar.gz
gdb-e43169eb57828e2c67f2671ddec84604ae0a08bb.tar.bz2
* hppa-tdep.c (push_dummy_frame): Return type is void. Clear
in_syscall bit in flags. Don't depend on the PC queue registers when in_syscall is set, they're not valid. * config/pa/tm-hppa.h (PUSH_DUMMY_FRAME): Pass inf_status down to push_dummy_frame. (SR4_REGNUM): Define. * hppa-tdep.c: Misc. lint changes.
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/hppa-tdep.c59
2 files changed, 58 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 61ffcfa..fa9bd14 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,14 @@
+Wed Dec 28 12:21:39 1994 Jeff Law (law@snake.cs.utah.edu)
+
+ * hppa-tdep.c (push_dummy_frame): Return type is void. Clear
+ in_syscall bit in flags. Don't depend on the PC queue registers
+ when in_syscall is set, they're not valid.
+ * config/pa/tm-hppa.h (PUSH_DUMMY_FRAME): Pass inf_status down to
+ push_dummy_frame.
+ (SR4_REGNUM): Define.
+
+ * hppa-tdep.c: Misc. lint changes.
+
Tue Dec 27 12:32:43 1994 Jeff Law (law@snake.cs.utah.edu)
* breakpoint.c (watchpoint_check): Don't bother restoring the
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index 1fd4fc3..dbdd1e5 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -82,6 +82,8 @@ static void internalize_unwinds PARAMS ((struct objfile *,
struct unwind_table_entry *,
asection *, unsigned int,
unsigned int, CORE_ADDR));
+static void pa_print_registers PARAMS ((char *, int, int));
+static void pa_print_fp_reg PARAMS ((int));
/* Routines to extract various sized constants out of hppa
@@ -311,7 +313,7 @@ internalize_unwinds (objfile, table, section, entries, size, text_offset)
buf += 4;
tmp = bfd_get_32 (objfile->obfd, (bfd_byte *)buf);
buf += 4;
- table[i].Cannot_unwind = (tmp >> 31) & 0x1;;
+ table[i].Cannot_unwind = (tmp >> 31) & 0x1;
table[i].Millicode = (tmp >> 30) & 0x1;
table[i].Millicode_save_sr0 = (tmp >> 29) & 0x1;
table[i].Region_description = (tmp >> 27) & 0x3;
@@ -1077,14 +1079,43 @@ frame_chain_valid (chain, thisframe)
* to be aligned to a 64-byte boundary.
*/
-int
-push_dummy_frame ()
+void
+push_dummy_frame (inf_status)
+ struct inferior_status *inf_status;
{
- register CORE_ADDR sp;
+ CORE_ADDR sp, pc, pcspace;
register int regnum;
int int_buffer;
double freg_buffer;
+ /* Oh, what a hack. If we're trying to perform an inferior call
+ while the inferior is asleep, we have to make sure to clear
+ the "in system call" bit in the flag register (the call will
+ start after the syscall returns, so we're no longer in the system
+ call!) This state is kept in "inf_status", change it there.
+
+ We also need a number of horrid hacks to deal with lossage in the
+ PC queue registers (apparently they're not valid when the in syscall
+ bit is set). */
+ pc = target_read_pc (inferior_pid);
+ int_buffer = read_register (FLAGS_REGNUM);
+ if (int_buffer & 0x2)
+ {
+ int_buffer &= ~0x2;
+ memcpy (inf_status->registers, &int_buffer, 4);
+ memcpy (inf_status->registers + REGISTER_BYTE (PCOQ_HEAD_REGNUM), &pc, 4);
+ pc += 4;
+ memcpy (inf_status->registers + REGISTER_BYTE (PCOQ_TAIL_REGNUM), &pc, 4);
+ pc -= 4;
+ pcspace = read_register (SR4_REGNUM);
+ memcpy (inf_status->registers + REGISTER_BYTE (PCSQ_HEAD_REGNUM),
+ &pcspace, 4);
+ memcpy (inf_status->registers + REGISTER_BYTE (PCSQ_TAIL_REGNUM),
+ &pcspace, 4);
+ }
+ else
+ pcspace = read_register (PCSQ_HEAD_REGNUM);
+
/* Space for "arguments"; the RP goes in here. */
sp = read_register (SP_REGNUM) + 48;
int_buffer = read_register (RP_REGNUM) | 0x3;
@@ -1110,13 +1141,14 @@ push_dummy_frame ()
}
sp = push_word (sp, read_register (IPSW_REGNUM));
sp = push_word (sp, read_register (SAR_REGNUM));
- sp = push_word (sp, read_register (PCOQ_HEAD_REGNUM));
- sp = push_word (sp, read_register (PCSQ_HEAD_REGNUM));
- sp = push_word (sp, read_register (PCOQ_TAIL_REGNUM));
- sp = push_word (sp, read_register (PCSQ_TAIL_REGNUM));
+ sp = push_word (sp, pc);
+ sp = push_word (sp, pcspace);
+ sp = push_word (sp, pc + 4);
+ sp = push_word (sp, pcspace);
write_register (SP_REGNUM, sp);
}
+void
find_dummy_frame_regs (frame, frame_saved_regs)
struct frame_info *frame;
struct frame_saved_regs *frame_saved_regs;
@@ -1149,7 +1181,7 @@ find_dummy_frame_regs (frame, frame_saved_regs)
frame_saved_regs->regs[PCSQ_TAIL_REGNUM] = fp + 20;
}
-int
+void
hppa_pop_frame ()
{
register struct frame_info *frame = get_current_frame ();
@@ -1247,7 +1279,6 @@ restore_pc_queue (fsr)
{
CORE_ADDR pc = read_pc ();
CORE_ADDR new_pc = read_memory_integer (fsr->regs[PCOQ_HEAD_REGNUM], 4);
- int pid;
struct target_waitstatus w;
int insn_count;
@@ -1537,6 +1568,7 @@ hppa_alignof (arg)
/* Print the register regnum, or all registers if regnum is -1 */
+void
pa_do_registers_info (regnum, fpregs)
int regnum;
int fpregs;
@@ -1555,6 +1587,7 @@ pa_do_registers_info (regnum, fpregs)
pa_print_fp_reg (regnum);
}
+static void
pa_print_registers (raw_regs, regnum, fpregs)
char *raw_regs;
int regnum;
@@ -1578,6 +1611,7 @@ pa_print_registers (raw_regs, regnum, fpregs)
pa_print_fp_reg (i);
}
+static void
pa_print_fp_reg (i)
int i;
{
@@ -1625,6 +1659,7 @@ pa_print_fp_reg (i)
Note we return one for *any* call trampoline (long-call, arg-reloc), not
just shared library trampolines (import, export). */
+int
in_solib_call_trampoline (pc, name)
CORE_ADDR pc;
char *name;
@@ -1717,11 +1752,11 @@ in_solib_call_trampoline (pc, name)
Note we return one for *any* call trampoline (long-call, arg-reloc), not
just shared library trampolines (import, export). */
+int
in_solib_return_trampoline (pc, name)
CORE_ADDR pc;
char *name;
{
- struct minimal_symbol *minsym;
struct unwind_table_entry *u;
/* Get the unwind descriptor corresponding to PC, return zero
@@ -2144,7 +2179,7 @@ skip_prologue (pc)
{
unsigned int reg_num;
unsigned long old_stack_remaining, old_save_gr, old_save_fr;
- unsigned long old_save_rp, old_save_sp, old_args_stored, next_inst;
+ unsigned long old_save_rp, old_save_sp, next_inst;
/* Save copies of all the triggers so we can compare them later
(only for HPC). */