From e43169eb57828e2c67f2671ddec84604ae0a08bb Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 28 Dec 1994 19:33:08 +0000 Subject: * 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. --- gdb/ChangeLog | 11 +++++++++++ gdb/hppa-tdep.c | 59 +++++++++++++++++++++++++++++++++++++++++++++------------ 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). */ -- cgit v1.1