OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [or1k-tdep.c] - Diff between revs 105 and 113

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 105 Rev 113
Line 38... Line 38...
 
 
/* *INDENT-OFF* */
/* *INDENT-OFF* */
 
 
/* Group reg name size.  See or1k_reg_names.  */
/* Group reg name size.  See or1k_reg_names.  */
int or1k_group_name_sizes[OR1K_NUM_SPR_GROUPS] = {
int or1k_group_name_sizes[OR1K_NUM_SPR_GROUPS] = {
  64, 0, 0, 0, 0, 0, (24+32+32), 0, 0, 0 };
  64,   0,   0, 6, 6, 2, (24+32+32), 16, 1, 3, 2};
 
 
/* Generated reg names.  See or1k_internal_reg_name.  */
/* Generated reg names.  See or1k_spr_reg_name.  */
int or1k_spr_valid_aliases[OR1K_NUM_SPR_GROUPS] = {
int or1k_spr_valid_aliases[OR1K_NUM_SPR_GROUPS] = {
  64, 515, 0, 0, 0, 0, (24+32+32), 0, 0, 0 };
  64, 515, 515, 6, 6, 2, (24+32+32), 16, 1, 3, 2};
 
 
/* Register names.  */
/* Register names.  */
char *or1k_reg_names[] = {
char *or1k_reg_names[] = {
  /* group 0 - general*/
  /* group 0 - general*/
  "?", "VR", "UPR", "SR", "EPCR0", "?", "?", "?",
  "UPR",    "VR", "PC", "SR", "EPCR0", "SPR0_5", "SPR0_6", "SPR0_7",
  "?", "?", "?", "?", "?", "?", "?", "?",
  "SPR0_8", "SPR0_9", "SPR0_10", "SPR0_11", "SPR0_12", "SPR0_13", "SPR0_14", "SPR0_15",
  "EPCR0", "EPCR1", "EPCR2", "EPCR3", "EPCR4", "EPCR5", "EPCR6", "EPCR7",
  "EPCR0", "EPCR1", "EPCR2", "EPCR3", "EPCR4", "EPCR5", "EPCR6", "EPCR7",
  "EPCR8", "EPCR9", "EPCR10", "EPCR11", "EPCR12", "EPCR13", "EPCR14", "EPCR15",
  "EPCR8", "EPCR9", "EPCR10", "EPCR11", "EPCR12", "EPCR13", "EPCR14", "EPCR15",
  "EEAR0","EEAR1", "EEAR2", "EEAR3", "EEAR4", "EEAR5", "EEAR6", "EEAR7",
  "EEAR0","EEAR1", "EEAR2", "EEAR3", "EEAR4", "EEAR5", "EEAR6", "EEAR7",
  "EEAR8", "EEAR9", "EEAR10", "EEAR11", "EEAR12", "EEAR13", "EEAR14", "EEAR15",
  "EEAR8", "EEAR9", "EEAR10", "EEAR11", "EEAR12", "EEAR13", "EEAR14", "EEAR15",
  "ESR0", "ESR1", "ESR2", "ESR3", "ESR4", "ESR5", "ESR6", "ESR7",
  "ESR0", "ESR1", "ESR2", "ESR3", "ESR4", "ESR5", "ESR6", "ESR7",
  "ESR8", "ESR9", "ESR10", "ESR11", "ESR12", "ESR13", "ESR14", "ESR15",
  "ESR8", "ESR9", "ESR10", "ESR11", "ESR12", "ESR13", "ESR14", "ESR15",
 
  /* gpr+vf registers generated */
  /* group 1 - Data MMU - not listed, generated */
  /* group 1 - Data MMU - not listed, generated */
 
  /* group 2 - Instruction MMU - not listed, generated */
 
  /* group 3 - Data cache */
 
  "DCCR", "DCBPR", "DCBFR", "DCBIR", "DCBWR", "DCBLR",
 
  /* group 4 - Instruction cache */
 
  "ICCR", "ICBPR", "ICBFR", "ICBIR", "ICBWR", "ICBLR",
 
  /* group 5 - MAC */
 
  "MACLO", "MACHI",
  /* group 6 - debug */
  /* group 6 - debug */
  "DVR0", "DVR1", "DVR2", "DVR3", "DVR4", "DVR5", "DVR6", "DVR7",
  "DVR0", "DVR1", "DVR2", "DVR3", "DVR4", "DVR5", "DVR6", "DVR7",
  "DCR0", "DCR1", "DCR2", "DCR3", "DCR4", "DCR5", "DCR6", "DCR7",
  "DCR0", "DCR1", "DCR2", "DCR3", "DCR4", "DCR5", "DCR6", "DCR7",
  "DMR1", "DMR2", "DCWR0", "DCWR1", "DSR", "DRR", "PC", "?",
  "DMR1", "DMR2", "DCWR0","DCWR1", "DSR", "DRR",  "PC",   "SPR6_23",
 
 
 
  /* group 7 - performance counters unit */
 
  "PCCR0", "PCCR1", "PCCR2", "PCCR3", "PCCR4", "PCCR5", "PCCR6", "PCCR7",
 
  "PCCM0", "PCMR1", "PCMR2", "PCMR3", "PCMR4", "PCMR5", "PCMR6", "PCMR7",
 
 
 
  /* group 8 - power management */
 
  "PMR",
 
 
 
  /* group 9 - PIC */
 
  "PICMR", "PICPR",
 
 
 
  /* group 10 - tick timer */
 
  "TTCR", "TTIR"
 
};
 
 
 
static char *or1k_gdb_reg_names[] = {
  /* general purpose registers */
  /* general purpose registers */
  "ZERO", "SP", "FP", "A0", "A1", "A2", "A3", "A4",
  "ZERO", "SP", "FP", "A0", "A1", "A2", "A3", "A4",
  "A5", "LR", "R10", "RV", "R12", "R13", "R14", "R15",
  "A5", "LR", "R10", "RV", "R12", "R13", "R14", "R15",
  "R16", "R17", "R18", "R19", "R20", "R21", "R22", "R23",
  "R16", "R17", "R18", "R19", "R20", "R21", "R22", "R23",
  "R24", "R25", "R26", "R27", "R28", "R29", "R30", "R31",
  "R24", "R25", "R26", "R27", "R28", "R29", "R30", "R31",
  /* vector/floating point registers */
  /* vector/floating point registers */
  "VFA0",  "VFA1",  "VFA2",  "VFA3",  "VFA4",  "VFA5",  "VFRV ", "VFR7",
  "VFA0",  "VFA1",  "VFA2",  "VFA3",  "VFA4",  "VFA5",  "VFRV ", "VFR7",
  "VFR8",   "VFR9",  "VFR10", "VFR11", "VFR12", "VFR13", "VFR14", "VFR15",
  "VFR8",   "VFR9",  "VFR10", "VFR11", "VFR12", "VFR13", "VFR14", "VFR15",
  "VFR16", "VFR17", "VFR18", "VFR19", "VFR20", "VFR21", "VFR22", "VFR23",
  "VFR16", "VFR17", "VFR18", "VFR19", "VFR20", "VFR21", "VFR22", "VFR23",
  "VFR24", "VFR25", "VFR26", "VFR27", "VFR28", "VFR29", "VFR30", "VFR31"
  "VFR24", "VFR25", "VFR26", "VFR27", "VFR28", "VFR29", "VFR30", "VFR31",
 
  "PC",    "SR",    "EPCR"
};
};
 
 
static char *or1k_group_names[] = {
static char *or1k_group_names[] = {
  "SYS", "DMMU", "IMMU", "DCACHE", "ICACHE", "MAC", "DEBUG", "PERF", "POWER",
  "SYS", "DMMU", "IMMU", "DCACHE", "ICACHE", "MAC", "DEBUG", "PERF", "POWER",
  "PIC", "TIMER"
  "PIC", "TIMER"
};
};
 
