* sparc64-tdep.h (sparc64_regnum): Fix comment.

(sparc64_supply_rwindow, sparc64_fill_rwindow): Remove prototypes.
(sparc_supply_rwindow, sparc_fill_rwindow): New prototypes.
* sparc64-tdep.c (sparc64_pseudo_register_read): Add missing
`case' keyword.
(sparc64_register_info): Give the reister with number
SPARC64_STATE_REGNUM a name.
(sparc64_pseudo_register_write): Add support for %cwp, %pstate,
%asi and %ccr.
(sparc64_push_dummy_call): Take BIAS into account when checking
stcak alignment.
(sparc_software_single_step): Remove assertions that check whether
NPC and NNPC were zero.
(sparc_supply_rwindow): Make public.  Merge functionality with
sparc64_supply_rwindow.
(sparc_fill_rwindow): Make public.  Merge functionality with
sparc64_fill_rwindow.
(sparc64_supply_rwindow, sparc64_fill_rwindow): Remove.
* sparc64fbsd-nat.c (_initialize_sparc64fbsd_nat): Set
SPARCBSD_FPREG_SUPPLIES_P to sparc64fbsd_fpreg_supplies_p.
* sparc64fbsd-tdep.c (sparc64fbsd_supply_reg): Call
sparc_supply_rwindow instead of sparc64_supply_rwindow.
This commit is contained in:
Mark Kettenis 2003-08-22 18:52:50 +00:00
parent 630fa2138e
commit 3567a8eaa2
5 changed files with 99 additions and 67 deletions

View File

@ -1,5 +1,28 @@
2003-08-22 Mark Kettenis <kettenis@gnu.org>
* sparc64-tdep.h (sparc64_regnum): Fix comment.
(sparc64_supply_rwindow, sparc64_fill_rwindow): Remove prototypes.
(sparc_supply_rwindow, sparc_fill_rwindow): New prototypes.
* sparc64-tdep.c (sparc64_pseudo_register_read): Add missing
`case' keyword.
(sparc64_register_info): Give the reister with number
SPARC64_STATE_REGNUM a name.
(sparc64_pseudo_register_write): Add support for %cwp, %pstate,
%asi and %ccr.
(sparc64_push_dummy_call): Take BIAS into account when checking
stcak alignment.
(sparc_software_single_step): Remove assertions that check whether
NPC and NNPC were zero.
(sparc_supply_rwindow): Make public. Merge functionality with
sparc64_supply_rwindow.
(sparc_fill_rwindow): Make public. Merge functionality with
sparc64_fill_rwindow.
(sparc64_supply_rwindow, sparc64_fill_rwindow): Remove.
* sparc64fbsd-nat.c (_initialize_sparc64fbsd_nat): Set
SPARCBSD_FPREG_SUPPLIES_P to sparc64fbsd_fpreg_supplies_p.
* sparc64fbsd-tdep.c (sparc64fbsd_supply_reg): Call
sparc_supply_rwindow instead of sparc64_supply_rwindow.
* reggroups.c: Add whitespace after declarations of local
variables in functions.

View File

