Ejemplo n.º 1
0
static void
fetch_register (struct regcache *regcache, int regno)
{
    struct gdbarch *gdbarch = get_regcache_arch (regcache);
    int addr[MAX_REGISTER_SIZE];
    int nr, isfloat;

    /* Retrieved values may be -1, so infer errors from errno.  */
    errno = 0;

    nr = regmap (gdbarch, regno, &isfloat);

    /* Floating-point registers.  */
    if (isfloat)
        rs6000_ptrace32 (PT_READ_FPR, ptid_get_pid (inferior_ptid), addr, nr, 0);

    /* Bogus register number.  */
    else if (nr < 0)
    {
        if (regno >= gdbarch_num_regs (gdbarch))
            fprintf_unfiltered (gdb_stderr,
                                "gdb error: register no %d not implemented.\n",
                                regno);
        return;
    }

    /* Fixed-point registers.  */
    else
    {
        if (!ARCH64 ())
            *addr = rs6000_ptrace32 (PT_READ_GPR, ptid_get_pid (inferior_ptid),
                                     (int *) nr, 0, 0);
        else
        {
            /* PT_READ_GPR requires the buffer parameter to point to long long,
               even if the register is really only 32 bits.  */
            long long buf;
            rs6000_ptrace64 (PT_READ_GPR, ptid_get_pid (inferior_ptid),
                             nr, 0, &buf);
            if (register_size (gdbarch, regno) == 8)
                memcpy (addr, &buf, 8);
            else
                *addr = buf;
        }
    }

    if (!errno)
        regcache_raw_supply (regcache, regno, (char *) addr);
    else
    {
#if 0
        /* FIXME: this happens 3 times at the start of each 64-bit program.  */
        perror (_("ptrace read"));
#endif
        errno = 0;
    }
}
Ejemplo n.º 2
0
static void
store_register (struct regcache *regcache, int regno)
{
    struct gdbarch *gdbarch = get_regcache_arch (regcache);
    int addr[MAX_REGISTER_SIZE];
    int nr, isfloat;

    /* Fetch the register's value from the register cache.  */
    regcache_raw_collect (regcache, regno, addr);

    /* -1 can be a successful return value, so infer errors from errno.  */
    errno = 0;

    nr = regmap (gdbarch, regno, &isfloat);

    /* Floating-point registers.  */
    if (isfloat)
        rs6000_ptrace32 (PT_WRITE_FPR, ptid_get_pid (inferior_ptid), addr, nr, 0);

    /* Bogus register number.  */
    else if (nr < 0)
    {
        if (regno >= gdbarch_num_regs (gdbarch))
            fprintf_unfiltered (gdb_stderr,
                                "gdb error: register no %d not implemented.\n",
                                regno);
    }

    /* Fixed-point registers.  */
    else
    {
        /* The PT_WRITE_GPR operation is rather odd.  For 32-bit inferiors,
           the register's value is passed by value, but for 64-bit inferiors,
        the address of a buffer containing the value is passed.  */
        if (!ARCH64 ())
            rs6000_ptrace32 (PT_WRITE_GPR, ptid_get_pid (inferior_ptid),
                             (int *) nr, *addr, 0);
        else
        {
            /* PT_WRITE_GPR requires the buffer parameter to point to an 8-byte
               area, even if the register is really only 32 bits.  */
            long long buf;
            if (register_size (gdbarch, regno) == 8)
                memcpy (&buf, addr, 8);
            else
                buf = *addr;
            rs6000_ptrace64 (PT_WRITE_GPR, ptid_get_pid (inferior_ptid),
                             nr, 0, &buf);
        }
    }

    if (errno)
    {
        perror (_("ptrace write"));
        errno = 0;
    }
}
Ejemplo n.º 3
0
static void
store_register (struct regcache *regcache, int regno)
{
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
  int addr[MAX_REGISTER_SIZE];
  int nr, isfloat;

  /* Fetch the register's value from the register cache.  */
  regcache_raw_collect (regcache, regno, addr);

  /* -1 can be a successful return value, so infer errors from errno. */
  errno = 0;

  nr = regmap (gdbarch, regno, &isfloat);

  /* Floating-point registers. */
  if (isfloat)
    rs6000_ptrace32 (PT_WRITE_FPR, PIDGET (inferior_ptid), addr, nr, 0);

  /* Bogus register number. */
  else if (nr < 0)
    {
      if (regno >= gdbarch_num_regs (gdbarch))
	fprintf_unfiltered (gdb_stderr,
			    "gdb error: register no %d not implemented.\n",
			    regno);
    }

  /* Fixed-point registers. */
  else
    {
      if (regno == gdbarch_sp_regnum (gdbarch))
	/* Execute one dummy instruction (which is a breakpoint) in inferior
	   process to give kernel a chance to do internal housekeeping.
	   Otherwise the following ptrace(2) calls will mess up user stack
	   since kernel will get confused about the bottom of the stack
	   (%sp). */
	exec_one_dummy_insn (regcache);

      /* The PT_WRITE_GPR operation is rather odd.  For 32-bit inferiors,
         the register's value is passed by value, but for 64-bit inferiors,
	 the address of a buffer containing the value is passed.  */
      if (!ARCH64 ())
	rs6000_ptrace32 (PT_WRITE_GPR, PIDGET (inferior_ptid), (int *)nr, *addr, 0);
      else
	{
	  /* PT_WRITE_GPR requires the buffer parameter to point to an 8-byte
	     area, even if the register is really only 32 bits. */
	  long long buf;
	  if (register_size (gdbarch, regno) == 8)
	    memcpy (&buf, addr, 8);
	  else
	    buf = *addr;
	  rs6000_ptrace64 (PT_WRITE_GPR, PIDGET (inferior_ptid), nr, 0, &buf);
	}
    }

  if (errno)
    {
      perror ("ptrace write");
      errno = 0;
    }
}