/* Table of or1k signals.  */
 
static struct {
 
  char *name;
 
  char *string;
 
  } or1k_signals [NUM_OR1K_SIGNALS + 1] =
 
{
 
  {"RSTE", "Reset Exception"},
 
  {"DFPE", "Data Page Fault Exception"},
 
  {"IFPE", "Instruction Page Fault Exception"},
 
  {"LPINTE", "Low Priority Interrupt Exception"},
 
  {"AE", "Alignment Exception"},
 
  {"HPINTE", "High Priority Interrupt Exception"},
 
  {"DME", "DTLB Miss Exception"},
 
  {"IME", "ITLB Miss Exception"},
 
  {"RE", "Range Exception"},
 
  {"SCE", "SCE Exception"}, //!!!
 
  {NULL, NULL}
 
};
 
 
/* *INDENT-ON* */
/* *INDENT-ON* */
 
 
/* The list of available "set or1k " and "show or1k " commands */
/* The list of available "set or1k " and "show or1k " commands */
static struct cmd_list_element *setor1kcmdlist = NULL;
static struct cmd_list_element *setor1kcmdlist = NULL;
static struct cmd_list_element *showor1kcmdlist = NULL;
static struct cmd_list_element *showor1kcmdlist = NULL;
Line 93... Line 136...
/* Converts regno to sprno.  or1k debug unit has GPRs mapped to SPRs,
/* Converts regno to sprno.  or1k debug unit has GPRs mapped to SPRs,
   which are not compact, so we are mapping them for GDB.  */
   which are not compact, so we are mapping them for GDB.  */
