struct fault_opts {
uint16_t first;
uint16_t step;
- uint16_t err;
+ int16_t err;
+ uint16_t signo;
};
/* Trace Control Block */
extern void set_sortby(const char *);
extern void set_overhead(int);
extern void print_pc(struct tcb *);
-extern int trace_syscall(struct tcb *);
+extern int trace_syscall(struct tcb *, unsigned int *);
extern void count_syscall(struct tcb *, const struct timeval *);
extern void call_summary(FILE *);
extern void print_symbolic_mode_t(unsigned int);
extern void print_numeric_umode_t(unsigned short);
extern void print_numeric_long_umask(unsigned long);
+extern void print_dev_t(unsigned long long dev);
extern void
dumpiov_in_msghdr(struct tcb *, kernel_ulong_t addr, kernel_ulong_t data_size);
printstr_ex(struct tcb *, kernel_ulong_t addr, kernel_ulong_t len,
unsigned int user_style);
-#define DECL_PRINTNUM(name) \
-extern bool \
-printnum_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \
- ATTRIBUTE_FORMAT((printf, 3, 0))
-DECL_PRINTNUM(short);
-DECL_PRINTNUM(int);
-DECL_PRINTNUM(int64);
-#undef DECL_PRINTNUM
-
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-extern bool
-printnum_long_int(struct tcb *, kernel_ulong_t addr,
- const char *fmt_long, const char *fmt_int)
- ATTRIBUTE_FORMAT((printf, 3, 0))
- ATTRIBUTE_FORMAT((printf, 4, 0));
-# define printnum_slong(tcp, addr) \
- printnum_long_int((tcp), (addr), "%" PRId64, "%d")
-# define printnum_ulong(tcp, addr) \
- printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
-# define printnum_ptr(tcp, addr) \
- printnum_long_int((tcp), (addr), "%#" PRIx64, "%#x")
-#elif SIZEOF_LONG > 4
-# define printnum_slong(tcp, addr) \
- printnum_int64((tcp), (addr), "%" PRId64)
-# define printnum_ulong(tcp, addr) \
- printnum_int64((tcp), (addr), "%" PRIu64)
-# define printnum_ptr(tcp, addr) \
- printnum_int64((tcp), (addr), "%#" PRIx64)
-#else
-# define printnum_slong(tcp, addr) \
- printnum_int((tcp), (addr), "%d")
-# define printnum_ulong(tcp, addr) \
- printnum_int((tcp), (addr), "%u")
-# define printnum_ptr(tcp, addr) \
- printnum_int((tcp), (addr), "%#x")
-#endif
-
-#define DECL_PRINTPAIR(name) \
-extern bool \
-printpair_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \
- ATTRIBUTE_FORMAT((printf, 3, 0))
-DECL_PRINTPAIR(int);
-DECL_PRINTPAIR(int64);
-#undef DECL_PRINTPAIR
-
extern void
printpathn(struct tcb *, kernel_ulong_t addr, unsigned int n);
# endif
#endif
-/* In many, many places we play fast and loose and use
- * tprintf("%d", (int) tcp->u_arg[N]) to print fds, pids etc.
- * We probably need to use widen_to_long() instead:
- */
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-# define widen_to_long(v) (current_wordsize == 4 ? (long)(int32_t)(v) : (long)(v))
-#else
-# define widen_to_long(v) ((long)(v))
+#define ANY_WORDSIZE_LESS_THAN_KERNEL_LONG \
+ (SIZEOF_KERNEL_LONG_T > 4 \
+ && (SIZEOF_LONG < SIZEOF_KERNEL_LONG_T || !defined(current_wordsize)))
+
+#define DECL_PRINTNUM(name) \
+extern bool \
+printnum_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \
+ ATTRIBUTE_FORMAT((printf, 3, 0))
+DECL_PRINTNUM(short);
+DECL_PRINTNUM(int);
+DECL_PRINTNUM(int64);
+#undef DECL_PRINTNUM
+
+#define DECL_PRINTNUM_ADDR(name) \
+extern bool \
+printnum_addr_ ## name(struct tcb *, kernel_ulong_t addr)
+DECL_PRINTNUM_ADDR(int);
+DECL_PRINTNUM_ADDR(int64);
+#undef DECL_PRINTNUM_ADDR
+
+#ifndef current_wordsize
+extern bool
+printnum_long_int(struct tcb *, kernel_ulong_t addr,
+ const char *fmt_long, const char *fmt_int)
+ ATTRIBUTE_FORMAT((printf, 3, 0))
+ ATTRIBUTE_FORMAT((printf, 4, 0));
+extern bool printnum_addr_long_int(struct tcb *, kernel_ulong_t addr);
+# define printnum_slong(tcp, addr) \
+ printnum_long_int((tcp), (addr), "%" PRId64, "%d")
+# define printnum_ulong(tcp, addr) \
+ printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
+# define printnum_ptr(tcp, addr) \
+ printnum_addr_long_int((tcp), (addr))
+#elif current_wordsize > 4
+# define printnum_slong(tcp, addr) \
+ printnum_int64((tcp), (addr), "%" PRId64)
+# define printnum_ulong(tcp, addr) \
+ printnum_int64((tcp), (addr), "%" PRIu64)
+# define printnum_ptr(tcp, addr) \
+ printnum_addr_int64((tcp), (addr))
+#else /* current_wordsize == 4 */
+# define printnum_slong(tcp, addr) \
+ printnum_int((tcp), (addr), "%d")
+# define printnum_ulong(tcp, addr) \
+ printnum_int((tcp), (addr), "%u")
+# define printnum_ptr(tcp, addr) \
+ printnum_addr_int((tcp), (addr))
#endif
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-# define widen_to_ulong(v) \
- (current_wordsize == 4 ? (unsigned long) (uint32_t) (v) : \
- (unsigned long) (v))
-#else
-# define widen_to_ulong(v) ((unsigned long)(v))
+#ifndef current_klongsize
+extern bool printnum_addr_klong_int(struct tcb *, kernel_ulong_t addr);
+# define printnum_kptr(tcp, addr) \
+ printnum_addr_klong_int((tcp), (addr))
+#elif current_klongsize > 4
+# define printnum_kptr(tcp, addr) \
+ printnum_addr_int64((tcp), (addr))
+#else /* current_klongsize == 4 */
+# define printnum_kptr(tcp, addr) \
+ printnum_addr_int((tcp), (addr))
#endif
+#define DECL_PRINTPAIR(name) \
+extern bool \
+printpair_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \
+ ATTRIBUTE_FORMAT((printf, 3, 0))
+DECL_PRINTPAIR(int);
+DECL_PRINTPAIR(int64);
+#undef DECL_PRINTPAIR
+
+static inline kernel_long_t
+truncate_klong_to_current_wordsize(const kernel_long_t v)
+{
+#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
+ if (current_wordsize < sizeof(v)) {
+ return (int) v;
+ } else
+#endif
+ {
+ return v;
+ }
+}
+
+static inline kernel_ulong_t
+truncate_kulong_to_current_wordsize(const kernel_ulong_t v)
+{
+#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
+ if (current_wordsize < sizeof(v)) {
+ return (unsigned int) v;
+ } else
+#endif
+ {
+ return v;
+ }
+}
+
/*
* Cast a pointer or a pointer-sized integer to kernel_ulong_t.
*/