Change gdb_cpu_setreg() to not take the value to which to set the

specified register, but a pointer to the in-memory representation of
that value. The reason for this is twofold:
1. Not all registers can be represented by a register_t. In particular
   FP registers fall in that category. Passing the new register value
   by reference instead of by value makes this point moot.
2. When we receive a G or P packet, both are for writing a register,
   the packet will have the register value in target-byte order and
   in the memory representation (modulo the fact that bytes are sent
   as 2 printable hexadecimal numbers of course). We only need to
   decode the packet to have a pointer to the register value.

This change fixes the bug of extracting the register value of the P
packet as a hexadecimal number instead of as a bit array. The quick
(and dirty) fix to bswap the register value in gdb_cpu_setreg() as
it has been added on i386 and amd64 can therefore be removed and has
in fact been that.

Tested on: alpha, amd64, i386, ia64, sparc64
This commit is contained in:
Marcel Moolenaar 2004-12-01 06:40:35 +00:00
parent ba1c3b5304
commit bcc5241c43
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=138253
11 changed files with 38 additions and 26 deletions

View File

@ -59,7 +59,7 @@ gdb_cpu_getreg(int regnum, size_t *regsz)
}
void
gdb_cpu_setreg(int regnum, register_t val)
gdb_cpu_setreg(int regnum, void *val)
{
switch (regnum) {
}

View File

@ -46,7 +46,7 @@ gdb_cpu_query(void)
}
void *gdb_cpu_getreg(int, size_t *);
void gdb_cpu_setreg(int, register_t);
void gdb_cpu_setreg(int, void *);
int gdb_cpu_signal(int, int);
#endif /* !_MACHINE_GDB_MACHDEP_H_ */

View File

@ -81,14 +81,13 @@ gdb_cpu_getreg(int regnum, size_t *regsz)
}
void
gdb_cpu_setreg(int regnum, register_t val)
gdb_cpu_setreg(int regnum, void *val)
{
val = __bswap64(val);
switch (regnum) {
case GDB_REG_PC:
kdb_thrctx->pcb_rip = val;
kdb_thrctx->pcb_rip = *(register_t *)val;
if (kdb_thread == curthread)
kdb_frame->tf_rip = val;
kdb_frame->tf_rip = *(register_t *)val;
}
}

View File

@ -52,6 +52,6 @@ gdb_cpu_query(void)
}
void *gdb_cpu_getreg(int, size_t *);
void gdb_cpu_setreg(int, register_t);
void gdb_cpu_setreg(int, void *);
#endif /* !_MACHINE_GDB_MACHDEP_H_ */

View File

@ -120,16 +120,22 @@ gdb_trap(int type, int code)
break;
case 'c': { /* Continue. */
uintmax_t addr;
if (!gdb_rx_varhex(&addr))
gdb_cpu_setreg(GDB_REG_PC, addr);
register_t pc;
if (!gdb_rx_varhex(&addr)) {
pc = addr;
gdb_cpu_setreg(GDB_REG_PC, &pc);
}
kdb_cpu_clear_singlestep();
return (1);
}
case 'C': { /* Continue with signal. */
uintmax_t addr, sig;
register_t pc;
if (!gdb_rx_varhex(&sig) && gdb_rx_char() == ';' &&
!gdb_rx_varhex(&addr))
gdb_cpu_setreg(GDB_REG_PC, addr);
!gdb_rx_varhex(&addr)) {
pc = addr;
gdb_cpu_setreg(GDB_REG_PC, &pc);
}
kdb_cpu_clear_singlestep();
return (1);
}
@ -191,9 +197,11 @@ gdb_trap(int type, int code)
break;
}
case 'P': { /* Write register. */
uintmax_t reg, val;
char *val;
uintmax_t reg;
val = gdb_rxp;
if (gdb_rx_varhex(&reg) || gdb_rx_char() != '=' ||
gdb_rx_varhex(&val)) {
!gdb_rx_mem(val, gdb_cpu_regsz(reg))) {
gdb_tx_err(EINVAL);
break;
}
@ -226,16 +234,22 @@ gdb_trap(int type, int code)
break;
case 's': { /* Step. */
uintmax_t addr;
if (!gdb_rx_varhex(&addr))
gdb_cpu_setreg(GDB_REG_PC, addr);
register_t pc;
if (!gdb_rx_varhex(&addr)) {
pc = addr;
gdb_cpu_setreg(GDB_REG_PC, &pc);
}
kdb_cpu_set_singlestep();
return (1);
}
case 'S': { /* Step with signal. */
uintmax_t addr, sig;
register_t pc;
if (!gdb_rx_varhex(&sig) && gdb_rx_char() == ';' &&
!gdb_rx_varhex(&addr))
gdb_cpu_setreg(GDB_REG_PC, addr);
!gdb_rx_varhex(&addr)) {
pc = addr;
gdb_cpu_setreg(GDB_REG_PC, &pc);
}
kdb_cpu_set_singlestep();
return (1);
}

View File

@ -67,15 +67,14 @@ gdb_cpu_getreg(int regnum, size_t *regsz)
}
void
gdb_cpu_setreg(int regnum, register_t val)
gdb_cpu_setreg(int regnum, void *val)
{
val = __bswap32(val);
switch (regnum) {
case GDB_REG_PC:
kdb_thrctx->pcb_eip = val;
kdb_thrctx->pcb_eip = *(register_t *)val;
if (kdb_thread == curthread)
kdb_frame->tf_eip = val;
kdb_frame->tf_eip = *(register_t *)val;
}
}

View File

@ -46,7 +46,7 @@ gdb_cpu_query(void)
}
void *gdb_cpu_getreg(int, size_t *);
void gdb_cpu_setreg(int, register_t);
void gdb_cpu_setreg(int, void *);
int gdb_cpu_signal(int, int);
#endif /* !_MACHINE_GDB_MACHDEP_H_ */

View File

@ -128,7 +128,7 @@ gdb_cpu_getreg(int regnum, size_t *regsz)
}
void
gdb_cpu_setreg(int regnum, register_t val)
gdb_cpu_setreg(int regnum, void *val)
{
switch (regnum) {

View File

@ -41,7 +41,7 @@ gdb_cpu_regsz(int regnum)
}
void *gdb_cpu_getreg(int, size_t *);
void gdb_cpu_setreg(int, register_t);
void gdb_cpu_setreg(int, void *);
int gdb_cpu_signal(int, int);
int gdb_cpu_query(void);

View File

@ -52,6 +52,6 @@ gdb_cpu_signal(int vector, int _)
}
void *gdb_cpu_getreg(int, size_t *);
void gdb_cpu_setreg(int, register_t);
void gdb_cpu_setreg(int, void *);
#endif /* !_MACHINE_GDB_MACHDEP_H_ */

View File

@ -63,7 +63,7 @@ gdb_cpu_getreg(int regnum, size_t *regsz)
}
void
gdb_cpu_setreg(int regnum, register_t val)
gdb_cpu_setreg(int regnum, void *val)
{
switch (regnum) {
}