int
int
or1k_regnum_to_sprnum (int regno)
or1k_regnum_to_sprnum (int regno)
{
{
 
  if (regno < MAX_GPR_REGS)
 
    return SPR_REG(SPR_SYSTEM_GROUP, regno + CURRENT_CID * MAX_GPR_REGS + SPR_GPR);
  if (regno < MAX_GPR_REGS + MAX_VF_REGS)
  if (regno < MAX_GPR_REGS + MAX_VF_REGS)
    return SPR_REG(SPR_DEBUG_GROUP, regno + SPR_GPR);
    return SPR_REG(SPR_SYSTEM_GROUP, regno - MAX_GPR_REGS
  if (regno == PC_REGNUM)
                   + CURRENT_CID * MAX_GPR_REGS + SPR_VFPR);
    return PC_SPRNUM;
 
  if (regno == PS_REGNUM)
  if (regno == PS_REGNUM)
    return SR_SPRNUM;
    return SR_SPRNUM;
 
  if (regno == PC_REGNUM)
 
    return PC_SPRNUM;
  if (regno == CCR_REGNUM)
  if (regno == CCR_REGNUM)
    return CCR_SPRNUM(0);
    return CCR_SPRNUM(CURRENT_CID);
  error ("Invalid register number!");
  error ("Invalid register number!");
}
}
 
 
/* Builds and returns register name.  */
/* Builds and returns register name.  */
 
 
static char tmp_name[16];
static char tmp_name[16];
static char *
static char *
or1k_internal_register_name (i)
or1k_spr_register_name (i)
     int i;
     int i;
{
{
  int group = i >> SPR_GROUP_SIZE_BITS;
  int group = i >> SPR_GROUP_SIZE_BITS;
  int index = i & (SPR_GROUP_SIZE - 1);
  int index = i & (SPR_GROUP_SIZE - 1);
  switch (group)
  switch (group)
    {
    {
      /* Names covered in or1k_reg_names.  */
      /* Names covered in or1k_reg_names.  */
    case 0:
    case 0:
 
    case 3:
 
    case 4:
 
    case 5:
    case 6:
    case 6:
 
    case 7:
 
    case 8:
 
    case 9:
 
    case 10:
      {
      {
        int group_start = 0;
        int group_start = 0;
        for (i = 0; i < group; i++)
        for (i = 0; i < group; i++)
          group_start += or1k_group_name_sizes[i];
          group_start += or1k_group_name_sizes[i];
 
 
Line 131... Line 184...
            return (char *)&tmp_name;
            return (char *)&tmp_name;
          }
          }
        else
        else
          return or1k_reg_names[group_start + index];
          return or1k_reg_names[group_start + index];
      }
      }
      /* Build names for MMU group.  */
      /* Build names for DMMU group.  */
    case 1:
    case 1:
      if (index < 256) {
      if (index < 256) {
        sprintf (tmp_name, "DTLBMR%i", index);
        sprintf (tmp_name, "DTLBMR%i", index);
        return (char *)&tmp_name;
        return (char *)&tmp_name;
      }
      }
Line 155... Line 208...
          return "DTLBEIR";
          return "DTLBEIR";
        default:
        default:
          sprintf (tmp_name, "SPR1_%i", index+512);
          sprintf (tmp_name, "SPR1_%i", index+512);
          return (char *)&tmp_name;
          return (char *)&tmp_name;
      }
      }
 
      /* Build names for IMMU group.  */
 
    case 2:
 
      if (index < 256) {
 
        sprintf (tmp_name, "ITLBMR%i", index);
 
        return (char *)&tmp_name;
 
      }
 
      index -= 256;
 
      if (index < 256) {
 
        sprintf (tmp_name, "ITLBTR%i", index);
 
        return (char *)&tmp_name;
 
      }
 
      index -= 256;
 
      switch (index)
 
        {
 
        case 0:
 
          return "IMMUCR";
 
        case 1:
 
          return "IMMUPR";
 
        case 2:
 
          return "ITLBEIR";
 
        default:
 
          sprintf (tmp_name, "SPR1_%i", index+512);
 
          return (char *)&tmp_name;
 
      }
    default:
    default:
      sprintf (tmp_name, "SPR%i_%i", group, index);
      sprintf (tmp_name, "SPR%i_%i", group, index);
      return (char *)&tmp_name;
      return (char *)&tmp_name;
    }
    }
}
}
Line 185... Line 262...
      else return i;
      else return i;
    }
    }
  for (i = 0; i < or1k_spr_valid_aliases[group]; i++)
  for (i = 0; i < or1k_spr_valid_aliases[group]; i++)
    {
    {
      char *s;
      char *s;
      s = or1k_internal_register_name (SPR_REG(group, i));
      s = or1k_spr_register_name (SPR_REG(group, i));
      if (strcasecmp (name, s) == 0)
      if (strcasecmp (name, s) == 0)
        return i;
        return i;
    }
    }
  return -1;
  return -1;
}
}
 
 
#define OR1K_BREAKPOINT_STRUCT {0x21, 0x00, 0x00, 0x00}
 
 
 
