mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-24 12:39:59 +00:00
* 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:
parent
630fa2138e
commit
3567a8eaa2
@ -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.
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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. */
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user