* aix-thread.c (special_register_p, supply_sprs64, supply_sprs32)

(fetch_regs_user_thread, fetch_regs_kernel_thread, fill_sprs64)
	(fill_sprs32, store_regs_user_thread, store_regs_kernel_thread):
	Add support for the fpscr register.
	* rs6000-nat.c (regmap, fetch_inferior_registers)
	(store_inferior_registers, fetch_core_registers): Likewise.
This commit is contained in:
Kevin Buettner 2002-07-26 23:12:59 +00:00
parent dd7be90a81
commit 0e061eef8d
2 changed files with 41 additions and 13 deletions

View File

@ -1045,6 +1045,7 @@ special_register_p (int regno)
|| regno == tdep->ppc_lr_regnum
|| regno == tdep->ppc_ctr_regnum
|| regno == tdep->ppc_xer_regnum
|| regno == tdep->ppc_fpscr_regnum
|| (tdep->ppc_mq_regnum >= 0 && regno == tdep->ppc_mq_regnum);
}
@ -1054,7 +1055,8 @@ special_register_p (int regno)
static void
supply_sprs64 (uint64_t iar, uint64_t msr, uint32_t cr,
uint64_t lr, uint64_t ctr, uint32_t xer)
uint64_t lr, uint64_t ctr, uint32_t xer,
uint32_t fpscr)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
@ -1064,6 +1066,7 @@ supply_sprs64 (uint64_t iar, uint64_t msr, uint32_t cr,
supply_register (tdep->ppc_lr_regnum, (char *) &lr);
supply_register (tdep->ppc_ctr_regnum, (char *) &ctr);
supply_register (tdep->ppc_xer_regnum, (char *) &xer);
supply_register (tdep->ppc_fpscr_regnum, (char *) &fpscr);
}
/* Record that the special registers contain the specified 32-bit
@ -1071,7 +1074,8 @@ supply_sprs64 (uint64_t iar, uint64_t msr, uint32_t cr,
static void
supply_sprs32 (uint32_t iar, uint32_t msr, uint32_t cr,
uint32_t lr, uint32_t ctr, uint32_t xer)
uint32_t lr, uint32_t ctr, uint32_t xer,
uint32_t fpscr)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
@ -1081,6 +1085,7 @@ supply_sprs32 (uint32_t iar, uint32_t msr, uint32_t cr,
supply_register (tdep->ppc_lr_regnum, (char *) &lr);
supply_register (tdep->ppc_ctr_regnum, (char *) &ctr);
supply_register (tdep->ppc_xer_regnum, (char *) &xer);
supply_register (tdep->ppc_fpscr_regnum, (char *) &fpscr);
}
/* Fetch all registers from pthread PDTID, which doesn't have a kernel
@ -1119,9 +1124,11 @@ fetch_regs_user_thread (pthdb_pthread_t pdtid)
/* Special registers. */
if (arch64)
supply_sprs64 (ctx.iar, ctx.msr, ctx.cr, ctx.lr, ctx.ctr, ctx.xer);
supply_sprs64 (ctx.iar, ctx.msr, ctx.cr, ctx.lr, ctx.ctr, ctx.xer,
ctx.fpscr);
else
supply_sprs32 (ctx.iar, ctx.msr, ctx.cr, ctx.lr, ctx.ctr, ctx.xer);
supply_sprs32 (ctx.iar, ctx.msr, ctx.cr, ctx.lr, ctx.ctr, ctx.xer,
ctx.fpscr);
}
/* Fetch register REGNO if != -1 or all registers otherwise from
@ -1192,7 +1199,8 @@ fetch_regs_kernel_thread (int regno, pthdb_tid_t tid)
(unsigned long) &sprs64, 0, NULL))
memset (&sprs64, 0, sizeof (sprs64));
supply_sprs64 (sprs64.pt_iar, sprs64.pt_msr, sprs64.pt_cr,
sprs64.pt_lr, sprs64.pt_ctr, sprs64.pt_xer);
sprs64.pt_lr, sprs64.pt_ctr, sprs64.pt_xer,
sprs64.pt_fpscr);
}
else
{
@ -1201,7 +1209,8 @@ fetch_regs_kernel_thread (int regno, pthdb_tid_t tid)
if (!ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL))
memset (&sprs32, 0, sizeof (sprs32));
supply_sprs32 (sprs32.pt_iar, sprs32.pt_msr, sprs32.pt_cr,
sprs32.pt_lr, sprs32.pt_ctr, sprs32.pt_xer);
sprs32.pt_lr, sprs32.pt_ctr, sprs32.pt_xer,
sprs32.pt_fpscr);
if (tdep->ppc_mq_regnum >= 0)
supply_register (tdep->ppc_mq_regnum, (char *) &sprs32.pt_mq);
@ -1270,7 +1279,8 @@ fill_fprs (double *vals)
static void
fill_sprs64 (uint64_t *iar, uint64_t *msr, uint32_t *cr,
uint64_t *lr, uint64_t *ctr, uint32_t *xer)
uint64_t *lr, uint64_t *ctr, uint32_t *xer,
uint32_t *fpscr)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
@ -1293,11 +1303,14 @@ fill_sprs64 (uint64_t *iar, uint64_t *msr, uint32_t *cr,
regcache_collect (tdep->ppc_ctr_regnum, ctr);
if (register_cached (tdep->ppc_xer_regnum))
regcache_collect (tdep->ppc_xer_regnum, xer);
if (register_cached (tdep->ppc_fpscr_regnum))
regcache_collect (tdep->ppc_fpscr_regnum, fpscr);
}
static void
fill_sprs32 (unsigned long *iar, unsigned long *msr, unsigned long *cr,
unsigned long *lr, unsigned long *ctr, unsigned long *xer)
unsigned long *lr, unsigned long *ctr, unsigned long *xer,
unsigned long *fpscr)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
@ -1325,6 +1338,8 @@ fill_sprs32 (unsigned long *iar, unsigned long *msr, unsigned long *cr,
regcache_collect (tdep->ppc_ctr_regnum, ctr);
if (register_cached (tdep->ppc_xer_regnum))
regcache_collect (tdep->ppc_xer_regnum, xer);
if (register_cached (tdep->ppc_fpscr_regnum))
regcache_collect (tdep->ppc_fpscr_regnum, fpscr);
}
/* Store all registers into pthread PDTID, which doesn't have a kernel
@ -1376,7 +1391,8 @@ store_regs_user_thread (pthdb_pthread_t pdtid)
/* Special registers (always kept in ctx as 64 bits). */
if (arch64)
{
fill_sprs64 (&ctx.iar, &ctx.msr, &ctx.cr, &ctx.lr, &ctx.ctr, &ctx.xer);
fill_sprs64 (&ctx.iar, &ctx.msr, &ctx.cr, &ctx.lr, &ctx.ctr, &ctx.xer,
&ctx.fpscr);
}
else
{
@ -1384,10 +1400,12 @@ store_regs_user_thread (pthdb_pthread_t pdtid)
Solution: use 32-bit temp variables. (The assert() in fill_sprs32()
will fail if the size of an unsigned long is incorrect. If this
happens, GDB needs to be reconfigured so that longs are 32-bits.) */
unsigned long tmp_iar, tmp_msr, tmp_cr, tmp_lr, tmp_ctr, tmp_xer;
unsigned long tmp_iar, tmp_msr, tmp_cr, tmp_lr, tmp_ctr, tmp_xer,
tmp_fpscr;
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
fill_sprs32 (&tmp_iar, &tmp_msr, &tmp_cr, &tmp_lr, &tmp_ctr, &tmp_xer);
fill_sprs32 (&tmp_iar, &tmp_msr, &tmp_cr, &tmp_lr, &tmp_ctr, &tmp_xer,
&tmp_fpscr);
if (register_cached (PC_REGNUM))
ctx.iar = tmp_iar;
if (register_cached (tdep->ppc_ps_regnum))
@ -1400,6 +1418,8 @@ store_regs_user_thread (pthdb_pthread_t pdtid)
ctx.ctr = tmp_ctr;
if (register_cached (tdep->ppc_xer_regnum))
ctx.xer = tmp_xer;
if (register_cached (tdep->ppc_xer_regnum))
ctx.fpscr = tmp_fpscr;
}
status = pthdb_pthread_setcontext (pd_session, pdtid, &ctx);
@ -1471,7 +1491,8 @@ store_regs_kernel_thread (int regno, pthdb_tid_t tid)
ptrace64aix (PTT_READ_SPRS, tid,
(unsigned long) &sprs64, 0, NULL);
fill_sprs64 (&sprs64.pt_iar, &sprs64.pt_msr, &sprs64.pt_cr,
&sprs64.pt_lr, &sprs64.pt_ctr, &sprs64.pt_xer);
&sprs64.pt_lr, &sprs64.pt_ctr, &sprs64.pt_xer,
&sprs64.pt_fpscr);
ptrace64aix (PTT_WRITE_SPRS, tid,
(unsigned long) &sprs64, 0, NULL);
}
@ -1481,7 +1502,8 @@ store_regs_kernel_thread (int regno, pthdb_tid_t tid)
ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL);
fill_sprs32 (&sprs32.pt_iar, &sprs32.pt_msr, &sprs32.pt_cr,
&sprs32.pt_lr, &sprs32.pt_ctr, &sprs32.pt_xer);
&sprs32.pt_lr, &sprs32.pt_ctr, &sprs32.pt_xer,
&sprs32.pt_fpscr);
if (tdep->ppc_mq_regnum >= 0)
if (register_cached (tdep->ppc_mq_regnum))

