From 1672585fc12c06af75378535df11b916ebc12edf Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 29 Nov 2012 23:03:48 +0000 Subject: Add 64-bit support to MIPS register-dump.h (bug 14893). --- ports/ChangeLog.mips | 17 +++++++++ ports/sysdeps/mips/mips64/n32/_itoa.h | 4 +++ ports/sysdeps/unix/sysv/linux/mips/register-dump.h | 41 +++++++++++++++------- 3 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 ports/sysdeps/mips/mips64/n32/_itoa.h (limited to 'ports') diff --git a/ports/ChangeLog.mips b/ports/ChangeLog.mips index 6034fd041b..b6886af92c 100644 --- a/ports/ChangeLog.mips +++ b/ports/ChangeLog.mips @@ -1,3 +1,20 @@ +2012-11-29 Joseph Myers + + [BZ #14893] + * sysdeps/mips/mips64/n32/_itoa.h: New file. + * sysdeps/unix/sysv/linux/mips/register-dump.h: Include + . + (CTX_TYPE): New macro. + (CTX_REG): Likewise. + (CTX_PC): Likewise. + (CTX_MDHI): Likewise. + (CTX_MDLO): Likewise. + (REG_HEX_SIZE): Likewise. + (hexvalue): Take _ITOA_WORD_TYPE argument. + (register_dump): Use these macros instead of hardcoding struct + sigcontext * type and accesses and 8-byte textual output for + registers. + 2012-11-22 Joseph Myers [BZ #14822] diff --git a/ports/sysdeps/mips/mips64/n32/_itoa.h b/ports/sysdeps/mips/mips64/n32/_itoa.h new file mode 100644 index 0000000000..363cdfe9ac --- /dev/null +++ b/ports/sysdeps/mips/mips64/n32/_itoa.h @@ -0,0 +1,4 @@ +/* MIPS n32 uses 64-bit _itoa_word and _itoa is mapped to _itoa_word. */ +#define _ITOA_NEEDED 0 +#define _ITOA_WORD_TYPE unsigned long long int +#include_next <_itoa.h> diff --git a/ports/sysdeps/unix/sysv/linux/mips/register-dump.h b/ports/sysdeps/unix/sysv/linux/mips/register-dump.h index 186228119f..0156910e40 100644 --- a/ports/sysdeps/unix/sysv/linux/mips/register-dump.h +++ b/ports/sysdeps/unix/sysv/linux/mips/register-dump.h @@ -17,9 +17,26 @@ License along with the GNU C Library. If not, see . */ +#include #include #include <_itoa.h> +#if _MIPS_SIM == _ABIO32 +# define CTX_TYPE struct sigcontext * +# define CTX_REG(ctx, i) ((ctx)->sc_regs[(i)]) +# define CTX_PC(ctx) ((ctx)->sc_pc) +# define CTX_MDHI(ctx) ((ctx)->sc_mdhi) +# define CTX_MDLO(ctx) ((ctx)->sc_mdlo) +# define REG_HEX_SIZE 8 +#else +# define CTX_TYPE ucontext_t * +# define CTX_REG(ctx, i) ((ctx)->uc_mcontext.gregs[(i)]) +# define CTX_PC(ctx) ((ctx)->uc_mcontext.pc) +# define CTX_MDHI(ctx) ((ctx)->uc_mcontext.mdhi) +# define CTX_MDLO(ctx) ((ctx)->uc_mcontext.mdhi) +# define REG_HEX_SIZE 16 +#endif + /* We will print the register dump in this format: R0 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX @@ -32,7 +49,7 @@ */ static void -hexvalue (unsigned long int value, char *buf, size_t len) +hexvalue (_ITOA_WORD_TYPE value, char *buf, size_t len) { char *cp = _itoa_word (value, buf + len, 16, 0); while (cp > buf) @@ -40,9 +57,9 @@ hexvalue (unsigned long int value, char *buf, size_t len) } static void -register_dump (int fd, struct sigcontext *ctx) +register_dump (int fd, CTX_TYPE ctx) { - char regs[38][8]; + char regs[38][REG_HEX_SIZE]; struct iovec iov[38 * 2 + 10]; size_t nr = 0; int i; @@ -58,40 +75,40 @@ register_dump (int fd, struct sigcontext *ctx) /* Generate strings of register contents. */ for (i = 0; i < 32; i++) - hexvalue (ctx->sc_regs[i], regs[i], 8); - hexvalue (ctx->sc_pc, regs[32], 8); - hexvalue (ctx->sc_mdhi, regs[33], 8); - hexvalue (ctx->sc_mdlo, regs[34], 8); + hexvalue (CTX_REG (ctx, i), regs[i], REG_HEX_SIZE); + hexvalue (CTX_PC (ctx), regs[32], REG_HEX_SIZE); + hexvalue (CTX_MDHI (ctx), regs[33], REG_HEX_SIZE); + hexvalue (CTX_MDLO (ctx), regs[34], REG_HEX_SIZE); /* Generate the output. */ ADD_STRING ("Register dump:\n\n R0 "); for (i = 0; i < 8; i++) { - ADD_MEM (regs[i], 8); + ADD_MEM (regs[i], REG_HEX_SIZE); ADD_STRING (" "); } ADD_STRING ("\n R8 "); for (i = 8; i < 16; i++) { - ADD_MEM (regs[i], 8); + ADD_MEM (regs[i], REG_HEX_SIZE); ADD_STRING (" "); } ADD_STRING ("\n R16 "); for (i = 16; i < 24; i++) { - ADD_MEM (regs[i], 8); + ADD_MEM (regs[i], REG_HEX_SIZE); ADD_STRING (" "); } ADD_STRING ("\n R24 "); for (i = 24; i < 32; i++) { - ADD_MEM (regs[i], 8); + ADD_MEM (regs[i], REG_HEX_SIZE); ADD_STRING (" "); } ADD_STRING ("\n pc lo hi\n "); for (i = 32; i < 35; i++) { - ADD_MEM (regs[i], 8); + ADD_MEM (regs[i], REG_HEX_SIZE); ADD_STRING (" "); } ADD_STRING ("\n"); -- cgit 1.4.1