diff options
author | Joseph Myers <joseph@codesourcery.com> | 2012-11-29 23:03:48 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2012-11-29 23:03:48 +0000 |
commit | 1672585fc12c06af75378535df11b916ebc12edf (patch) | |
tree | e70b1dbb83bb0904534440e6d013bd278196321d /ports | |
parent | 9e4eee23af656c890394205fb15d252e171d346e (diff) | |
download | glibc-1672585fc12c06af75378535df11b916ebc12edf.zip glibc-1672585fc12c06af75378535df11b916ebc12edf.tar.gz glibc-1672585fc12c06af75378535df11b916ebc12edf.tar.bz2 |
Add 64-bit support to MIPS register-dump.h (bug 14893).
Diffstat (limited to 'ports')
-rw-r--r-- | ports/ChangeLog.mips | 17 | ||||
-rw-r--r-- | ports/sysdeps/mips/mips64/n32/_itoa.h | 4 | ||||
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/mips/register-dump.h | 41 |
3 files changed, 50 insertions, 12 deletions
diff --git a/ports/ChangeLog.mips b/ports/ChangeLog.mips index 6034fd0..b6886af 100644 --- a/ports/ChangeLog.mips +++ b/ports/ChangeLog.mips @@ -1,3 +1,20 @@ +2012-11-29 Joseph Myers <joseph@codesourcery.com> + + [BZ #14893] + * sysdeps/mips/mips64/n32/_itoa.h: New file. + * sysdeps/unix/sysv/linux/mips/register-dump.h: Include + <sgidefs.h>. + (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 <joseph@codesourcery.com> [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 0000000..363cdfe --- /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 1862281..0156910 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 <http://www.gnu.org/licenses/>. */ +#include <sgidefs.h> #include <sys/uio.h> #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"); |