/* Resturs gdb register name.  */
/* Resturs gdb register name.  */
char *
char *
or1k_register_name (regno)
or1k_register_name (regno)
     int regno;
     int regno;
{
{
  return or1k_internal_register_name (REGNUM_TO_SPRNUM(regno));
  return or1k_gdb_reg_names[regno];
 
}
 
 
 
static int
 
do_vf_register (regnum)
 
     int regnum;
 
{                               /* do values for FP (float) regs */
 
  char *raw_buffer;
 
  double doub, flt;             /* doubles extracted from raw hex data */
 
  int inv1, inv3, byte;
 
 
 
  raw_buffer = (char *) alloca (OR1K_VF_REGSIZE);
 
 
 
  /* Get the data in raw format.  */
 
  if (read_relative_register_raw_bytes (regnum, raw_buffer))
 
    error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum));
 
 
 
  flt = unpack_double (builtin_type_float, raw_buffer, &inv1);
 
  doub = unpack_double (builtin_type_double, raw_buffer, &inv3);
 
 
 
  printf_filtered (inv1 ? " %-5s flt: <invalid float>" :
 
                       " %-5s flt:%-17.9g", REGISTER_NAME (regnum), flt);
 
  printf_filtered (inv3 ? " dbl: <invalid double> " :
 
                   " dbl: %-24.17g ", doub);
 
 
 
  /* pad small registers */
 
  for (byte = 0; byte < (OR1K_GPR_REGSIZE - REGISTER_VIRTUAL_SIZE (regnum)); byte++)
 
    printf_filtered ("  ");
 
  /* Now print the register value in hex, endian order. */
 
  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
 
    for (byte = REGISTER_RAW_SIZE (regnum) - REGISTER_VIRTUAL_SIZE (regnum);
 
         byte < REGISTER_RAW_SIZE (regnum);
 
         byte++)
 
      printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
 
  else
 
    for (byte = REGISTER_VIRTUAL_SIZE (regnum) - 1;
 
         byte >= 0;
 
         byte--)
 
      printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
 
  printf_filtered ("\n");
 
 
 
  regnum++;
 
  return regnum;
 
}
 
 
 
