gdb/hppa-hpux-nat.c - gdb
 Functions defined
 
 Macros defined
 
 Source code
  
 
 
 
 
 
 
- #include "defs.h"
 
- #include "inferior.h"
 
- #include "regcache.h"
 
- #include "target.h"
 
 
- #include <sys/ptrace.h>
 
- #include <sys/utsname.h>
 
- #include <machine/save_state.h>
 
 
- #ifdef HAVE_TTRACE
 
- #include <sys/ttrace.h>
 
- #endif
 
 
- #include "hppa-tdep.h"
 
- #include "solib-som.h"
 
- #include "inf-ptrace.h"
 
- #include "inf-ttrace.h"
 
 
 
- static LONGEST
 
- hppa_hpux_save_state_offset (struct regcache *regcache, int regnum)
 
- {
 
-   LONGEST offset;
 
 
-   if (regnum == HPPA_FLAGS_REGNUM)
 
-     return ssoff (ss_flags);
 
 
-   if (HPPA_R0_REGNUM < regnum && regnum < HPPA_FP0_REGNUM)
 
-     {
 
-       struct gdbarch *arch = get_regcache_arch (regcache);
 
-       size_t size = register_size (arch, HPPA_R1_REGNUM);
 
-       ULONGEST flags;
 
 
-       gdb_assert (size == 4 || size == 8);
 
 
-       regcache_cooked_read_unsigned (regcache, HPPA_FLAGS_REGNUM, &flags);
 
-       if (flags & SS_WIDEREGS)
 
-         offset = ssoff (ss_wide) + (8 - size) + (regnum - HPPA_R0_REGNUM) * 8;
 
-       else
 
-         offset = ssoff (ss_narrow) + (regnum - HPPA_R1_REGNUM) * 4;
 
-     }
 
-   else
 
-     {
 
-       struct gdbarch *arch = get_regcache_arch (regcache);
 
-       size_t size = register_size (arch, HPPA_FP0_REGNUM);
 
 
-       gdb_assert (size == 4 || size == 8);
 
-       gdb_assert (regnum >= HPPA_FP0_REGNUM);
 
-       offset = ssoff(ss_fpblock) + (regnum - HPPA_FP0_REGNUM) * size;
 
-     }
 
 
-   gdb_assert (offset < sizeof (save_state_t));
 
-   return offset;
 
- }
 
 
- #ifndef PTRACE_TYPE_RET
 
- #define PTRACE_TYPE_RET void
 
- #endif
 
 
- static void
 
- hppa_hpux_fetch_register (struct regcache *regcache, int regnum)
 
- {
 
-   struct gdbarch *gdbarch = get_regcache_arch (regcache);
 
-   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
-   CORE_ADDR addr;
 
-   size_t size;
 
-   PTRACE_TYPE_RET *buf;
 
-   pid_t pid;
 
-   int i;
 
 
-   pid = ptid_get_pid (inferior_ptid);
 
 
-   
-   addr = hppa_hpux_save_state_offset (regcache, regnum);
 
-   size = register_size (gdbarch, regnum);
 
 
-   gdb_assert (size == 4 || size == 8);
 
-   buf = alloca (size);
 
 
- #ifdef HAVE_TTRACE
 
-   {
 
-     lwpid_t lwp = ptid_get_lwp (inferior_ptid);
 
 
-     if (ttrace (TT_LWP_RUREGS, pid, lwp, addr, size, (uintptr_t)buf) == -1)
 
-       error (_("Couldn't read register %s (#%d): %s"),
 
-              gdbarch_register_name (gdbarch, regnum),
 
-              regnum, safe_strerror (errno));
 
-   }
 
- #else
 
-   {
 
-     int i;
 
 
-     
-     for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
 
-       {
 
-         errno = 0;
 
-         buf[i] = ptrace (PT_RUREGS, pid, (PTRACE_TYPE_ARG3) addr, 0, 0);
 
-         if (errno != 0)
 
-           error (_("Couldn't read register %s (#%d): %s"),
 
-                  gdbarch_register_name (gdbarch, regnum),
 
-                  regnum, safe_strerror (errno));
 
 
-         addr += sizeof (PTRACE_TYPE_RET);
 
-       }
 
-   }
 
- #endif
 
 
-   
-   if (regnum == HPPA_FLAGS_REGNUM && size == 8)
 
-     {
 
-       ULONGEST flags;
 
-       flags = extract_unsigned_integer ((gdb_byte *)buf, 4, byte_order);
 
-       store_unsigned_integer ((gdb_byte *)buf, 8, byte_order, flags);
 
-     }
 
 
-   regcache_raw_supply (regcache, regnum, buf);
 
- }
 
 
- static void
 