View File

@ -176,6 +176,8 @@ regmap (int regno, int *isfloat)
return CTR;
else if (regno == tdep->ppc_xer_regnum)
return XER;
else if (regno == tdep->ppc_fpscr_regnum)
return FPSCR;
else if (tdep->ppc_mq_regnum >= 0 && regno == tdep->ppc_mq_regnum)
return MQ;
else
@ -366,6 +368,7 @@ fetch_inferior_registers (int regno)
fetch_register (tdep->ppc_lr_regnum);
fetch_register (tdep->ppc_ctr_regnum);
fetch_register (tdep->ppc_xer_regnum);
fetch_register (tdep->ppc_fpscr_regnum);
if (tdep->ppc_mq_regnum >= 0)
fetch_register (tdep->ppc_mq_regnum);
}
@ -404,6 +407,7 @@ store_inferior_registers (int regno)
store_register (tdep->ppc_lr_regnum);
store_register (tdep->ppc_ctr_regnum);
store_register (tdep->ppc_xer_regnum);
store_register (tdep->ppc_fpscr_regnum);
if (tdep->ppc_mq_regnum >= 0)
store_register (tdep->ppc_mq_regnum);
}
@ -586,6 +590,7 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
supply_register (tdep->ppc_lr_regnum, (char *) &regs->r64.lr);
supply_register (tdep->ppc_ctr_regnum, (char *) &regs->r64.ctr);
supply_register (tdep->ppc_xer_regnum, (char *) &regs->r64.xer);
supply_register (tdep->ppc_fpscr_regnum, (char *) &regs->r64.fpscr);
}
else
{
@ -601,6 +606,7 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
supply_register (tdep->ppc_lr_regnum, (char *) &regs->r32.lr);
supply_register (tdep->ppc_ctr_regnum, (char *) &regs->r32.ctr);
supply_register (tdep->ppc_xer_regnum, (char *) &regs->r32.xer);
supply_register (tdep->ppc_fpscr_regnum, (char *) &regs->r32.fpscr);
if (tdep->ppc_mq_regnum >= 0)
supply_register (tdep->ppc_mq_regnum, (char *) &regs->r32.mq);
}