/* Print a row's worth of GP (int) registers, with name labels above */
 
 
 
static int
 
do_gp_register_row (regnum)
 
     int regnum;
 
{
 
  /* do values for GP (int) regs */
 
  char raw_buffer[MAX_REGISTER_RAW_SIZE];
 
  int ncols = (OR1K_64BIT_IMPLEMENTATION ? 4 : 8);      /* display cols per row */
 
  int col, byte;
 
  int start_regnum = regnum;
 
  int numregs = NUM_REGS;
 
 
 
 
 
  /* For GP registers, we print a separate row of names above the vals */
 
  printf_filtered ("     ");
 
  for (col = 0; col < ncols && regnum < numregs; regnum++)
 
    {
 
      if (*REGISTER_NAME (regnum) == '\0')
 
        continue;               /* unused register */
 
      if (OR1K_IS_VF(regnum))
 
        break;                  /* end the row: reached VF register */
 
      printf_filtered (OR1K_64BIT_IMPLEMENTATION ? "%17s" : "%9s",
 
                       REGISTER_NAME (regnum));
 
      col++;
 
    }
 
  printf_filtered ("\n      ");
 
 
 
  regnum = start_regnum;        /* go back to start of row */
 
 
 
  /* now print the values in hex, 4 or 8 to the row */
 
  for (col = 0; col < ncols && regnum < numregs; regnum++)
 
    {
 
      if (*REGISTER_NAME (regnum) == '\0')
 
        continue;               /* unused register */
 
      if (OR1K_IS_VF(regnum))
 
        break;                  /* end row: reached VF register */
 
      /* OK: get the data in raw format.  */
 
      if (read_relative_register_raw_bytes (regnum, raw_buffer))
 
        error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum));
 
      /* pad small registers */
 
      for (byte = 0; byte < (OR1K_GPR_REGSIZE - REGISTER_VIRTUAL_SIZE (regnum)); byte++)
 
        printf_filtered ("  ");
 
      /* Now print the register value in hex, endian order. */
 
      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
 
        for (byte = REGISTER_RAW_SIZE (regnum) - REGISTER_VIRTUAL_SIZE (regnum);
 
             byte < REGISTER_RAW_SIZE (regnum);
 
             byte++)
 
          printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
 
      else
 
        for (byte = REGISTER_VIRTUAL_SIZE (regnum) - 1;
 
             byte >= 0;
 
             byte--)
 
          printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
 
      printf_filtered (" ");
 
      col++;
 
    }
 
  if (col > 0)                   /* ie. if we actually printed anything... */
 
    printf_filtered ("\n");
 
 
 
  return regnum;
 
}
 
 
 
/* Replacement for generic do_registers_info.
 
   Print regs in pretty columns.  */
 
static void
 
print_register (regnum, all)
 
     int regnum, all;
 
