Hi, Linux kernel v3.4 adds x32 support. Both x32 and n32 use 64bit offset for lseek parameter and return value. We need u_lrval to handle it properly. Also we shouldn't check HAVE_LONG_LONG_OFF_T for n32 lseek. This patch fixes it properly and prepares lseek for x32.
Thanks. H.J. ---- 2012-04-15 H.J. Lu <[email protected]> * defs.h (tcb): Restore u_lrval. (RVAL_LDECIMAL): Restored. (RVAL_LHEX): Likewise. (RVAL_LOCTAL): Likewise. (RVAL_LUDECIMAL): Likewise. (RVAL_MASK): Set to 7. * file.c (sys_lseek): Print 64bit offset and return RVAL_LUDECIMAL for n32. * syscall.c (get_error): Set u_lrval for n32. diff --git a/defs.h b/defs.h index 1ebbd29..0993855 100644 --- a/defs.h +++ b/defs.h @@ -328,6 +328,9 @@ struct tcb { long long ext_arg[MAX_ARGS]; /* System call arguments */ #endif long u_rval; /* (first) return value */ +#ifdef HAVE_LONG_LONG + long long u_lrval; /* long long return value */ +#endif #if SUPPORTED_PERSONALITIES > 1 int currpers; /* Personality at the time of scno update */ #endif @@ -418,7 +421,11 @@ extern const struct xlat open_access_modes[]; #define RVAL_HEX 001 /* hex format */ #define RVAL_OCTAL 002 /* octal format */ #define RVAL_UDECIMAL 003 /* unsigned decimal format */ -#define RVAL_MASK 003 /* mask for these values */ +#define RVAL_LDECIMAL 004 /* long decimal format */ +#define RVAL_LHEX 005 /* long hex format */ +#define RVAL_LOCTAL 006 /* long octal format */ +#define RVAL_LUDECIMAL 007 /* long unsigned decimal format */ +#define RVAL_MASK 007 /* mask for these values */ #define RVAL_STR 010 /* Print `auxstr' field after return val */ #define RVAL_NONE 020 /* Print nothing */ diff --git a/file.c b/file.c index 1a448cd..fa4b314 100644 --- a/file.c +++ b/file.c @@ -478,8 +478,7 @@ static const struct xlat whence[] = { { 0, NULL }, }; -#if !defined(HAVE_LONG_LONG_OFF_T) -# if defined(LINUX_MIPSN32) +#if defined(LINUX_MIPSN32) int sys_lseek(struct tcb *tcp) { @@ -497,9 +496,9 @@ sys_lseek(struct tcb *tcp) tprintf("%lld, ", offset); printxval(whence, _whence, "SEEK_???"); } - return RVAL_UDECIMAL; + return RVAL_LUDECIMAL; } -# else /* !LINUX_MIPSN32 */ +#else int sys_lseek(struct tcb *tcp) { @@ -519,7 +518,6 @@ sys_lseek(struct tcb *tcp) } return RVAL_UDECIMAL; } -# endif #endif int diff --git a/syscall.c b/syscall.c index ddc461c..db0b576 100644 --- a/syscall.c +++ b/syscall.c @@ -1735,6 +1735,9 @@ get_error(struct tcb *tcp) u_error = r2; } else { tcp->u_rval = r2; +# if defined(LINUX_MIPSN32) + tcp->u_lrval = r2; +# endif } #elif defined(POWERPC) if (check_errno && is_negated_errno(ppc_result)) { @@ -2065,6 +2068,20 @@ trace_syscall_exiting(struct tcb *tcp) case RVAL_DECIMAL: tprintf("= %ld", tcp->u_rval); break; +#ifdef HAVE_LONG_LONG + case RVAL_LHEX: + tprintf("= %#llx", tcp->u_lrval); + break; + case RVAL_LOCTAL: + tprintf("= %#llo", tcp->u_lrval); + break; + case RVAL_LUDECIMAL: + tprintf("= %llu", tcp->u_lrval); + break; + case RVAL_LDECIMAL: + tprintf("= %lld", tcp->u_lrval); + break; +#endif default: fprintf(stderr, "invalid rval format\n"); -- 1.7.6.5 ------------------------------------------------------------------------------ For Developers, A Lot Can Happen In A Second. Boundary is the first to Know...and Tell You. Monitor Your Applications in Ultra-Fine Resolution. Try it FREE! http://p.sf.net/sfu/Boundary-d2dvs2 _______________________________________________ Strace-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/strace-devel
