diff options
author | Stu Grossman <grossman@cygnus> | 1992-12-22 03:18:46 +0000 |
---|---|---|
committer | Stu Grossman <grossman@cygnus> | 1992-12-22 03:18:46 +0000 |
commit | 9f739abdacc530b319f71e627a766d030ab7268a (patch) | |
tree | e78193876b9ddabfad34ddf79e8dea7ca82e1f5c /gdb/hppah-nat.c | |
parent | d9a30dc6c50d7ebadbea2b5cd0d2711e90c8c5cb (diff) | |
download | gdb-9f739abdacc530b319f71e627a766d030ab7268a.zip gdb-9f739abdacc530b319f71e627a766d030ab7268a.tar.gz gdb-9f739abdacc530b319f71e627a766d030ab7268a.tar.bz2 |
* hppa-pinsn.c (print_insn): Improve handling of be and ble
branch targets to compute target address using const from previous
instruction if necessary.
* Add `Q' operator to print out bit position field various
instructions.
* hppah-nat.c: #include sys/param.h, and sys/user.h. General
cleanups, use new code from Utah.
* (store_inferior_registers): Update to new code from Utah.
* (initialize_kernel_u_addr): Re-enable decl of struct user u.
* (fetch_register): Clear out priv level when reading PCs.
* hppah-tdep.c: Get rid of gobs of KERNELDEBUG stuff.
* Remove decl of errno, #include wait.h and target.h.
* (frame_saved_pc): Check `flags' pseudo-register to see if we
were inside of a kernel call. If so, then PC is in a different
register. Also, mask out bottom two bits of all PCs so as not to
confuse higher level code.
* (push_dummy_frame): Create from #define in tm-hppa.h.
* (find_dummy_frame_regs): Update from Utah.
* (hp_pop_frame): Create from #define in tm-hppa.h.
* (hp_restore_pc_queue): New, from Utah.
* (hp_push_arguments): Big fixes from Utah.
* (pa_do_registers_info, pa_print_registers): Only print out fp
regs upon request.
* (skip_trampoline_code): New routine to deal with stubs that
live in nowhereland between callers and callees.
* i860-tdep.c: Remove decl of attach_flag.
* infrun.c (wait_for_inferior): Add new macro
INSTRUCTION_NULLIFIED, which can tell if the instruction pointed
at by PC will be nullified. If so, then step the target once more
so as to avoid confusing the user.
* (just before step_over_function:): Use stop_func_start, not
stop_pc when checking for the existance of line number info.
stop_func_start will reflect the proper address of the target
routine, not of the stub that we may be traversing to get there.
* tm-hppa.h: define SKIP_TRAMPOLINE_CODE and IN_SOLIB_TRAMPOLINE
to deal with the stubs that PA compilers sometimes stick between
callers and callees. Also, define FLAGS_REGNUM for access to the
`flags' pseudo-reg.
* (REGISTER_CONVERT_TO_VIRTUAL, REGISTER_CONVERT_TO_RAW): Use
memcpy, not bcopy.
* (CANNOT_STORE_REGISTER): New from Utah. Says that we can't
write gr0, PC regs, and PSW!
* (FRAME_FIND_SAVED_REGS): Bug fixes from Utah.
* (PUSH_DUMMY_FRAME, POP_FRAME): Make into real routines in
hppah-nat.c.
* (CALL_DUMMY, FIX_CALL_DUMMY): Fixes from Utah.
* Define struct unwind_table_entry.
* valops.c (call_function_by_hand): Add another arg to
FIX_CALL_DUMMY (under #ifdef GDB_TARGET_IS_HPPA). Why is this
necessary?
Diffstat (limited to 'gdb/hppah-nat.c')
-rw-r--r-- | gdb/hppah-nat.c | 110 |
1 files changed, 66 insertions, 44 deletions
diff --git a/gdb/hppah-nat.c b/gdb/hppah-nat.c index afdb14c..bef53e9 100644 --- a/gdb/hppah-nat.c +++ b/gdb/hppah-nat.c @@ -27,6 +27,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "inferior.h" #include "target.h" #include <sys/ptrace.h> +#include <sys/param.h> +#include <sys/user.h> + +extern CORE_ADDR text_end; static void fetch_register (); @@ -105,42 +109,70 @@ store_inferior_registers (regno) char buf[80]; extern char registers[]; register int i; - unsigned int offset = U_REGS_OFFSET; + int scratch; if (regno >= 0) { regaddr = register_addr (regno, offset); - for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int)) - { - errno = 0; - ptrace (PT_WUAREA, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, - *(int *) ®isters[REGISTER_BYTE (regno) + i], 0); - if (errno != 0) - { - sprintf (buf, "writing register number %d(%d)", regno, i); - perror_with_name (buf); - } - regaddr += sizeof(int); - } + errno = 0; + if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM) + { + scratch = *(int *) ®isters[REGISTER_BYTE (regno)] | 0x3; + ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, + scratch, 0); + if (errno != 0) + { + sprintf (buf, "writing register number %d(%d)", regno, i); + perror_with_name (buf); + } + } + else + for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int)) + { + errno = 0; + ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, + *(int *) ®isters[REGISTER_BYTE (regno) + i], 0); + if (errno != 0) + { + sprintf (buf, "writing register number %d(%d)", regno, i); + perror_with_name (buf); + } + regaddr += sizeof(int); + } } else { for (regno = 0; regno < NUM_REGS; regno++) { + if (CANNOT_STORE_REGISTER (regno)) + continue; regaddr = register_addr (regno, offset); - for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int)) - { - errno = 0; - ptrace (PT_WUAREA, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, - *(int *) ®isters[REGISTER_BYTE (regno) + i], 0); - if (errno != 0) - { - sprintf (buf, "writing register number %d(%d)", regno, i); - perror_with_name (buf); - } - regaddr += sizeof(int); - } + errno = 0; + if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM) + { + scratch = *(int *) ®isters[REGISTER_BYTE (regno)] | 0x3; + ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, + scratch, 0); + if (errno != 0) + { + sprintf (buf, "writing register number %d(%d)", regno, i); + perror_with_name (buf); + } + } + else + for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int)) + { + errno = 0; + ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, + *(int *) ®isters[REGISTER_BYTE (regno) + i], 0); + if (errno != 0) + { + sprintf (buf, "writing register number %d(%d)", regno, i); + perror_with_name (buf); + } + regaddr += sizeof(int); + } } } return; @@ -165,9 +197,7 @@ static struct hpnlist nl[] = {{ "_u", -1, }, { (char *) 0, }}; /* read the value of the u area from the hp-ux kernel */ void _initialize_kernel_u_addr () { -#if 0 struct user u; -#endif nlist ("/hp-ux", &nl); kernel_u_addr = nl[0].n_value; } @@ -213,6 +243,8 @@ fetch_register (regno) perror_with_name (mess); } } + if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM) + buf[3] &= ~0x3; supply_register (regno, buf); } @@ -280,14 +312,14 @@ child_xfer_memory (memaddr, myaddr, len, write, target) if (addr != memaddr || len < (int)sizeof (int)) { /* Need part of initial word -- fetch it. */ - buffer[0] = ptrace (PT_RIUSER, inferior_pid, - (PTRACE_ARG3_TYPE) addr, 0, 0); + buffer[0] = ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER, + inferior_pid, (PTRACE_ARG3_TYPE) addr, 0, 0); } if (count > 1) /* FIXME, avoid if even boundary */ { buffer[count - 1] - = ptrace (PT_RIUSER, inferior_pid, + = ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER, inferior_pid, (PTRACE_ARG3_TYPE) (addr + (count - 1) * sizeof (int)), 0, 0); } @@ -300,24 +332,15 @@ child_xfer_memory (memaddr, myaddr, len, write, target) for (i = 0; i < count; i++, addr += sizeof (int)) { -#if 0 /* The HP-UX kernel crashes if you use PT_WDUSER to write into the text segment. FIXME -- does it work to write into the data segment using WIUSER, or do these idiots really expect us to figure out which segment the address is in, so we can use a separate system call for it??! */ errno = 0; - ptrace (PT_WDUSER, inferior_pid, (PTRACE_ARG3_TYPE) addr, + ptrace (addr < text_end ? PT_WIUSER : PT_WDUSER, inferior_pid, + (PTRACE_ARG3_TYPE) addr, buffer[i], 0); if (errno) -#endif - { - /* Using the appropriate one (I or D) is necessary for - Gould NP1, at least. */ - errno = 0; - ptrace (PT_WIUSER, inferior_pid, (PTRACE_ARG3_TYPE) addr, - buffer[i], 0); - } - if (errno) return 0; } } @@ -327,8 +350,8 @@ child_xfer_memory (memaddr, myaddr, len, write, target) for (i = 0; i < count; i++, addr += sizeof (int)) { errno = 0; - buffer[i] = ptrace (PT_RIUSER, inferior_pid, - (PTRACE_ARG3_TYPE) addr, 0, 0); + buffer[i] = ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER, + inferior_pid, (PTRACE_ARG3_TYPE) addr, 0, 0); if (errno) return 0; QUIT; @@ -339,4 +362,3 @@ child_xfer_memory (memaddr, myaddr, len, write, target) } return len; } - |