{
 
  int offset;
 
  char raw_buffer[MAX_REGISTER_RAW_SIZE];
 
 
 
  /* Get the data in raw format.  */
 
  if (read_relative_register_raw_bytes (regnum, raw_buffer))
 
    {
 
      printf_filtered ("%s: [Invalid]", REGISTER_NAME (regnum));
 
      return;
 
    }
 
 
 
  /* If virtual format is floating, print it that way.  */
 
  if (OR1K_IS_VF (regnum))
 
    do_vf_register (regnum);
 
  else
 
    {
 
      int byte;
 
      printf_filtered ("%-16s\t", REGISTER_NAME (regnum));
 
 
 
      /* pad small registers */
 
      for (byte = 0; byte < (OR1K_GPR_REGSIZE - REGISTER_VIRTUAL_SIZE (regnum)); byte++)
 
        printf_filtered ("  ");
 
      /* Now print the register value in hex, endian order. */
 
      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
 
        for (byte = REGISTER_RAW_SIZE (regnum) - REGISTER_VIRTUAL_SIZE (regnum);
 
             byte < REGISTER_RAW_SIZE (regnum);
 
             byte++)
 
          printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
 
      else
 
        for (byte = REGISTER_VIRTUAL_SIZE (regnum) - 1;
 
             byte >= 0;
 
             byte--)
 
          printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
 
      printf_filtered (" ");
 
    }
 
}
 
 
 
/* DO_REGISTERS_INFO: called by "info register" command */
 
 
 
void
 
or1k_do_registers_info (regnum, fpregs)
 
     int regnum;
 
     int fpregs;
 
{
 
  if (fpregs && !or1k_implementation.vf_present)
 
    {
 
      warning ("VF register set not present in this implementation.");
 
      fpregs = 0;
 
    }
 
  if (regnum != -1)             /* do one specified register */
 
    {
 
      if (*(REGISTER_NAME (regnum)) == '\0')
 
        error ("Not a valid register for the current processor type");
 
 
 
      print_register (regnum, 0);
 
      printf_filtered ("\n");
 
    }
 
  else
 
    /* do all (or most) registers */
 
    {
 
      regnum = 0;
 
      while (regnum < NUM_REGS)
 
        {
 
          if (OR1K_IS_VF (regnum))
 
            if (fpregs)         /* true for "INFO ALL-REGISTERS" command */
 
              regnum = do_vf_register (regnum); /* FP regs */
 
            else
 
              regnum++;         /* skip floating point regs */
 
          else
 
            regnum = do_gp_register_row (regnum);       /* GP (int) regs */
 
        }
 
    }
}
}
 
 
/* Given the address at which to insert a breakpoint (BP_ADDR),
/* Given the address at which to insert a breakpoint (BP_ADDR),
   what will that breakpoint be?
   what will that breakpoint be?
 
 
Line 214... Line 473...
unsigned char *
unsigned char *
or1k_breakpoint_from_pc (bp_addr, bp_size)
or1k_breakpoint_from_pc (bp_addr, bp_size)
     CORE_ADDR * bp_addr;
     CORE_ADDR * bp_addr;
     int *bp_size;
     int *bp_size;
{
{
  static char breakpoint[] = OR1K_BREAKPOINT_STRUCT;
  static char breakpoint[] = BRK_INSTR_STRUCT;
  *bp_size = OR1K_INSTLEN;
  *bp_size = OR1K_INSTLEN;
  return breakpoint;
  return breakpoint;
}
}
 
 
 
/* Return the string for a signal.  Replacement for target_signal_to_string (sig).  */
 
char
 
*or1k_signal_to_string (sig)
 
     enum target_signal sig;
 
{
 
  if ((sig >= TARGET_SIGNAL_FIRST) && (sig <= TARGET_SIGNAL_LAST))
 
    return or1k_signals[sig].string;
 
  else
 
    if (sig <= TARGET_SIGNAL_LAST + NUM_OR1K_SIGNALS)
 
      return or1k_signals[sig - TARGET_SIGNAL_LAST].string;
 
    else
 
      return 0/* signals[TARGET_SIGNAL_UNKNOWN].string*/;
 
}
 
 
 
/* Return the name for a signal.  */
 
char *
 
or1k_signal_to_name (sig)
 
     enum target_signal sig;
 
{
 
  if (sig >= TARGET_SIGNAL_LAST)
 
    if (sig <= TARGET_SIGNAL_LAST + NUM_OR1K_SIGNALS)
 
      return or1k_signals[sig - TARGET_SIGNAL_LAST].name;
 
