mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-04 16:18:18 +00:00
* infcmd.c (do_registers_info): Ignore anonymous registers.
* sh-tdep.c (set processor): New command to set specific processor type. (sh_reg_names, sh3_reg_names): Arrays of register names for SH and SH3 processors. (sh_set_processor_type): New function. * sh3-rom.c (sh3_open): Call it. (sh3_regname): Add names of all the bank registers. (sh3_supply_register): Clean up formatting. * config/sh/tm-sh.h (NUM_REGS, NUM_REALREGS): Increase to include bank registers. (REGISTER_NAMES): Add names of bank registers. (FP15_REGNUM): Define. (REGISTER_VIRTUAL_TYPE): Use it. * monitor.c: Clean up some comments.
This commit is contained in:
parent
98fe0e07c5
commit
00dd4fd9ad
@ -1,3 +1,21 @@
|
||||
Thu Mar 7 17:40:50 1996 Stan Shebs <shebs@andros.cygnus.com>
|
||||
|
||||
* infcmd.c (do_registers_info): Ignore anonymous registers.
|
||||
* sh-tdep.c (set processor): New command to set specific
|
||||
processor type.
|
||||
(sh_reg_names, sh3_reg_names): Arrays of register names for
|
||||
SH and SH3 processors.
|
||||
(sh_set_processor_type): New function.
|
||||
* sh3-rom.c (sh3_open): Call it.
|
||||
(sh3_regname): Add names of all the bank registers.
|
||||
(sh3_supply_register): Clean up formatting.
|
||||
* config/sh/tm-sh.h (NUM_REGS, NUM_REALREGS): Increase to include
|
||||
bank registers.
|
||||
(REGISTER_NAMES): Add names of bank registers.
|
||||
(FP15_REGNUM): Define.
|
||||
(REGISTER_VIRTUAL_TYPE): Use it.
|
||||
* monitor.c: Clean up some comments.
|
||||
|
||||
Thu Mar 7 12:09:51 1996 J.T. Conklin <jtc@rtl.cygnus.com>
|
||||
|
||||
* i386b-nat.c: Revert part of Mar 5 change. FreeBSD collapsed the
|
||||
@ -12,7 +30,7 @@ Wed Mar 6 17:57:59 1996 Jeffrey A Law (law@cygnus.com)
|
||||
* breakpoint.c (bfd_lookup_symbol): Provide for all SVR4 systems,
|
||||
not just those with HANDLE_SVR4_EXEC_EMULATORS.
|
||||
|
||||
* From Peter Schauer:
|
||||
From Peter Schauer:
|
||||
* breakpoint.c (internal_breakpoint_number): Move to file scope.
|
||||
(create_solib_event_breakpoint): Use an internal breakpoint number.
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Parameters for execution on a Hitachi Super-H machine.
|
||||
/* Target-specific definition for a Hitachi Super-H.
|
||||
Copyright (C) 1993 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
@ -99,7 +99,7 @@ extern CORE_ADDR sh_skip_prologue ();
|
||||
of data in register N. */
|
||||
|
||||
#define REGISTER_VIRTUAL_TYPE(N) \
|
||||
((((N) >= FP0_REGNUM && (N) < FP0_REGNUM+32) \
|
||||
((((N) >= FP0_REGNUM && (N) < FP15_REGNUM) \
|
||||
|| (N) == FPUL_REGNUM) \
|
||||
? builtin_type_float : builtin_type_int)
|
||||
|
||||
@ -107,14 +107,17 @@ extern CORE_ADDR sh_skip_prologue ();
|
||||
Entries beyond the first NUM_REGS are ignored. */
|
||||
|
||||
#define REGISTER_NAMES \
|
||||
{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
|
||||
"r8", "r9", "r10","r11","r12","r13","r14","r15",\
|
||||
"pc", "pr","gbr","vbr","mach","macl", "sr", "fpul", "fpscr", \
|
||||
{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
|
||||
"r8", "r9", "r10","r11","r12", "r13", "r14","r15",\
|
||||
"pc", "pr", "gbr","vbr","mach","macl","sr", \
|
||||
"fpul","fpscr", \
|
||||
"fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7", \
|
||||
"fr8", "fr9", "fr10","fr11","fr12","fr13","fr14","fr15",\
|
||||
"r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0", \
|
||||
"r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1" \
|
||||
}
|
||||
|
||||
#define NUM_REGS 41
|
||||
#define NUM_REGS 57
|
||||
|
||||
/* Register numbers of various important registers.
|
||||
Note that some of these values are "real" register numbers,
|
||||
@ -136,8 +139,9 @@ extern CORE_ADDR sh_skip_prologue ();
|
||||
#define NUM_REALREGS 23
|
||||
#define FPUL_REGNUM 23
|
||||
#define FP0_REGNUM 25
|
||||
#define FP15_REGNUM 41
|
||||
#undef NUM_REALREGS
|
||||
#define NUM_REALREGS 41
|
||||
#define NUM_REALREGS 57
|
||||
|
||||
/* Store the address of the place in which to copy the structure the
|
||||
subroutine will return. This is called from call_function.
|
||||
|
@ -977,6 +977,11 @@ do_registers_info (regnum, fpregs)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* If the register name is empty, it is undefined for this
|
||||
processor, so don't display anything. */
|
||||
if (reg_names[i] == NULL || *(reg_names[i]) == '\0')
|
||||
continue;
|
||||
|
||||
fputs_filtered (reg_names[i], gdb_stdout);
|
||||
print_spaces_filtered (15 - strlen (reg_names[i]), gdb_stdout);
|
||||
|
||||
@ -1132,7 +1137,7 @@ attach_command (args, from_tty)
|
||||
char *args;
|
||||
int from_tty;
|
||||
{
|
||||
extern int auto_solib_add_at_startup;
|
||||
extern int auto_solib_add;
|
||||
|
||||
dont_repeat (); /* Not for the faint of heart */
|
||||
|
||||
@ -1167,7 +1172,7 @@ attach_command (args, from_tty)
|
||||
#endif
|
||||
|
||||
#ifdef SOLIB_ADD
|
||||
if (auto_solib_add_at_startup)
|
||||
if (auto_solib_add)
|
||||
/* Add shared library symbols from the newly attached process, if any. */
|
||||
SOLIB_ADD ((char *)0, from_tty, (struct target_ops *)0);
|
||||
#endif
|
||||
|
131
gdb/sh-tdep.c
131
gdb/sh-tdep.c
@ -1,5 +1,5 @@
|
||||
/* Target-dependent code for Hitachi Super-H, for GDB.
|
||||
Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -32,6 +32,52 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
#include "value.h"
|
||||
#include "dis-asm.h"
|
||||
|
||||
/* Default to the original SH. */
|
||||
|
||||
#define DEFAULT_SH_TYPE "sh"
|
||||
|
||||
/* This value is the model of SH in use. */
|
||||
|
||||
char *sh_processor_type;
|
||||
|
||||
char *tmp_sh_processor_type;
|
||||
|
||||
/* A set of original names, to be used when restoring back to generic
|
||||
registers from a specific set. */
|
||||
|
||||
char *sh_generic_reg_names[] = REGISTER_NAMES;
|
||||
|
||||
char *sh_reg_names[] = {
|
||||
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
|
||||
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
|
||||
"pc", "pr", "gbr", "vbr", "mach","macl", "sr",
|
||||
"fpul", "fpscr",
|
||||
"", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", ""
|
||||
};
|
||||
|
||||
char *sh3_reg_names[] = {
|
||||
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
|
||||
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
|
||||
"pc", "pr", "gbr", "vbr", "mach","macl","sr",
|
||||
"fpul", "fpscr",
|
||||
"fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
|
||||
"fr8", "fr9", "fr10","fr11","fr12","fr13","fr14","fr15",
|
||||
"r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
|
||||
"r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1"
|
||||
};
|
||||
|
||||
struct {
|
||||
char *name;
|
||||
char **regnames;
|
||||
} sh_processor_type_table[] = {
|
||||
{ "sh", sh_reg_names },
|
||||
{ "sh3", sh3_reg_names },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
/* Prologue looks like
|
||||
[mov.l <regs>,@-r15]...
|
||||
[sts.l pr,@-r15]
|
||||
@ -264,6 +310,74 @@ pop_frame ()
|
||||
flush_cached_frames ();
|
||||
}
|
||||
|
||||
/* Command to set the processor type. */
|
||||
|
||||
void
|
||||
sh_set_processor_type_command (args, from_tty)
|
||||
char *args;
|
||||
int from_tty;
|
||||
{
|
||||
int i;
|
||||
char *temp;
|
||||
|
||||
/* The `set' commands work by setting the value, then calling the hook,
|
||||
so we let the general command modify a scratch location, then decide
|
||||
here if we really want to modify the processor type. */
|
||||
if (tmp_sh_processor_type == NULL || *tmp_sh_processor_type == '\0')
|
||||
{
|
||||
printf_unfiltered ("The known SH processor types are as follows:\n\n");
|
||||
for (i = 0; sh_processor_type_table[i].name != NULL; ++i)
|
||||
printf_unfiltered ("%s\n", sh_processor_type_table[i].name);
|
||||
|
||||
/* Restore the value. */
|
||||
tmp_sh_processor_type = strsave (sh_processor_type);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!sh_set_processor_type (tmp_sh_processor_type))
|
||||
{
|
||||
/* Restore to a valid value before erroring out. */
|
||||
temp = tmp_sh_processor_type;
|
||||
tmp_sh_processor_type = strsave (sh_processor_type);
|
||||
error ("Unknown processor type `%s'.", temp);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
sh_show_processor_type_command (args, from_tty)
|
||||
char *args;
|
||||
int from_tty;
|
||||
{
|
||||
}
|
||||
|
||||
/* Modify the actual processor type. */
|
||||
|
||||
int
|
||||
sh_set_processor_type (str)
|
||||
char *str;
|
||||
{
|
||||
int i, j;
|
||||
|
||||
if (str == NULL)
|
||||
return 0;
|
||||
|
||||
for (i = 0; sh_processor_type_table[i].name != NULL; ++i)
|
||||
{
|
||||
if (strcasecmp (str, sh_processor_type_table[i].name) == 0)
|
||||
{
|
||||
sh_processor_type = str;
|
||||
|
||||
for (j = 0; j < NUM_REGS; ++j)
|
||||
reg_names[j] = sh_processor_type_table[i].regnames[j];
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Print the registers in a form similar to the E7000 */
|
||||
|
||||
static void
|
||||
@ -301,7 +415,22 @@ show_regs (args, from_tty)
|
||||
void
|
||||
_initialize_sh_tdep ()
|
||||
{
|
||||
struct cmd_list_element *c;
|
||||
|
||||
tm_print_insn = gdb_print_insn_sh;
|
||||
|
||||
c = add_set_cmd ("processor", class_support, var_string_noescape,
|
||||
(char *) &tmp_sh_processor_type,
|
||||
"Set the type of SH processor in use.\n\
|
||||
Set this to be able to access processor-type-specific registers.\n\
|
||||
",
|
||||
&setlist);
|
||||
c->function.cfunc = sh_set_processor_type_command;
|
||||
c = add_show_from_set (c, &showlist);
|
||||
c->function.cfunc = sh_show_processor_type_command;
|
||||
|
||||
tmp_sh_processor_type = strsave (DEFAULT_SH_TYPE);
|
||||
sh_set_processor_type_command (strsave (DEFAULT_SH_TYPE), 0);
|
||||
|
||||
add_com ("regs", class_vars, show_regs, "Print all registers");
|
||||
}
|
||||
|
141
gdb/sh3-rom.c
141
gdb/sh3-rom.c
@ -43,64 +43,72 @@ sh3_supply_register (regname, regnamelen, val, vallen)
|
||||
regno = -1;
|
||||
|
||||
if (regnamelen == 2)
|
||||
switch (regname[0])
|
||||
{
|
||||
case 'S':
|
||||
if (regname[1] == 'R')
|
||||
regno = SR_REGNUM;
|
||||
break;
|
||||
case 'P':
|
||||
if (regname[1] == 'C')
|
||||
regno = PC_REGNUM;
|
||||
else if (regname[1] == 'R')
|
||||
regno = PR_REGNUM;
|
||||
break;
|
||||
}
|
||||
{
|
||||
switch (regname[0])
|
||||
{
|
||||
case 'S':
|
||||
if (regname[1] == 'R')
|
||||
regno = SR_REGNUM;
|
||||
break;
|
||||
case 'P':
|
||||
if (regname[1] == 'C')
|
||||
regno = PC_REGNUM;
|
||||
else if (regname[1] == 'R')
|
||||
regno = PR_REGNUM;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (regnamelen == 3)
|
||||
switch (regname[0])
|
||||
{
|
||||
case 'G':
|
||||
case 'V':
|
||||
if (regname[1] == 'B' && regname[2] == 'R')
|
||||
if (regname[0] == 'G')
|
||||
regno = VBR_REGNUM;
|
||||
else
|
||||
regno = GBR_REGNUM;
|
||||
break;
|
||||
{
|
||||
switch (regname[0])
|
||||
{
|
||||
case 'G':
|
||||
case 'V':
|
||||
if (regname[1] == 'B' && regname[2] == 'R')
|
||||
if (regname[0] == 'G')
|
||||
regno = VBR_REGNUM;
|
||||
else
|
||||
regno = GBR_REGNUM;
|
||||
break;
|
||||
#if 0
|
||||
case 'S':
|
||||
if (regname[1] == 'S' && regname[2] == 'R')
|
||||
regno = SSR_REGNUM;
|
||||
else if (regname[1] == 'P' && regname[2] == 'C')
|
||||
regno = SPC_REGNUM;
|
||||
break;
|
||||
case 'S':
|
||||
if (regname[1] == 'S' && regname[2] == 'R')
|
||||
regno = SSR_REGNUM;
|
||||
else if (regname[1] == 'P' && regname[2] == 'C')
|
||||
regno = SPC_REGNUM;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (regnamelen == 4)
|
||||
switch (regname[0])
|
||||
{
|
||||
case 'M':
|
||||
if (regname[1] == 'A' && regname[2] == 'C')
|
||||
if (regname[3] == 'H')
|
||||
regno = MACH_REGNUM;
|
||||
else if (regname[3] == 'L')
|
||||
regno = MACL_REGNUM;
|
||||
break;
|
||||
case 'R':
|
||||
if (regname[1] == '0' && regname[2] == '-' && regname[3] == '7')
|
||||
{
|
||||
regno = R0_REGNUM;
|
||||
numregs = 8;
|
||||
}
|
||||
}
|
||||
{
|
||||
switch (regname[0])
|
||||
{
|
||||
case 'M':
|
||||
if (regname[1] == 'A' && regname[2] == 'C')
|
||||
if (regname[3] == 'H')
|
||||
regno = MACH_REGNUM;
|
||||
else if (regname[3] == 'L')
|
||||
regno = MACL_REGNUM;
|
||||
break;
|
||||
case 'R':
|
||||
if (regname[1] == '0' && regname[2] == '-' && regname[3] == '7')
|
||||
{
|
||||
regno = R0_REGNUM;
|
||||
numregs = 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (regnamelen == 5)
|
||||
if (regname[1] == '8' && regname[2] == '-' && regname[3] == '1'
|
||||
&& regname[4] =='5')
|
||||
{
|
||||
regno = R0_REGNUM + 8;
|
||||
numregs = 8;
|
||||
}
|
||||
|
||||
{
|
||||
if (regname[1] == '8' && regname[2] == '-' && regname[3] == '1'
|
||||
&& regname[4] =='5')
|
||||
{
|
||||
regno = R0_REGNUM + 8;
|
||||
numregs = 8;
|
||||
}
|
||||
}
|
||||
|
||||
if (regno >= 0)
|
||||
while (numregs-- > 0)
|
||||
val = monitor_supply_register (regno++, val);
|
||||
@ -139,10 +147,17 @@ sh3_load (desc, file, hashmark)
|
||||
either. So, typing "info reg sp" becomes a "r30". */
|
||||
|
||||
static char *sh3_regnames[NUM_REGS] = {
|
||||
"R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
|
||||
"R8", "R9", "R10","R11","R12","R13","R14","R15",
|
||||
"PC", "PR", "GBR","VBR","MACH","MACL","SR",NULL,
|
||||
NULL, NULL, NULL, NULL};
|
||||
"R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
|
||||
"R8", "R9", "R10", "R11","R12", "R13", "R14", "R15",
|
||||
"PC", "PR", "GBR", "VBR","MACH","MACL", "SR",
|
||||
NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
"R0_BANK0", "R1_BANK0", "R2_BANK0", "R3_BANK0",
|
||||
"R4_BANK0", "R5_BANK0", "R6_BANK0", "R7_BANK0",
|
||||
"R0_BANK1", "R1_BANK1", "R2_BANK1", "R3_BANK1",
|
||||
"R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1"
|
||||
};
|
||||
|
||||
/* Define the monitor command strings. Since these are passed directly
|
||||
through to a printf style function, we may include formatting
|
||||
@ -217,9 +232,10 @@ sh3_open (args, from_tty)
|
||||
{
|
||||
char *serial_port_name = args;
|
||||
char *parallel_port_name = 0;
|
||||
|
||||
if (args)
|
||||
{
|
||||
char *cursor = serial_port_name = strsave (args);
|
||||
char *cursor = serial_port_name = strsave (args);
|
||||
|
||||
while (*cursor && *cursor != ' ')
|
||||
cursor++;
|
||||
@ -239,12 +255,15 @@ sh3_open (args, from_tty)
|
||||
if (parallel_port_name)
|
||||
{
|
||||
parallel = SERIAL_OPEN (parallel_port_name);
|
||||
|
||||
if (!parallel)
|
||||
{
|
||||
perror_with_name ("Unable to open parallel port.");
|
||||
}
|
||||
perror_with_name ("Unable to open parallel port.");
|
||||
|
||||
parallel_in_use = 1;
|
||||
}
|
||||
|
||||
/* If we connected successfully, we know the processor is an SH3. */
|
||||
sh_set_processor_type ("sh3");
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user