- hppa_hpux_fetch_inferior_registers (struct target_ops *ops,
 
-                                     struct regcache *regcache, int regnum)
 
- {
 
-   if (regnum == -1)
 
-     for (regnum = 0;
 
-          regnum < gdbarch_num_regs (get_regcache_arch (regcache));
 
-          regnum++)
 
-       hppa_hpux_fetch_register (regcache, regnum);
 
-   else
 
-     hppa_hpux_fetch_register (regcache, regnum);
 
- }
 
 
 
- static void
 
- hppa_hpux_store_register (struct regcache *regcache, int regnum)
 
- {
 
-   struct gdbarch *gdbarch = get_regcache_arch (regcache);
 
-   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
-   CORE_ADDR addr;
 
-   size_t size;
 
-   PTRACE_TYPE_RET *buf;
 
-   pid_t pid;
 
 
-   pid = ptid_get_pid (inferior_ptid);
 
 
-   
-   addr = hppa_hpux_save_state_offset (regcache, regnum);
 
-   size = register_size (gdbarch, regnum);
 
 
-   gdb_assert (size == 4 || size == 8);
 
-   buf = alloca (size);
 
 
-   regcache_raw_collect (regcache, regnum, buf);
 
 
-   
-   if (regnum == HPPA_FLAGS_REGNUM && size == 8)
 
-     {
 
-       ULONGEST flags;
 
-       flags = extract_unsigned_integer ((gdb_byte *)buf, 8, byte_order);
 
-       store_unsigned_integer ((gdb_byte *)buf, 4, byte_order, flags);
 
-       size = 4;
 
-     }
 
 
- #ifdef HAVE_TTRACE
 
-   {
 
-     lwpid_t lwp = ptid_get_lwp (inferior_ptid);
 
 
-     if (ttrace (TT_LWP_WUREGS, pid, lwp, addr, size, (uintptr_t)buf) == -1)
 
-       error (_("Couldn't write register %s (#%d): %s"),
 
-              gdbarch_register_name (gdbarch, regnum),
 
-              regnum, safe_strerror (errno));
 
-   }
 
- #else
 
-   {
 
-     int i;
 
 
-     
-     for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
 
-       {
 
-         errno = 0;
 
-         ptrace (PT_WUREGS, pid, (PTRACE_TYPE_ARG3) addr, buf[i], 0);
 
-         if (errno != 0)
 
-           error (_("Couldn't write register %s (#%d): %s"),
 
-                  gdbarch_register_name (gdbarch, regnum),
 
-                  regnum, safe_strerror (errno));
 
 
-         addr += sizeof (PTRACE_TYPE_RET);
 
-       }
 
-   }
 
- #endif
 
- }
 
 
 
- static void
 
- hppa_hpux_store_inferior_registers (struct target_ops *ops,
 
-                                     struct regcache *regcache, int regnum)
 
- {
 
-   if (regnum == -1)
 
-     for (regnum = 0;
 
-          regnum < gdbarch_num_regs (get_regcache_arch (regcache));
 
-          regnum++)
 
-       hppa_hpux_store_register (regcache, regnum);
 
-   else
 
-     hppa_hpux_store_register (regcache, regnum);
 
- }
 
 
 
- static void
 
- set_hpux_major_release (void)
 
- {
 
-   struct utsname x;
 
-   char *p;
 
 
-   uname (&x);
 
-   p = strchr (x.release, '.');
 
-   if (p)
 
-     hpux_major_release = atoi (p + 1);
 
- }
 
 
 
 
- void _initialize_hppa_hpux_nat (void);
 
 
- void
 
- _initialize_hppa_hpux_nat (void)
 
- {
 
-   struct target_ops *t;
 
 
-   set_hpux_major_release ();
 
 
- #ifdef HAVE_TTRACE
 
-   t = inf_ttrace_target ();
 
- #else
 
-   t = inf_ptrace_target ();
 
- #endif
 
 
-   t->to_fetch_registers = hppa_hpux_fetch_inferior_registers;
 
-   t->to_store_registers = hppa_hpux_store_inferior_registers;
 
 
-   add_target (t);
 
- }