Example #1
0
static int
i386nto_regset_fill (int regset, char *data)
{
  if (regset == NTO_REG_GENERAL)
    {
      int regno;

      for (regno = 0; regno < NUM_GPREGS; regno++)
	{
	  int offset = nto_reg_offset (regno);
	  if (offset != -1)
	    regcache_collect (regno, data + offset);
	}
    }
  else if (regset == NTO_REG_FLOAT)
    {
      if (nto_cpuinfo_valid && nto_cpuinfo_flags | X86_CPU_FXSR)
	i387_fill_fxsave (data, -1);
      else
	i387_fill_fsave (data, -1);
    }
  else
    return -1;

  return 0;
}
Example #2
0
static void
i386nto_supply_gregset (char *gpregs)
{
  unsigned regno;
  int empty = 0;

  for (regno = 0; regno < FP0_REGNUM; regno++)
    {
      int offset = nto_reg_offset (regno);
      if (offset == -1)
	supply_register (regno, (char *) &empty);
      else
	supply_register (regno, gpregs + offset);
    }
}
static int
i386nto_register_area (int regno, int regset, unsigned *off)
{
  int len;

  *off = 0;
  if (regset == NTO_REG_GENERAL)
    {
      if (regno == -1)
	return NUM_GPREGS * 4;

      *off = nto_reg_offset (regno);
      if (*off == -1)
	return 0;
      return 4;
    }
  else if (regset == NTO_REG_FLOAT)
    {
      unsigned off_adjust, regsize, regset_size;

      if (nto_cpuinfo_valid && nto_cpuinfo_flags | X86_CPU_FXSR)
	{
	  off_adjust = 32;
	  regsize = 16;
	  regset_size = 512;
	}
      else
	{
	  off_adjust = 28;
	  regsize = 10;
	  regset_size = 128;
	}

      if (regno == -1)
	return regset_size;

      *off = (regno - gdbarch_fp0_regnum (current_gdbarch))
	     * regsize + off_adjust;
      return 10;
      /* Why 10 instead of regsize?  GDB only stores 10 bytes per FP
         register so if we're sending a register back to the target,
         we only want pdebug to write 10 bytes so as not to clobber
         the reserved 6 bytes in the fxsave structure.  */
    }
  return -1;
}
Example #4
0
static int
i386nto_register_area (struct gdbarch *gdbarch,
		       int regno, int regset, unsigned *off)
{
  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
  int len;

  *off = 0;
  if (regset == NTO_REG_GENERAL)
    {
      if (regno == -1)
	return NUM_GPREGS * 4;

      *off = nto_reg_offset (regno);
      if (*off == -1)
	return 0;
      return 4;
    }
  else if (regset == NTO_REG_FLOAT)
    {
      unsigned off_adjust, regsize, regset_size, regno_base;
      /* The following are flags indicating number in our fxsave_area.  */
      int first_four = (regno >= I387_FCTRL_REGNUM (tdep)
			&& regno <= I387_FISEG_REGNUM (tdep));
      int second_four = (regno > I387_FISEG_REGNUM (tdep)
			 && regno <= I387_FOP_REGNUM (tdep));
      int st_reg = (regno >= I387_ST0_REGNUM (tdep)
		    && regno < I387_ST0_REGNUM (tdep) + 8);
      int xmm_reg = (regno >= I387_XMM0_REGNUM (tdep)
		     && regno < I387_MXCSR_REGNUM (tdep));

      if (nto_cpuinfo_valid && nto_cpuinfo_flags | X86_CPU_FXSR)
	{
	  off_adjust = 32;
	  regsize = 16;
	  regset_size = 512;
	  /* fxsave_area structure.  */
	  if (first_four)
	    {
	      /* fpu_control_word, fpu_status_word, fpu_tag_word, fpu_operand
	         registers.  */
	      regsize = 2; /* Two bytes each.  */
	      off_adjust = 0;
	      regno_base = I387_FCTRL_REGNUM (tdep);
	    }
	  else if (second_four)
	    {
	      /* fpu_ip, fpu_cs, fpu_op, fpu_ds registers.  */
	      regsize = 4;
	      off_adjust = 8;
	      regno_base = I387_FISEG_REGNUM (tdep) + 1;
	    }
	  else if (st_reg)
	    {
	      /* ST registers.  */
	      regsize = 16;
	      off_adjust = 32;
	      regno_base = I387_ST0_REGNUM (tdep);
	    }
	  else if (xmm_reg)
	    {
	      /* XMM registers.  */
	      regsize = 16;
	      off_adjust = 160;
	      regno_base = I387_XMM0_REGNUM (tdep);
	    }
	  else if (regno == I387_MXCSR_REGNUM (tdep))
	    {
	      regsize = 4;
	      off_adjust = 24;
	      regno_base = I387_MXCSR_REGNUM (tdep);
	    }
	  else
	    {
	      /* Whole regset.  */
	      gdb_assert (regno == -1);
	      off_adjust = 0;
	      regno_base = 0;
	      regsize = regset_size;
	    }
	}
      else
	{
	  regset_size = 108;
	  /* fsave_area structure.  */
	  if (first_four || second_four)
	    {
	      /* fpu_control_word, ... , fpu_ds registers.  */
	      regsize = 4;
	      off_adjust = 0;
	      regno_base = I387_FCTRL_REGNUM (tdep);
	    }
	  else if (st_reg)
	    {
	      /* One of ST registers.  */
	      regsize = 10;
	      off_adjust = 7 * 4;
	      regno_base = I387_ST0_REGNUM (tdep);
	    }
	  else
	    {
	      /* Whole regset.  */
	      gdb_assert (regno == -1);
	      off_adjust = 0;
	      regno_base = 0;
	      regsize = regset_size;
	    }
	}

      if (regno != -1)
	*off = off_adjust + (regno - regno_base) * regsize;
      else
	*off = 0;
      return regsize;
    }
  return -1;
}