@ -271,7 +271,8 @@ static struct sparc64_register_info sparc64_register_info[] =
/* This raw register contains the contents of %cwp, %pstate, %asi
and %ccr as laid out in a %tstate register. */
{ NULL, &builtin_type_int64 },
/* FIXME: Give it a name until we start using register groups. */
{ "state", &builtin_type_int64 },
{ "fsr", &builtin_type_int64 },
{ "fprs", &builtin_type_int64 },
@ -422,16 +423,16 @@ sparc64_pseudo_register_read (struct gdbarch *gdbarch,
regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
switch (regnum)
{
SPARC64_CWP_REGNUM:
case SPARC64_CWP_REGNUM:
state = (state >> 0) & ((1 << 5) - 1);
break;
SPARC64_PSTATE_REGNUM:
case SPARC64_PSTATE_REGNUM:
state = (state >> 8) & ((1 << 12) - 1);
break;
SPARC64_ASI_REGNUM:
case SPARC64_ASI_REGNUM:
state = (state >> 24) & ((1 << 8) - 1);
break;
SPARC64_CCR_REGNUM:
case SPARC64_CCR_REGNUM:
state = (state >> 32) & ((1 << 8) - 1);
break;
}
@ -471,6 +472,32 @@ sparc64_pseudo_register_write (struct gdbarch *gdbarch,
regcache_raw_write (regcache, regnum, buf);
regcache_raw_write (regcache, regnum + 1, ((const char *)buf) + 8);
}
else if (regnum == SPARC64_CWP_REGNUM
|| regnum == SPARC64_PSTATE_REGNUM
|| regnum == SPARC64_ASI_REGNUM
|| regnum == SPARC64_CCR_REGNUM)
{
ULONGEST state, bits;
regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
bits = extract_unsigned_integer (buf, 8);
switch (regnum)
{
case SPARC64_CWP_REGNUM:
state |= ((bits & ((1 << 5) - 1)) << 0);
break;
case SPARC64_PSTATE_REGNUM:
state |= ((bits & ((1 << 12) - 1)) << 8);
break;
case SPARC64_ASI_REGNUM:
state |= ((bits & ((1 << 8) - 1)) << 24);
break;
case SPARC64_CCR_REGNUM:
state |= ((bits & ((1 << 8) - 1)) << 32);
break;
}
regcache_raw_write_unsigned (regcache, SPARC64_STATE_REGNUM, state);
}
}
/* Use the program counter to determine the contents and size of a
@ -1071,7 +1098,7 @@ sparc64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
sp -= 16 * 8;
/* Stack should be 16-byte aligned at this point. */
gdb_assert (sp % 16 == 0);
gdb_assert ((sp + BIAS) % 16 == 0);
/* Finally, update the stack pointer. */
regcache_cooked_write_unsigned (regcache, SPARC_SP_REGNUM, sp);
@ -1273,9 +1300,6 @@ sparc_software_single_step (enum target_signal sig, int insert_breakpoints_p)
{
CORE_ADDR pc;
gdb_assert (npc == 0);
gdb_assert (nnpc == 0);
pc = sparc_address_from_register (SPARC64_PC_REGNUM);
npc = sparc_address_from_register (SPARC64_NPC_REGNUM);
@ -1375,40 +1399,15 @@ sparc64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Helper functions for dealing with register windows. */
static void
void
sparc_supply_rwindow (CORE_ADDR sp, int regnum)
{
int offset = 0;
char buf[8];
int i;
/* Clear out the top half of the temporary buffer, and put the
register value in the bottom half if we're in 64-bit mode. */
if (gdbarch_ptr_bit (current_gdbarch) == 64)
{
memset (buf, 0, 4);
offset = 4;
}
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
{
if (regnum == i || regnum == -1)
{
target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 4),
buf + offset, 4);
supply_register (i, buf);
}
}
}
void
sparc64_supply_rwindow (CORE_ADDR sp, int regnum)
{
if (sp & 1)
{
char buf[8];
int i;
/* Registers are 64-bit. */
sp += BIAS;
@ -1416,8 +1415,7 @@ sparc64_supply_rwindow (CORE_ADDR sp, int regnum)
{
if (regnum == i || regnum == -1)
{
target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 8),
buf, sizeof (buf));
target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 8), buf, 8);
supply_register (i, buf);
}
}
@ -1426,39 +1424,37 @@ sparc64_supply_rwindow (CORE_ADDR sp, int regnum)
{
/* Registers are 32-bit. Toss any sign-extension of the stack
pointer. */
sparc_supply_rwindow (sp & 0xffffffffUL, regnum);
sp &= 0xffffffffUL;
/* Clear out the top half of the temporary buffer, and put the
register value in the bottom half if we're in 64-bit mode. */
if (gdbarch_ptr_bit (current_gdbarch) == 64)
{
memset (buf, 0, 4);
offset = 4;
}
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
{
if (regnum == i || regnum == -1)
{
target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 4),
buf + offset, 4);
supply_register (i, buf);
}
}
}
}
static void
void
sparc_fill_rwindow (CORE_ADDR sp, int regnum)
{
int offset = 0;
char buf[8];
int i;
/* Only use the bottom half if we're in 64-bit mode. */
if (gdbarch_ptr_bit (current_gdbarch) == 64)
offset = 4;
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
{
if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
{
regcache_collect (i, buf);
target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 4), buf, 4);
}
}
}
void
sparc64_fill_rwindow (CORE_ADDR sp, int regnum)
{
if (sp & 1)
{
char buf[8];
int i;
/* Registers are 64-bit. */
sp += BIAS;
@ -1467,8 +1463,7 @@ sparc64_fill_rwindow (CORE_ADDR sp, int regnum)
if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
{
regcache_collect (i, buf);
target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 8),
buf, sizeof (buf));
target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 8), buf, 8);
}
}
}
@ -1476,7 +1471,21 @@ sparc64_fill_rwindow (CORE_ADDR sp, int regnum)
{
/* Registers are 32-bit. Toss any sign-extension of the stack
pointer. */
sparc_fill_rwindow (sp & 0xffffffffUL, regnum);
sp &= 0xffffffffUL;
/* Only use the bottom half if we're in 64-bit mode. */
if (gdbarch_ptr_bit (current_gdbarch) == 64)
offset = 4;
for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
{
if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
{
regcache_collect (i, buf);
target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 4),
buf + offset, 4);
}
}
}
}