    else
 
    /* I think the code which prints this will always print it along with
 
       the string, so no need to be verbose.  */
 
      return "?";
 
  if (sig == TARGET_SIGNAL_UNKNOWN)
 
    return "?";
 
  return 0/*!!!signals[sig].name*/;
 
}
 
 
 
/* Given a name, return its signal.  */
 
enum target_signal
 
or1k_signal_from_name (name)
 
     char *name;
 
{
 
  enum target_signal sig;
 
 
 
  /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
 
     for TARGET_SIGNAL_SIGCHLD.  SIGIOT, on the other hand, is more
 
     questionable; seems like by now people should call it SIGABRT
 
     instead.  */
 
 
 
  /* This ugly cast brought to you by the native VAX compiler.  */
 
  for (sig = TARGET_SIGNAL_FIRST;
 
       or1k_signal_to_name (sig) != NULL;
 
       sig = (enum target_signal) ((int) sig + 1))
 
    if (STREQ (name, or1k_signal_to_name (sig)))
 
      return sig;
 
  return TARGET_SIGNAL_UNKNOWN;
 
}
 
 
/* Given a return value in `regbuf' with a type `valtype', extract and
/* Given a return value in `regbuf' with a type `valtype', extract and
   copy its value into `valbuf'. */
   copy its value into `valbuf'. */
void
void
or1k_extract_return_value (valtype, regbuf, valbuf)
or1k_extract_return_value (valtype, regbuf, valbuf)
     struct type *valtype;
     struct type *valtype;
Line 632... Line 943...
            *index = or1k_regno_from_name (*group, args);
            *index = or1k_regno_from_name (*group, args);
 
 
          if (*index < 0)
          if (*index < 0)
            {
            {
              for (i = 0; i < or1k_spr_valid_aliases[*group]; i++)
              for (i = 0; i < or1k_spr_valid_aliases[*group]; i++)
                printf_unfiltered ("%s\t", or1k_internal_register_name (SPR_REG(*group, i)));
                printf_unfiltered ("%s\t", or1k_spr_register_name (SPR_REG(*group, i)));
              printf_unfiltered ("\n");
              printf_unfiltered ("\n");
              return args + strlen(args) + 1;
              return args + strlen(args) + 1;
            }
            }
        }
        }
    }
    }
Line 653... Line 964...
}
}
 
 
/* SPR register info.  */
/* SPR register info.  */
 
 
void
void
info_spr_cmd (char *args, int from_tty)
info_spr_command (char *args, int from_tty)
{
{
  int group, index;
  int group, index;
  parse_spr_params (args, &group, &index);
  parse_spr_params (args, &group, &index);
  if (index >= 0)
  if (index >= 0)
    {
    {
      printf_unfiltered ("%s.%s (SPR%i_%i) set to %i(%X), was:%i(%X)\n", or1k_group_names[group],
      printf_unfiltered ("%s.%s (SPR%i_%i) set to %i(%X), was:%i(%X)\n", or1k_group_names[group],
                         or1k_internal_register_name (SPR_REG(group, index)), group, index,
                         or1k_spr_register_name (SPR_REG(group, index)), group, index,
                         or1k_read_reg (SPR_REG(group, index)));
                         or1k_read_spr_reg (SPR_REG(group, index)));
    }
    }
}
}
 
 
/* Set SPR register.  */
/* Set SPR register.  */
 
 
void
void
spr_cmd (char *args, int from_tty)
spr_command (char *args, int from_tty)
{
{
  int group, index;
  int group, index;
  char *nargs = parse_spr_params (args, &group, &index);
  char *nargs = parse_spr_params (args, &group, &index);
  /* Any arguments left?  */
  /* Any arguments left?  */
  if (args + strlen(args) >= nargs)
  if (args + strlen(args) >= nargs)
Line 681... Line 992...
    {
    {
      unsigned long prev;
      unsigned long prev;
      unsigned long value;
      unsigned long value;
      char *ptr_c;
      char *ptr_c;
 
 
      prev = or1k_read_reg (SPR_REG(group, index));
      prev = or1k_read_spr_reg (SPR_REG(group, index));
 
 
      ptr_c = nargs;
      ptr_c = nargs;
      while (*ptr_c != ' ' && *ptr_c != 0)
      while (*ptr_c != ' ' && *ptr_c != 0)
        ptr_c++;
        ptr_c++;
      *ptr_c = 0;
      *ptr_c = 0;
      value = strtoul (nargs, &ptr_c, 0);
      value = strtoul (nargs, &ptr_c, 0);
      if (*ptr_c != 0)
      if (*ptr_c != 0)
        error ("Invalid register value.");
        error ("Invalid register value.");
      printf_unfiltered ("%s.%s (SPR%i_%i) set to %i(%X), was:%i(%X)\n", or1k_group_names[group],
      printf_unfiltered ("%s.%s (SPR%i_%i) set to %i(%X), was:%i(%X)\n", or1k_group_names[group],
                         or1k_internal_register_name (SPR_REG(group, index)), group, index,
                         or1k_spr_register_name (SPR_REG(group, index)), group, index,
                         value, value, prev, prev);
                         value, value, prev, prev);
    }
    }
}
}
 
 
/* Calls extended command on target.  */
/* Calls extended command on target.  */
Line 704... Line 1015...
sim_command (char *args, int from_tty)
sim_command (char *args, int from_tty)
{
{
  or1k_sim_cmd (args, from_tty);
  or1k_sim_cmd (args, from_tty);
}
}
 
 
 
/* ARGSUSED */
 
/* accessflag:  hw_write:  watch write,
 
                hw_read:   watch read,
 
                hw_access: watch access (read or write) */
 
static void
 
hwatch_command (arg, from_tty)
 
     char *arg;
 
     int from_tty;
 
{
 
  struct expression *exp;
 
  int i;
 
  int nfree;
 
  /* Parse arguments.  */
 
  exp = parse_exp_1 (&arg, 0, 0);
 
 
 
  dump_prefix_expression (exp, gdb_stdout, "expr1");
 
 
 
  /* Now we have to find out if given prefix expression matches
 
     our HW based support. It may take up to
 
     or1k_implementation.num_matchpoints - or1k_implementation.num_used_matchpoints. */
 
  nfree = or1k_implementation.num_matchpoints - or1k_implementation.num_used_matchpoints;
 
  //printf_unfiltered ("%s\n", exp->elts[1].internalvar->name);
 
  free (exp);
 
}
 
 
void
void
_initialize_or1k_tdep ()
_initialize_or1k_tdep ()
{
{
  struct cmd_list_element *c;
  struct cmd_list_element *c;
  /* Add root prefix command for all "set or1k"/"show or1k" commands */
  /* Add root prefix command for all "set or1k"/"show or1k" commands */
Line 718... Line 1054...
  add_prefix_cmd ("or1k", no_class, show_or1k_command,
  add_prefix_cmd ("or1k", no_class, show_or1k_command,
                  "Various OR1K specific commands.",
                  "Various OR1K specific commands.",
                  &showor1kcmdlist, "show or1k ", 0, &showlist);
                  &showor1kcmdlist, "show or1k ", 0, &showlist);
 
 
  /* Commands to show information about the sprs.  */
  /* Commands to show information about the sprs.  */
  add_cmd ("spr", class_info, info_spr_cmd,
  add_info ("spr", info_spr_command, "Show information about the spr registers.");
           "Show information about the spr registers.",
  add_com ("hwatch", class_breakpoint, hwatch_command, "Set hardware watchpoint.");
           &infolist);
  add_com ("spr", class_support, spr_command, "Set specified SPR register.");
  c = add_cmd ("spr", class_support, spr_cmd,
 
                   "Set specified SPR register.",
 
                   &cmdlist);
 
  add_com ("sim", class_obscure, sim_command,
  add_com ("sim", class_obscure, sim_command,
           "Send a extended command to the simulator.");
           "Send a extended command to the simulator.");
}
}
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.