Introduce HAVE_STRUCT_TCB_EXT_ARG macro

Check for "if HAVE_STRUCT_TCB_EXT_ARG" instead of
"if defined LINUX_MIPSN32 || defined X32".

* defs.h (HAVE_STRUCT_TCB_EXT_ARG): Define for LINUX_MIPSN32 || X32.
(struct tcb): Check it instead of LINUX_MIPSN32 || X32.
(RVAL_LUDECIMAL): Likewise.
* io.c (print_lld_from_low_high_val): Likewise.
* lseek.c (SYS_FUNC(lseek)): Likewise.
* mem.c (SYS_FUNC(mmap)): Likewise.
* syscall.c (trace_syscall_exiting): Likewise.
* util.c (getllval): Likewise.
This commit is contained in:
Дмитрий Левин 2016-06-17 16:12:13 +00:00
parent d4bdff69fc
commit b0c51131a3
6 changed files with 46 additions and 29 deletions

12
defs.h
View File

@ -288,6 +288,12 @@ typedef struct ioctlent {
unsigned int code;
} struct_ioctlent;
#if defined LINUX_MIPSN32 || defined X32
# define HAVE_STRUCT_TCB_EXT_ARG 1
#else
# define HAVE_STRUCT_TCB_EXT_ARG 0
#endif
/* Trace Control Block */
struct tcb {
int flags; /* See below for TCB_ values */
@ -296,7 +302,7 @@ struct tcb {
int u_error; /* Error code */
long scno; /* System call number */
long u_arg[MAX_ARGS]; /* System call arguments */
#if defined(LINUX_MIPSN32) || defined(X32)
#if HAVE_STRUCT_TCB_EXT_ARG
long long ext_arg[MAX_ARGS];
long long u_lrval; /* long long return value */
#endif
@ -382,14 +388,14 @@ extern const struct xlat whence_codes[];
#define RVAL_HEX 001 /* hex format */
#define RVAL_OCTAL 002 /* octal format */
#define RVAL_UDECIMAL 003 /* unsigned decimal format */
#if defined(LINUX_MIPSN32) || defined(X32)
#if HAVE_STRUCT_TCB_EXT_ARG
# if 0 /* unused so far */
# define RVAL_LDECIMAL 004 /* long decimal format */
# define RVAL_LHEX 005 /* long hex format */
# define RVAL_LOCTAL 006 /* long octal format */
# endif
# define RVAL_LUDECIMAL 007 /* long unsigned decimal format */
#endif
#endif /* HAVE_STRUCT_TCB_EXT_ARG */
#define RVAL_FD 010 /* file descriptor */
#define RVAL_MASK 017 /* mask for these values */

20
io.c
View File

@ -180,7 +180,7 @@ SYS_FUNC(pwrite)
static void
print_lld_from_low_high_val(struct tcb *tcp, int arg)
{
#if SIZEOF_LONG == SIZEOF_LONG_LONG
#if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG
# if SUPPORTED_PERSONALITIES > 1
# ifdef X86_64
if (current_personality != 1)
@ -195,12 +195,20 @@ print_lld_from_low_high_val(struct tcb *tcp, int arg)
((unsigned long) tcp->u_arg[arg + 1] << current_wordsize * 8)
| (unsigned long) tcp->u_arg[arg]);
# endif
#else
# ifdef X32
if (current_personality == 0)
tprintf("%lld", tcp->ext_arg[arg]);
else
#elif SIZEOF_LONG > 4
# error Unsupported configuration: SIZEOF_LONG > 4 && SIZEOF_LONG_LONG > SIZEOF_LONG
#elif HAVE_STRUCT_TCB_EXT_ARG
# if SUPPORTED_PERSONALITIES > 1
if (current_personality == 1) {
tprintf("%lld",
(widen_to_ull(tcp->u_arg[arg + 1]) << sizeof(long) * 8)
| widen_to_ull(tcp->u_arg[arg]));
} else
# endif
{
tprintf("%lld", tcp->ext_arg[arg]);
}
#else /* SIZEOF_LONG_LONG > SIZEOF_LONG && !HAVE_STRUCT_TCB_EXT_ARG */
tprintf("%lld",
(widen_to_ull(tcp->u_arg[arg + 1]) << sizeof(long) * 8)
| widen_to_ull(tcp->u_arg[arg]));

14
lseek.c
View File

@ -44,19 +44,21 @@
* which means that on x32 we need to use tcp->ext_arg[N] to get offset argument.
* Use test/x32_lseek.c to test lseek decoding.
*/
#if defined(LINUX_MIPSN32) || defined(X32)
#if HAVE_STRUCT_TCB_EXT_ARG
SYS_FUNC(lseek)
{
printfd(tcp, tcp->u_arg[0]);
long long offset;
# ifdef X32
/* tcp->ext_arg is not initialized for i386 personality */
if (current_personality == 1)
# if SUPPORTED_PERSONALITIES > 1
/* tcp->ext_arg is not initialized for compat personality */
if (current_personality == 1) {
offset = tcp->u_arg[1];
else
} else
# endif
offset = tcp->ext_arg[1];
{
offset = tcp->ext_arg[1];
}
int whence = tcp->u_arg[2];
tprintf(", %lld, ", offset);

9
mem.c
View File

@ -135,10 +135,11 @@ SYS_FUNC(old_mmap_pgoff)
/* Params are passed directly, offset is in bytes */
SYS_FUNC(mmap)
{
unsigned long long offset = (unsigned long) tcp->u_arg[5];
#if defined(LINUX_MIPSN32) || defined(X32)
/* Try test/x32_mmap.c */
offset = tcp->ext_arg[5];
unsigned long long offset =
#if HAVE_STRUCT_TCB_EXT_ARG
tcp->ext_arg[5]; /* try test/x32_mmap.c */
#else
(unsigned long) tcp->u_arg[5];
#endif
/* Example of kernel-side handling of this variety of mmap:
* arch/x86/kernel/sys_x86_64.c::SYSCALL_DEFINE6(mmap, ...) calls

View File

@ -1042,7 +1042,7 @@ trace_syscall_exiting(struct tcb *tcp)
else
tprintf("= %ld", tcp->u_rval);
break;
#if defined(LINUX_MIPSN32) || defined(X32)
#if HAVE_STRUCT_TCB_EXT_ARG
/*
case RVAL_LHEX:
tprintf("= %#llx", tcp->u_lrval);
@ -1059,7 +1059,7 @@ trace_syscall_exiting(struct tcb *tcp)
tprintf("= %lld", tcp->u_lrval);
break;
*/
#endif
#endif /* HAVE_STRUCT_TCB_EXT_ARG */
default:
error_msg("invalid rval format");
break;

16
util.c
View File

@ -257,16 +257,16 @@ getllval(struct tcb *tcp, unsigned long long *val, int arg_no)
# endif /* SUPPORTED_PERSONALITIES > 1 */
#elif SIZEOF_LONG > 4
# error Unsupported configuration: SIZEOF_LONG > 4 && SIZEOF_LONG_LONG > SIZEOF_LONG
#elif defined LINUX_MIPSN32
*val = tcp->ext_arg[arg_no];
arg_no++;
#elif defined X32
if (current_personality == 0) {
*val = tcp->ext_arg[arg_no];
arg_no++;
} else {
#elif HAVE_STRUCT_TCB_EXT_ARG
# if SUPPORTED_PERSONALITIES > 1
if (current_personality == 1) {
*val = LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]);
arg_no += 2;
} else
# endif
{
*val = tcp->ext_arg[arg_no];
arg_no++;
}
#else
# if defined __ARM_EABI__ || \