View File

@ -81,7 +81,7 @@ enum sparc64_regnum
SPARC64_D0_REGNUM, /* %d0 */
SPARC64_D10_REGNUM = SPARC64_D0_REGNUM + 5, /* %d10 */
SPARC64_D30_REGNUM = SPARC64_D0_REGNUM + 15, /* %d30 */
SPARC64_D32_REGNUM = SPARC64_D0_REGNUM + 16, /* %d30 */
SPARC64_D32_REGNUM = SPARC64_D0_REGNUM + 16, /* %d32 */
SPARC64_D62_REGNUM = SPARC64_D0_REGNUM + 31, /* %d62 */
SPARC64_Q0_REGNUM, /* %q0 */
SPARC64_Q8_REGNUM = SPARC64_Q0_REGNUM + 2, /* %q8 */
@ -90,8 +90,8 @@ enum sparc64_regnum
SPARC64_Q60_REGNUM = SPARC64_Q0_REGNUM + 15 /* %q60 */
};
extern void sparc64_supply_rwindow (CORE_ADDR sp, int regnum);
extern void sparc64_fill_rwindow (CORE_ADDR sp, int regnum);
extern void sparc_supply_rwindow (CORE_ADDR sp, int regnum);
extern void sparc_fill_rwindow (CORE_ADDR sp, int regnum);
/* Functions exported from sparc64fbsd-tdep.c. */

View File

@ -76,5 +76,5 @@ _initialize_sparc64fbsd_nat (void)
sparcbsd_fill_fpreg = sparc64fbsd_fill_fpreg;
sparcbsd_reg_supplies_p = sparc64fbsd_reg_supplies_p;
sparcbsd_fpreg_supplies_p = sparc64fbsd_reg_supplies_p;
sparcbsd_fpreg_supplies_p = sparc64fbsd_fpreg_supplies_p;
}

View File

@ -93,7 +93,7 @@ sparc64fbsd_supply_reg (const char *regs, int regnum)
ULONGEST sp;
regcache_cooked_read_unsigned (current_regcache, SPARC_SP_REGNUM, &sp);
sparc64_supply_rwindow (sp, regnum);
sparc_supply_rwindow (sp, regnum);
}
}