|
From: Petar J. <pe...@so...> - 2018-04-10 12:11:20
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=fc6c463d57ffd042a0426a6442ffce92be96d388 commit fc6c463d57ffd042a0426a6442ffce92be96d388 Author: Petar Jovanovic <pet...@rt...> Date: Tue Apr 10 14:09:08 2018 +0200 Introduce RegWord type On majority of architectures size of long matches register width. On mips n32 size of long is 32 bits and register width is 64 bits. Valgrind is written with assumption that long size matches register width. This is the reason why both UWord for Valgrind and HWord for VEX match size of long. Long size differs from register size on mips n32 ABI. Introducing RegWord type that will match size of registers. Part of the changes required for BZ issue - #345763. Contributed by: Tamara Vlahovic and Dimitrije Nikolic. Diff: --- VEX/priv/ir_defs.c | 4 +- VEX/priv/ir_inject.c | 6 +- VEX/pub/libvex_basictypes.h | 4 + cachegrind/cg_main.c | 4 +- callgrind/main.c | 8 +- coregrind/m_debuglog.c | 2 +- coregrind/m_libcfile.c | 4 +- coregrind/m_libcsignal.c | 6 +- coregrind/m_scheduler/scheduler.c | 6 +- coregrind/m_signals.c | 4 +- coregrind/m_syscall.c | 6 +- coregrind/m_syswrap/priv_types_n_macros.h | 50 +- coregrind/m_syswrap/syswrap-generic.c | 359 +++--- coregrind/m_syswrap/syswrap-linux.c | 1867 ++++++++++++++++------------ coregrind/m_syswrap/syswrap-main.c | 2 +- coregrind/m_syswrap/syswrap-mips64-linux.c | 45 +- coregrind/m_translate.c | 4 +- coregrind/pub_core_syscall.h | 6 +- 18 files changed, 1372 insertions(+), 1015 deletions(-) diff --git a/VEX/priv/ir_defs.c b/VEX/priv/ir_defs.c index 2cffd0b..15524bf 100644 --- a/VEX/priv/ir_defs.c +++ b/VEX/priv/ir_defs.c @@ -4818,9 +4818,9 @@ IRType integerIRTypeOfSize ( Int szB ) IRExpr* mkIRExpr_HWord ( HWord hw ) { vassert(sizeof(void*) == sizeof(HWord)); - if (sizeof(HWord) == 4) + if (sizeof(RegWord) == 4) return IRExpr_Const(IRConst_U32((UInt)hw)); - if (sizeof(HWord) == 8) + if (sizeof(RegWord) == 8) return IRExpr_Const(IRConst_U64((ULong)hw)); vpanic("mkIRExpr_HWord"); } diff --git a/VEX/priv/ir_inject.c b/VEX/priv/ir_inject.c index c127aca..eec3dd2 100644 --- a/VEX/priv/ir_inject.c +++ b/VEX/priv/ir_inject.c @@ -87,7 +87,8 @@ load(IREndness endian, IRType type, HWord haddr) vassert(type == Ity_I1 || sizeofIRType(type) <= 16); - if (VEX_HOST_WORDSIZE == 8) { + if (VEX_HOST_WORDSIZE == 8 || + (VEX_HOST_WORDSIZE == 4 && sizeof(RegWord) == 8)) { addr = mkU64(haddr); next_addr = binop(Iop_Add64, addr, mkU64(8)); } else if (VEX_HOST_WORDSIZE == 4) { @@ -148,7 +149,8 @@ store(IRSB *irsb, IREndness endian, HWord haddr, IRExpr *data) IROp high, low; IRExpr *addr, *next_addr; - if (VEX_HOST_WORDSIZE == 8) { + if (VEX_HOST_WORDSIZE == 8 || + (VEX_HOST_WORDSIZE == 4 && sizeof(RegWord) == 8)) { addr = mkU64(haddr); next_addr = binop(Iop_Add64, addr, mkU64(8)); } else if (VEX_HOST_WORDSIZE == 4) { diff --git a/VEX/pub/libvex_basictypes.h b/VEX/pub/libvex_basictypes.h index 86df444..d633cde 100644 --- a/VEX/pub/libvex_basictypes.h +++ b/VEX/pub/libvex_basictypes.h @@ -142,6 +142,10 @@ typedef unsigned long Addr; machine. */ typedef unsigned long HWord; +/* Size of GPRs */ +typedef HWord RegWord; +#define FMT_REGWORD "l" + /* Set up VEX_HOST_WORDSIZE and VEX_REGPARM. */ #undef VEX_HOST_WORDSIZE #undef VEX_REGPARM diff --git a/cachegrind/cg_main.c b/cachegrind/cg_main.c index cd4de76..f23b82b 100644 --- a/cachegrind/cg_main.c +++ b/cachegrind/cg_main.c @@ -1002,7 +1002,7 @@ void addEvent_Bc ( CgState* cgs, InstrInfo* inode, IRAtom* guard ) Event* evt; tl_assert(isIRAtom(guard)); tl_assert(typeOfIRExpr(cgs->sbOut->tyenv, guard) - == (sizeof(HWord)==4 ? Ity_I32 : Ity_I64)); + == (sizeof(RegWord)==4 ? Ity_I32 : Ity_I64)); if (!clo_branch_sim) return; if (cgs->events_used == N_EVENTS) @@ -1022,7 +1022,7 @@ void addEvent_Bi ( CgState* cgs, InstrInfo* inode, IRAtom* whereTo ) Event* evt; tl_assert(isIRAtom(whereTo)); tl_assert(typeOfIRExpr(cgs->sbOut->tyenv, whereTo) - == (sizeof(HWord)==4 ? Ity_I32 : Ity_I64)); + == (sizeof(RegWord)==4 ? Ity_I32 : Ity_I64)); if (!clo_branch_sim) return; if (cgs->events_used == N_EVENTS) diff --git a/callgrind/main.c b/callgrind/main.c index ab49272..4696853 100644 --- a/callgrind/main.c +++ b/callgrind/main.c @@ -719,7 +719,7 @@ void addEvent_Bc ( ClgState* clgs, InstrInfo* inode, IRAtom* guard ) Event* evt; tl_assert(isIRAtom(guard)); tl_assert(typeOfIRExpr(clgs->sbOut->tyenv, guard) - == (sizeof(HWord)==4 ? Ity_I32 : Ity_I64)); + == (sizeof(RegWord)==4 ? Ity_I32 : Ity_I64)); if (!CLG_(clo).simulate_branch) return; if (clgs->events_used == N_EVENTS) @@ -739,7 +739,7 @@ void addEvent_Bi ( ClgState* clgs, InstrInfo* inode, IRAtom* whereTo ) Event* evt; tl_assert(isIRAtom(whereTo)); tl_assert(typeOfIRExpr(clgs->sbOut->tyenv, whereTo) - == (sizeof(HWord)==4 ? Ity_I32 : Ity_I64)); + == (sizeof(RegWord)==4 ? Ity_I32 : Ity_I64)); if (!CLG_(clo).simulate_branch) return; if (clgs->events_used == N_EVENTS) @@ -839,11 +839,11 @@ Addr IRConst2Addr(IRConst* con) { Addr addr; - if (sizeof(Addr) == 4) { + if (sizeof(RegWord) == 4) { CLG_ASSERT( con->tag == Ico_U32 ); addr = con->Ico.U32; } - else if (sizeof(Addr) == 8) { + else if (sizeof(RegWord) == 8) { CLG_ASSERT( con->tag == Ico_U64 ); addr = con->Ico.U64; } diff --git a/coregrind/m_debuglog.c b/coregrind/m_debuglog.c index 5c25e33..8ca80c1 100644 --- a/coregrind/m_debuglog.c +++ b/coregrind/m_debuglog.c @@ -480,7 +480,7 @@ static UInt local_sys_getpid ( void ) static UInt local_sys_write_stderr ( const HChar* buf, Int n ) { volatile Long block[2]; - block[0] = (Long)buf; + block[0] = (Long)(Addr)buf; block[1] = n; __asm__ volatile ( "li $4, 2\n\t" /* std output*/ diff --git a/coregrind/m_libcfile.c b/coregrind/m_libcfile.c index c436821..1815874 100644 --- a/coregrind/m_libcfile.c +++ b/coregrind/m_libcfile.c @@ -292,7 +292,7 @@ Off64T VG_(lseek) ( Int fd, Off64T offset, Int whence ) return sr_isError(res) ? (-1) : result; # else SysRes res = VG_(do_syscall3)(__NR_lseek, fd, offset, whence); - vg_assert(sizeof(Off64T) == sizeof(Word)); + vg_assert(sizeof(Off64T) == sizeof(sr_Res(res))); return sr_isError(res) ? (-1) : sr_Res(res); # endif # elif defined(VGP_x86_darwin) @@ -412,7 +412,7 @@ Int VG_(fstat) ( Int fd, struct vg_stat* vgbuf ) } # endif /* if defined(__NR_fstat64) */ { struct vki_stat buf; - res = VG_(do_syscall2)(__NR_fstat, (UWord)fd, (UWord)&buf); + res = VG_(do_syscall2)(__NR_fstat, (RegWord)fd, (RegWord)(Addr)&buf); if (!sr_isError(res)) TRANSLATE_TO_vg_stat(vgbuf, &buf); return sr_isError(res) ? (-1) : 0; diff --git a/coregrind/m_libcsignal.c b/coregrind/m_libcsignal.c index d5e5f4f..4703ad6 100644 --- a/coregrind/m_libcsignal.c +++ b/coregrind/m_libcsignal.c @@ -92,7 +92,7 @@ Bool VG_(isemptysigset)( const vki_sigset_t* set ) } else { /* Partial word check. */ - ULong mask = (1UL << (_VKI_MAXSIG % _VKI_NSIG_BPW)) - 1; + ULong mask = ((ULong)1UL << (_VKI_MAXSIG % _VKI_NSIG_BPW)) - 1; if ((set->sig[i] & mask) != 0) return False; break; } @@ -111,7 +111,7 @@ Bool VG_(isfullsigset)( const vki_sigset_t* set ) } else { /* Partial word check. */ - ULong mask = (1UL << (_VKI_MAXSIG % _VKI_NSIG_BPW)) - 1; + ULong mask = ((ULong)1UL << (_VKI_MAXSIG % _VKI_NSIG_BPW)) - 1; if ((set->sig[i] & mask) != mask) return False; break; } @@ -130,7 +130,7 @@ Bool VG_(iseqsigset)( const vki_sigset_t* set1, const vki_sigset_t* set2 ) } else { /* Partial word comparison. */ - ULong mask = (1UL << (_VKI_MAXSIG % _VKI_NSIG_BPW)) - 1; + ULong mask = ((ULong)1UL << (_VKI_MAXSIG % _VKI_NSIG_BPW)) - 1; if ((set1->sig[i] & mask) != (set2->sig[i] & mask)) return False; break; } diff --git a/coregrind/m_scheduler/scheduler.c b/coregrind/m_scheduler/scheduler.c index 2ffcf4b..87cb4d6 100644 --- a/coregrind/m_scheduler/scheduler.c +++ b/coregrind/m_scheduler/scheduler.c @@ -978,7 +978,7 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, /* Invalidate any in-flight LL/SC transactions, in the case that we're using the fallback LL/SC implementation. See bugs 344524 and 369459. */ # if defined(VGP_mips32_linux) || defined(VGP_mips64_linux) - tst->arch.vex.guest_LLaddr = (HWord)(-1); + tst->arch.vex.guest_LLaddr = (RegWord)(-1); # elif defined(VGP_arm64_linux) tst->arch.vex.guest_LLSC_SIZE = 0; # endif @@ -1648,7 +1648,7 @@ VgSchedReturnCode VG_(scheduler) ( ThreadId tid ) break; case VEX_TRC_JMP_FLUSHDCACHE: { - void* start = (void*)VG_(threads)[tid].arch.vex.guest_CMSTART; + void* start = (void*)(Addr)VG_(threads)[tid].arch.vex.guest_CMSTART; SizeT len = VG_(threads)[tid].arch.vex.guest_CMLEN; VG_(debugLog)(2, "sched", "flush_dcache(%p, %lu)\n", start, len); VG_(flush_dcache)(start, len); @@ -1898,7 +1898,7 @@ Int print_client_message( ThreadId tid, const HChar *format, static void do_client_request ( ThreadId tid ) { - UWord* arg = (UWord*)(CLREQ_ARGS(VG_(threads)[tid].arch)); + UWord* arg = (UWord*)(Addr)(CLREQ_ARGS(VG_(threads)[tid].arch)); UWord req_no = arg[0]; if (0) diff --git a/coregrind/m_signals.c b/coregrind/m_signals.c index a1749e2..e158fe3 100644 --- a/coregrind/m_signals.c +++ b/coregrind/m_signals.c @@ -2778,7 +2778,7 @@ void sync_signalhandler_from_kernel ( ThreadId tid, VG_(dmsg)("si_code=%d; Faulting address: %p; sp: %#lx\n", info->si_code, info->VKI_SIGINFO_si_addr, - VG_UCONTEXT_STACK_PTR(uc)); + (Addr)VG_UCONTEXT_STACK_PTR(uc)); if (0) VG_(kill_self)(sigNo); /* generate a core dump */ @@ -2824,7 +2824,7 @@ void sync_signalhandler ( Int sigNo, VG_(dmsg)("sync signal handler: " "signal=%d, si_code=%d, EIP=%#lx, eip=%#lx, from %s\n", sigNo, info->si_code, VG_(get_IP)(tid), - VG_UCONTEXT_INSTR_PTR(uc), + (Addr)VG_UCONTEXT_INSTR_PTR(uc), ( from_user ? "user" : "kernel" )); } vg_assert(sigNo >= 1 && sigNo <= VG_(max_signal)); diff --git a/coregrind/m_syscall.c b/coregrind/m_syscall.c index 3569948..b341054 100644 --- a/coregrind/m_syscall.c +++ b/coregrind/m_syscall.c @@ -919,9 +919,9 @@ __asm__ ( /* Finally, the generic code. This sends the call to the right helper. */ -SysRes VG_(do_syscall) ( UWord sysno, UWord a1, UWord a2, UWord a3, - UWord a4, UWord a5, UWord a6, - UWord a7, UWord a8 ) +SysRes VG_(do_syscall) ( UWord sysno, RegWord a1, RegWord a2, RegWord a3, + RegWord a4, RegWord a5, RegWord a6, + RegWord a7, RegWord a8 ) { # if defined(VGP_x86_linux) UWord val = do_syscall_WRK(sysno,a1,a2,a3,a4,a5,a6); diff --git a/coregrind/m_syswrap/priv_types_n_macros.h b/coregrind/m_syswrap/priv_types_n_macros.h index 62ad65a..2dd95f6 100644 --- a/coregrind/m_syswrap/priv_types_n_macros.h +++ b/coregrind/m_syswrap/priv_types_n_macros.h @@ -53,14 +53,14 @@ typedef struct SyscallArgs { Word sysno; - UWord arg1; - UWord arg2; - UWord arg3; - UWord arg4; - UWord arg5; - UWord arg6; - UWord arg7; - UWord arg8; + RegWord arg1; + RegWord arg2; + RegWord arg3; + RegWord arg4; + RegWord arg5; + RegWord arg6; + RegWord arg7; + RegWord arg8; } SyscallArgs; @@ -438,7 +438,7 @@ static inline UWord getERR ( SyscallStatus* st ) { /* Tell the tool that the syscall number is being read. */ #define PRRSN \ VG_(tdict).track_pre_reg_read(Vg_CoreSysCall, tid, "(syscallno)", \ - layout->o_sysno, sizeof(UWord)); + layout->o_sysno, sizeof(RegWord)); /* REGISTER PARAMETERS */ @@ -456,7 +456,7 @@ static inline UWord getERR ( SyscallStatus* st ) { #define PRRAn_LE(n,s,t,a) \ do { \ Int here = layout->o_arg##n; \ - vg_assert(sizeof(t) <= sizeof(UWord)); \ + vg_assert(sizeof(t) <= sizeof(RegWord)); \ vg_assert(here >= 0); \ VG_(tdict).track_pre_reg_read( \ Vg_CoreSysCall, tid, s"("#a")", \ @@ -470,16 +470,16 @@ static inline UWord getERR ( SyscallStatus* st ) { since the least significant parts of the guest register are stored in memory at the highest address. */ -#define PRRAn_BE(n,s,t,a) \ - do { \ - Int here = layout->o_arg##n; \ - Int next = layout->o_arg##n + sizeof(UWord); \ - vg_assert(sizeof(t) <= sizeof(UWord)); \ - vg_assert(here >= 0); \ - VG_(tdict).track_pre_reg_read( \ - Vg_CoreSysCall, tid, s"("#a")", \ - next-sizeof(t), sizeof(t) \ - ); \ +#define PRRAn_BE(n,s,t,a) \ + do { \ + Int here = layout->o_arg##n; \ + Int next = layout->o_arg##n + sizeof(RegWord); \ + vg_assert(sizeof(t) <= sizeof(RegWord)); \ + vg_assert(here >= 0); \ + VG_(tdict).track_pre_reg_read( \ + Vg_CoreSysCall, tid, s"("#a")", \ + next-sizeof(t), sizeof(t) \ + ); \ } while (0) #if defined(VG_BIGENDIAN) @@ -507,7 +507,7 @@ static inline UWord getERR ( SyscallStatus* st ) { #define PSRAn_LE(n,s,t,a) \ do { \ Addr here = layout->s_arg##n + VG_(get_SP)(tid); \ - vg_assert(sizeof(t) <= sizeof(UWord)); \ + vg_assert(sizeof(t) <= sizeof(RegWord)); \ VG_(tdict).track_pre_mem_read( \ Vg_CoreSysCallArgInMem, tid, s"("#a")", \ here, sizeof(t) \ @@ -523,9 +523,9 @@ static inline UWord getERR ( SyscallStatus* st ) { #if (defined(VGP_mips32_linux) && defined (_MIPSEB)) #define PSRAn_BE(n,s,t,a) \ do { \ - Addr next = layout->s_arg##n + sizeof(UWord) + \ + Addr next = layout->s_arg##n + sizeof(RegWord) + \ VG_(get_SP)(tid); \ - vg_assert(sizeof(t) <= sizeof(UWord)); \ + vg_assert(sizeof(t) <= sizeof(RegWord)); \ VG_(tdict).track_pre_mem_read( \ Vg_CoreSysCallArgInMem, tid, s"("#a")", \ next-sizeof(t), sizeof(t) \ @@ -534,9 +534,9 @@ static inline UWord getERR ( SyscallStatus* st ) { #else #define PSRAn_BE(n,s,t,a) \ do { \ - Addr next = layout->o_arg##n + sizeof(UWord) + \ + Addr next = layout->o_arg##n + sizeof(RegWord) + \ VG_(threads)[tid].arch.vex.VG_STACK_PTR; \ - vg_assert(sizeof(t) <= sizeof(UWord)); \ + vg_assert(sizeof(t) <= sizeof(RegWord)); \ VG_(tdict).track_pre_mem_read( \ Vg_CoreSysCallArgInMem, tid, s"("#a")", \ next-sizeof(t), sizeof(t) \ diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index 7022316..5bb6f47 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -2472,28 +2472,29 @@ PRE(sys_ni_syscall) PRE(sys_iopl) { - PRINT("sys_iopl ( %lu )", ARG1); + PRINT("sys_iopl ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(long, "iopl", unsigned long, level); } PRE(sys_fsync) { *flags |= SfMayBlock; - PRINT("sys_fsync ( %lu )", ARG1); + PRINT("sys_fsync ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(long, "fsync", unsigned int, fd); } PRE(sys_fdatasync) { *flags |= SfMayBlock; - PRINT("sys_fdatasync ( %lu )", ARG1); + PRINT("sys_fdatasync ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(long, "fdatasync", unsigned int, fd); } PRE(sys_msync) { *flags |= SfMayBlock; - PRINT("sys_msync ( %#lx, %lu, %#lx )", ARG1, ARG2, ARG3); + PRINT("sys_msync ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %#" + FMT_REGWORD "x )", ARG1, ARG2, ARG3); PRE_REG_READ3(long, "msync", unsigned long, start, vki_size_t, length, int, flags); PRE_MEM_READ( "msync(start)", ARG1, ARG2 ); @@ -2514,13 +2515,14 @@ PRE(sys_getpmsg) struct vki_pmsg_strbuf *ctrl; struct vki_pmsg_strbuf *data; *flags |= SfMayBlock; - PRINT("sys_getpmsg ( %ld, %#lx, %#lx, %#lx, %#lx )", SARG1, ARG2, ARG3, - ARG4, ARG5); + PRINT("sys_getpmsg ( %ld, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" + FMT_REGWORD "x, %#" FMT_REGWORD "x )", SARG1, + ARG2, ARG3, ARG4, ARG5); PRE_REG_READ5(int, "getpmsg", int, fd, struct strbuf *, ctrl, struct strbuf *, data, int *, bandp, int *, flagsp); - ctrl = (struct vki_pmsg_strbuf *)ARG2; - data = (struct vki_pmsg_strbuf *)ARG3; + ctrl = (struct vki_pmsg_strbuf *)(Addr)ARG2; + data = (struct vki_pmsg_strbuf *)(Addr)ARG3; if (ctrl && ctrl->maxlen > 0) PRE_MEM_WRITE( "getpmsg(ctrl)", (Addr)ctrl->buf, ctrl->maxlen); if (data && data->maxlen > 0) @@ -2535,8 +2537,8 @@ POST(sys_getpmsg) struct vki_pmsg_strbuf *ctrl; struct vki_pmsg_strbuf *data; vg_assert(SUCCESS); - ctrl = (struct vki_pmsg_strbuf *)ARG2; - data = (struct vki_pmsg_strbuf *)ARG3; + ctrl = (struct vki_pmsg_strbuf *)(Addr)ARG2; + data = (struct vki_pmsg_strbuf *)(Addr)ARG3; if (RES == 0 && ctrl && ctrl->len > 0) { POST_MEM_WRITE( (Addr)ctrl->buf, ctrl->len); } @@ -2551,13 +2553,13 @@ PRE(sys_putpmsg) struct vki_pmsg_strbuf *ctrl; struct vki_pmsg_strbuf *data; *flags |= SfMayBlock; - PRINT("sys_putpmsg ( %ld, %#lx, %#lx, %ld, %ld )", SARG1, ARG2, ARG3, - SARG4, SARG5); + PRINT("sys_putpmsg ( %ld, %#" FMT_REGWORD "x, %#" FMT_REGWORD + "x, %ld, %ld )", SARG1, ARG2, ARG3, SARG4, SARG5); PRE_REG_READ5(int, "putpmsg", int, fd, struct strbuf *, ctrl, struct strbuf *, data, int, band, int, flags); - ctrl = (struct vki_pmsg_strbuf *)ARG2; - data = (struct vki_pmsg_strbuf *)ARG3; + ctrl = (struct vki_pmsg_strbuf *)(Addr)ARG2; + data = (struct vki_pmsg_strbuf *)(Addr)ARG3; if (ctrl && ctrl->len > 0) PRE_MEM_READ( "putpmsg(ctrl)", (Addr)ctrl->buf, ctrl->len); if (data && data->len > 0) @@ -2566,8 +2568,8 @@ PRE(sys_putpmsg) PRE(sys_getitimer) { - struct vki_itimerval *value = (struct vki_itimerval*)ARG2; - PRINT("sys_getitimer ( %ld, %#lx )", SARG1, ARG2); + struct vki_itimerval *value = (struct vki_itimerval*)(Addr)ARG2; + PRINT("sys_getitimer ( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2); PRE_REG_READ2(long, "getitimer", int, which, struct itimerval *, value); PRE_timeval_WRITE( "getitimer(&value->it_interval)", &(value->it_interval)); @@ -2577,7 +2579,7 @@ PRE(sys_getitimer) POST(sys_getitimer) { if (ARG2 != (Addr)NULL) { - struct vki_itimerval *value = (struct vki_itimerval*)ARG2; + struct vki_itimerval *value = (struct vki_itimerval*)(Addr)ARG2; POST_timeval_WRITE( &(value->it_interval) ); POST_timeval_WRITE( &(value->it_value) ); } @@ -2585,19 +2587,20 @@ POST(sys_getitimer) PRE(sys_setitimer) { - PRINT("sys_setitimer ( %ld, %#lx, %#lx )", SARG1, ARG2, ARG3); + PRINT("sys_setitimer ( %ld, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", + SARG1, ARG2, ARG3); PRE_REG_READ3(long, "setitimer", int, which, struct itimerval *, value, struct itimerval *, ovalue); if (ARG2 != (Addr)NULL) { - struct vki_itimerval *value = (struct vki_itimerval*)ARG2; + struct vki_itimerval *value = (struct vki_itimerval*)(Addr)ARG2; PRE_timeval_READ( "setitimer(&value->it_interval)", &(value->it_interval)); PRE_timeval_READ( "setitimer(&value->it_value)", &(value->it_value)); } if (ARG3 != (Addr)NULL) { - struct vki_itimerval *ovalue = (struct vki_itimerval*)ARG3; + struct vki_itimerval *ovalue = (struct vki_itimerval*)(Addr)ARG3; PRE_timeval_WRITE( "setitimer(&ovalue->it_interval)", &(ovalue->it_interval)); PRE_timeval_WRITE( "setitimer(&ovalue->it_value)", @@ -2608,7 +2611,7 @@ PRE(sys_setitimer) POST(sys_setitimer) { if (ARG3 != (Addr)NULL) { - struct vki_itimerval *ovalue = (struct vki_itimerval*)ARG3; + struct vki_itimerval *ovalue = (struct vki_itimerval*)(Addr)ARG3; POST_timeval_WRITE( &(ovalue->it_interval) ); POST_timeval_WRITE( &(ovalue->it_value) ); } @@ -2616,7 +2619,7 @@ POST(sys_setitimer) PRE(sys_chroot) { - PRINT("sys_chroot ( %#lx )", ARG1); + PRINT("sys_chroot ( %#" FMT_REGWORD "x )", ARG1); PRE_REG_READ1(long, "chroot", const char *, path); PRE_MEM_RASCIIZ( "chroot(path)", ARG1 ); } @@ -2624,7 +2627,8 @@ PRE(sys_chroot) PRE(sys_madvise) { *flags |= SfMayBlock; - PRINT("sys_madvise ( %#lx, %lu, %ld )", ARG1, ARG2, SARG3); + PRINT("sys_madvise ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %ld )", + ARG1, ARG2, SARG3); PRE_REG_READ3(long, "madvise", unsigned long, start, vki_size_t, length, int, advice); } @@ -2635,14 +2639,16 @@ PRE(sys_mremap) // Nb: this is different to the glibc version described in the man pages, // which lacks the fifth 'new_address' argument. if (ARG4 & VKI_MREMAP_FIXED) { - PRINT("sys_mremap ( %#lx, %lu, %lu, %#lx, %#lx )", + PRINT("sys_mremap ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" + FMT_REGWORD "u, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1, ARG2, ARG3, ARG4, ARG5); PRE_REG_READ5(unsigned long, "mremap", unsigned long, old_addr, unsigned long, old_size, unsigned long, new_size, unsigned long, flags, unsigned long, new_addr); } else { - PRINT("sys_mremap ( %#lx, %lu, %lu, 0x%lx )", + PRINT("sys_mremap ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" + FMT_REGWORD "u, 0x%" FMT_REGWORD "x )", ARG1, ARG2, ARG3, ARG4); PRE_REG_READ4(unsigned long, "mremap", unsigned long, old_addr, unsigned long, old_size, @@ -2663,21 +2669,21 @@ PRE(sys_nice) PRE(sys_mlock) { *flags |= SfMayBlock; - PRINT("sys_mlock ( %#lx, %lu )", ARG1, ARG2); + PRINT("sys_mlock ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, ARG2); PRE_REG_READ2(long, "mlock", unsigned long, addr, vki_size_t, len); } PRE(sys_munlock) { *flags |= SfMayBlock; - PRINT("sys_munlock ( %#lx, %lu )", ARG1, ARG2); + PRINT("sys_munlock ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", ARG1, ARG2); PRE_REG_READ2(long, "munlock", unsigned long, addr, vki_size_t, len); } PRE(sys_mlockall) { *flags |= SfMayBlock; - PRINT("sys_mlockall ( %lx )", ARG1); + PRINT("sys_mlockall ( %" FMT_REGWORD "x )", ARG1); PRE_REG_READ1(long, "mlockall", int, flags); } @@ -2697,8 +2703,8 @@ PRE(sys_pwrite64) { *flags |= SfMayBlock; #if VG_WORDSIZE == 4 - PRINT("sys_pwrite64 ( %lu, %#lx, %lu, %lld )", - ARG1, ARG2, ARG3, (Long)MERGE64(ARG4,ARG5)); + PRINT("sys_pwrite64 ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" + FMT_REGWORD "u, %lld )", ARG1, ARG2, ARG3, (Long)MERGE64(ARG4,ARG5)); PRE_REG_READ5(ssize_t, "pwrite64", unsigned int, fd, const char *, buf, vki_size_t, count, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset)); @@ -2724,7 +2730,7 @@ PRE(sys_sync) PRE(sys_fstatfs) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_fstatfs ( %lu, %#lx )", ARG1, ARG2); + PRINT("sys_fstatfs ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1, ARG2); PRE_REG_READ2(long, "fstatfs", unsigned int, fd, struct statfs *, buf); PRE_MEM_WRITE( "fstatfs(buf)", ARG2, sizeof(struct vki_statfs) ); @@ -2738,7 +2744,8 @@ POST(sys_fstatfs) PRE(sys_fstatfs64) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_fstatfs64 ( %lu, %lu, %#lx )", ARG1, ARG2, ARG3); + PRINT("sys_fstatfs64 ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %#" + FMT_REGWORD "x )", ARG1, ARG2, ARG3); PRE_REG_READ3(long, "fstatfs64", unsigned int, fd, vki_size_t, size, struct statfs64 *, buf); PRE_MEM_WRITE( "fstatfs64(buf)", ARG3, ARG2 ); @@ -2758,8 +2765,8 @@ PRE(sys_pread64) { *flags |= SfMayBlock; #if VG_WORDSIZE == 4 - PRINT("sys_pread64 ( %lu, %#lx, %lu, %lld )", - ARG1, ARG2, ARG3, (Long)MERGE64(ARG4,ARG5)); + PRINT("sys_pread64 ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" + FMT_REGWORD "u, %lld )", ARG1, ARG2, ARG3, (Long)MERGE64(ARG4,ARG5)); PRE_REG_READ5(ssize_t, "pread64", unsigned int, fd, char *, buf, vki_size_t, count, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset)); @@ -2785,7 +2792,8 @@ POST(sys_pread64) PRE(sys_mknod) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_mknod ( %#lx(%s), %#lx, %#lx )", ARG1, (HChar*)ARG1, ARG2, ARG3 ); + PRINT("sys_mknod ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %#" + FMT_REGWORD "x )", ARG1, (HChar*)(Addr)ARG1, ARG2, ARG3 ); PRE_REG_READ3(long, "mknod", const char *, pathname, int, mode, unsigned, dev); PRE_MEM_RASCIIZ( "mknod(pathname)", ARG1 ); @@ -2794,7 +2802,7 @@ PRE(sys_mknod) PRE(sys_flock) { *flags |= SfMayBlock; - PRINT("sys_flock ( %lu, %lu )", ARG1, ARG2 ); + PRINT("sys_flock ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2 ); PRE_REG_READ2(long, "flock", unsigned int, fd, unsigned int, operation); } @@ -2845,13 +2853,14 @@ PRE(sys_execve) SysRes res; Bool setuid_allowed, trace_this_child; - PRINT("sys_execve ( %#lx(%s), %#lx, %#lx )", ARG1, (HChar*)ARG1, ARG2, ARG3); + PRINT("sys_execve ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %#" + FMT_REGWORD "x )", ARG1, (HChar*)(Addr)ARG1, ARG2, ARG3); PRE_REG_READ3(vki_off_t, "execve", char *, filename, char **, argv, char **, envp); PRE_MEM_RASCIIZ( "execve(filename)", ARG1 ); if (ARG2 != 0) { /* At least the terminating NULL must be addressable. */ - if (!ML_(safe_to_deref)((HChar **) ARG2, sizeof(HChar *))) { + if (!ML_(safe_to_deref)((HChar **) (Addr)ARG2, sizeof(HChar *))) { SET_STATUS_Failure(VKI_EFAULT); return; } @@ -2859,7 +2868,7 @@ PRE(sys_execve) } if (ARG3 != 0) { /* At least the terminating NULL must be addressable. */ - if (!ML_(safe_to_deref)((HChar **) ARG3, sizeof(HChar *))) { + if (!ML_(safe_to_deref)((HChar **) (Addr)ARG3, sizeof(HChar *))) { SET_STATUS_Failure(VKI_EFAULT); return; } @@ -2885,11 +2894,11 @@ PRE(sys_execve) // debug-only printing if (0) { - VG_(printf)("ARG1 = %p(%s)\n", (void*)ARG1, (HChar*)ARG1); + VG_(printf)("ARG1 = %p(%s)\n", (void*)(Addr)ARG1, (HChar*)(Addr)ARG1); if (ARG2) { VG_(printf)("ARG2 = "); Int q; - HChar** vec = (HChar**)ARG2; + HChar** vec = (HChar**)(Addr)ARG2; for (q = 0; vec[q]; q++) VG_(printf)("%p(%s) ", vec[q], vec[q]); VG_(printf)("\n"); @@ -2901,17 +2910,18 @@ PRE(sys_execve) // Decide whether or not we want to follow along { // Make 'child_argv' be a pointer to the child's arg vector // (skipping the exe name) - const HChar** child_argv = (const HChar**)ARG2; + const HChar** child_argv = (const HChar**)(Addr)ARG2; if (child_argv && child_argv[0] == NULL) child_argv = NULL; - trace_this_child = VG_(should_we_trace_this_child)( (HChar*)ARG1, child_argv ); + trace_this_child = VG_(should_we_trace_this_child)( (HChar*)(Addr)ARG1, + child_argv ); } // Do the important checks: it is a file, is executable, permissions are // ok, etc. We allow setuid executables to run only in the case when // we are not simulating them, that is, they to be run natively. setuid_allowed = trace_this_child ? False : True; - res = VG_(pre_exec_check)((const HChar *)ARG1, NULL, setuid_allowed); + res = VG_(pre_exec_check)((const HChar *)(Addr)ARG1, NULL, setuid_allowed); if (sr_isError(res)) { SET_STATUS_Failure( sr_Err(res) ); return; @@ -2928,7 +2938,7 @@ PRE(sys_execve) } /* After this point, we can't recover if the execve fails. */ - VG_(debugLog)(1, "syswrap", "Exec of %s\n", (HChar*)ARG1); + VG_(debugLog)(1, "syswrap", "Exec of %s\n", (HChar*)(Addr)ARG1); // Terminate gdbserver if it is active. @@ -2964,7 +2974,7 @@ PRE(sys_execve) } } else { - path = (HChar*)ARG1; + path = (HChar*)(Addr)ARG1; } // Set up the child's environment. @@ -2981,7 +2991,7 @@ PRE(sys_execve) if (ARG3 == 0) { envp = NULL; } else { - envp = VG_(env_clone)( (HChar**)ARG3 ); + envp = VG_(env_clone)( (HChar**)(Addr)ARG3 ); if (envp == NULL) goto hosed; VG_(env_remove_valgrind_env_stuff)( envp, True /*ro_strings*/, NULL ); } @@ -3000,7 +3010,7 @@ PRE(sys_execve) // are omitted. // if (!trace_this_child) { - argv = (HChar**)ARG2; + argv = (HChar**)(Addr)ARG2; } else { vg_assert( VG_(args_for_valgrind) ); vg_assert( VG_(args_for_valgrind_noexecpass) >= 0 ); @@ -3015,7 +3025,7 @@ PRE(sys_execve) // name of client exe tot_args++; // args for client exe, skipping [0] - arg2copy = (HChar**)ARG2; + arg2copy = (HChar**)(Addr)ARG2; if (arg2copy && arg2copy[0]) { for (i = 1; arg2copy[i]; i++) tot_args++; @@ -3031,7 +3041,7 @@ PRE(sys_execve) continue; argv[j++] = * (HChar**) VG_(indexXA)( VG_(args_for_valgrind), i ); } - argv[j++] = (HChar*)ARG1; + argv[j++] = (HChar*)(Addr)ARG1; if (arg2copy && arg2copy[0]) for (i = 1; arg2copy[i]; i++) argv[j++] = arg2copy[i]; @@ -3103,8 +3113,9 @@ PRE(sys_execve) too much of a mess to continue, so we have to abort. */ hosed: vg_assert(FAILURE); - VG_(message)(Vg_UserMsg, "execve(%#lx(%s), %#lx, %#lx) failed, errno %lu\n", - ARG1, (HChar*)ARG1, ARG2, ARG3, ERR); + VG_(message)(Vg_UserMsg, "execve(%#" FMT_REGWORD "x(%s), %#" FMT_REGWORD + "x, %#" FMT_REGWORD "x) failed, errno %lu\n", + ARG1, (HChar*)(Addr)ARG1, ARG2, ARG3, ERR); VG_(message)(Vg_UserMsg, "EXEC FAILED: I can't recover from " "execve() failing, so I'm dying.\n"); VG_(message)(Vg_UserMsg, "Add more stringent tests in PRE(sys_execve), " @@ -3114,14 +3125,15 @@ PRE(sys_execve) PRE(sys_access) { - PRINT("sys_access ( %#lx(%s), %ld )", ARG1, (HChar*)ARG1, SARG2); + PRINT("sys_access ( %#" FMT_REGWORD "x(%s), %ld )", ARG1, + (HChar*)(Addr)ARG1, SARG2); PRE_REG_READ2(long, "access", const char *, pathname, int, mode); PRE_MEM_RASCIIZ( "access(pathname)", ARG1 ); } PRE(sys_alarm) { - PRINT("sys_alarm ( %lu )", ARG1); + PRINT("sys_alarm ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(unsigned long, "alarm", unsigned int, seconds); } @@ -3145,7 +3157,7 @@ PRE(sys_brk) Both will seg fault if you shrink it back into a text segment. */ - PRINT("sys_brk ( %#lx )", ARG1); + PRINT("sys_brk ( %#" FMT_REGWORD "x )", ARG1); PRE_REG_READ1(unsigned long, "brk", unsigned long, end_data_segment); brk_new = do_brk(ARG1, tid); @@ -3172,7 +3184,7 @@ PRE(sys_brk) PRE(sys_chdir) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_chdir ( %#lx(%s) )", ARG1,(char*)ARG1); + PRINT("sys_chdir ( %#" FMT_REGWORD "x(%s) )", ARG1,(char*)(Addr)ARG1); PRE_REG_READ1(long, "chdir", const char *, path); PRE_MEM_RASCIIZ( "chdir(path)", ARG1 ); } @@ -3180,7 +3192,8 @@ PRE(sys_chdir) PRE(sys_chmod) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_chmod ( %#lx(%s), %lu )", ARG1, (HChar*)ARG1, ARG2); + PRINT("sys_chmod ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", ARG1, + (HChar*)(Addr)ARG1, ARG2); PRE_REG_READ2(long, "chmod", const char *, path, vki_mode_t, mode); PRE_MEM_RASCIIZ( "chmod(path)", ARG1 ); } @@ -3188,7 +3201,8 @@ PRE(sys_chmod) PRE(sys_chown) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_chown ( %#lx(%s), 0x%lx, 0x%lx )", ARG1,(char*)ARG1,ARG2,ARG3); + PRINT("sys_chown ( %#" FMT_REGWORD "x(%s), 0x%" FMT_REGWORD "x, 0x%" + FMT_REGWORD "x )", ARG1,(char*)(Addr)ARG1,ARG2,ARG3); PRE_REG_READ3(long, "chown", const char *, path, vki_uid_t, owner, vki_gid_t, group); PRE_MEM_RASCIIZ( "chown(path)", ARG1 ); @@ -3197,7 +3211,8 @@ PRE(sys_chown) PRE(sys_lchown) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_lchown ( %#lx(%s), 0x%lx, 0x%lx )", ARG1,(char*)ARG1,ARG2,ARG3); + PRINT("sys_lchown ( %#" FMT_REGWORD "x(%s), 0x%" FMT_REGWORD "x, 0x%" + FMT_REGWORD "x )", ARG1,(char*)(Addr)ARG1,ARG2,ARG3); PRE_REG_READ3(long, "lchown", const char *, path, vki_uid_t, owner, vki_gid_t, group); PRE_MEM_RASCIIZ( "lchown(path)", ARG1 ); @@ -3206,7 +3221,7 @@ PRE(sys_lchown) PRE(sys_close) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_close ( %lu )", ARG1); + PRINT("sys_close ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(long, "close", unsigned int, fd); /* Detect and negate attempts by the client to close Valgrind's log fd */ @@ -3224,7 +3239,7 @@ POST(sys_close) PRE(sys_dup) { - PRINT("sys_dup ( %lu )", ARG1); + PRINT("sys_dup ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(long, "dup", unsigned int, oldfd); } @@ -3242,7 +3257,7 @@ POST(sys_dup) PRE(sys_dup2) { - PRINT("sys_dup2 ( %lu, %lu )", ARG1, ARG2); + PRINT("sys_dup2 ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2); PRE_REG_READ2(long, "dup2", unsigned int, oldfd, unsigned int, newfd); if (!ML_(fd_allowed)(ARG2, "dup2", tid, True)) SET_STATUS_Failure( VKI_EBADF ); @@ -3258,14 +3273,15 @@ POST(sys_dup2) PRE(sys_fchdir) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_fchdir ( %lu )", ARG1); + PRINT("sys_fchdir ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(long, "fchdir", unsigned int, fd); } PRE(sys_fchown) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_fchown ( %lu, %lu, %lu )", ARG1, ARG2, ARG3); + PRINT("sys_fchown ( %" FMT_REGWORD "u, %" FMT_REGWORD "u, %" + FMT_REGWORD "u )", ARG1, ARG2, ARG3); PRE_REG_READ3(long, "fchown", unsigned int, fd, vki_uid_t, owner, vki_gid_t, group); } @@ -3273,14 +3289,14 @@ PRE(sys_fchown) PRE(sys_fchmod) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_fchmod ( %lu, %lu )", ARG1, ARG2); + PRINT("sys_fchmod ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2); PRE_REG_READ2(long, "fchmod", unsigned int, fildes, vki_mode_t, mode); } PRE(sys_newfstat) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_newfstat ( %lu, %#lx )", ARG1, ARG2); + PRINT("sys_newfstat ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1, ARG2); PRE_REG_READ2(long, "fstat", unsigned int, fd, struct stat *, buf); PRE_MEM_WRITE( "fstat(buf)", ARG2, sizeof(struct vki_stat) ); } @@ -3346,14 +3362,15 @@ PRE(sys_fork) PRE(sys_ftruncate) { *flags |= SfMayBlock; - PRINT("sys_ftruncate ( %lu, %lu )", ARG1, ARG2); + PRINT("sys_ftruncate ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2); PRE_REG_READ2(long, "ftruncate", unsigned int, fd, unsigned long, length); } PRE(sys_truncate) { *flags |= SfMayBlock; - PRINT("sys_truncate ( %#lx(%s), %lu )", ARG1, (HChar*)ARG1, ARG2); + PRINT("sys_truncate ( %#" FMT_REGWORD "x(%s), %" FMT_REGWORD "u )", + ARG1, (HChar*)(Addr)ARG1, ARG2); PRE_REG_READ2(long, "truncate", const char *, path, unsigned long, length); PRE_MEM_RASCIIZ( "truncate(path)", ARG1 ); @@ -3363,7 +3380,8 @@ PRE(sys_ftruncate64) { *flags |= SfMayBlock; #if VG_WORDSIZE == 4 - PRINT("sys_ftruncate64 ( %lu, %llu )", ARG1, MERGE64(ARG2,ARG3)); + PRINT("sys_ftruncate64 ( %" FMT_REGWORD "u, %llu )", ARG1, + MERGE64(ARG2,ARG3)); PRE_REG_READ3(long, "ftruncate64", unsigned int, fd, UWord, MERGE64_FIRST(length), UWord, MERGE64_SECOND(length)); @@ -3378,7 +3396,8 @@ PRE(sys_truncate64) { *flags |= SfMayBlock; #if VG_WORDSIZE == 4 - PRINT("sys_truncate64 ( %#lx, %lld )", ARG1, (Long)MERGE64(ARG2, ARG3)); + PRINT("sys_truncate64 ( %#" FMT_REGWORD "x, %lld )", ARG1, + (Long)MERGE64(ARG2, ARG3)); PRE_REG_READ3(long, "truncate64", const char *, path, UWord, MERGE64_FIRST(length), UWord, MERGE64_SECOND(length)); @@ -3393,7 +3412,8 @@ PRE(sys_truncate64) PRE(sys_getdents) { *flags |= SfMayBlock; - PRINT("sys_getdents ( %lu, %#lx, %lu )", ARG1, ARG2, ARG3); + PRINT("sys_getdents ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD + "u )", ARG1, ARG2, ARG3); PRE_REG_READ3(long, "getdents", unsigned int, fd, struct vki_dirent *, dirp, unsigned int, count); @@ -3410,7 +3430,8 @@ POST(sys_getdents) PRE(sys_getdents64) { *flags |= SfMayBlock; - PRINT("sys_getdents64 ( %lu, %#lx, %lu )",ARG1, ARG2, ARG3); + PRINT("sys_getdents64 ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" + FMT_REGWORD "u )",ARG1, ARG2, ARG3); PRE_REG_READ3(long, "getdents64", unsigned int, fd, struct vki_dirent64 *, dirp, unsigned int, count); @@ -3426,7 +3447,7 @@ POST(sys_getdents64) PRE(sys_getgroups) { - PRINT("sys_getgroups ( %ld, %#lx )", SARG1, ARG2); + PRINT("sys_getgroups ( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2); PRE_REG_READ2(long, "getgroups", int, size, vki_gid_t *, list); if (ARG1 > 0) PRE_MEM_WRITE( "getgroups(list)", ARG2, ARG1 * sizeof(vki_gid_t) ); @@ -3447,7 +3468,7 @@ PRE(sys_getcwd) // (which includes the ending '\0' character), or a negative error // value. // Is this Linux-specific? If so it should be moved to syswrap-linux.c. - PRINT("sys_getcwd ( %#lx, %llu )", ARG1,(ULong)ARG2); + PRINT("sys_getcwd ( %#" FMT_REGWORD "x, %llu )", ARG1,(ULong)ARG2); PRE_REG_READ2(long, "getcwd", char *, buf, unsigned long, size); PRE_MEM_WRITE( "getcwd(buf)", ARG1, ARG2 ); } @@ -3529,7 +3550,8 @@ static void common_post_getrlimit(ThreadId tid, UWord a1, UWord a2) PRE(sys_old_getrlimit) { - PRINT("sys_old_getrlimit ( %lu, %#lx )", ARG1, ARG2); + PRINT("sys_old_getrlimit ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", + ARG1, ARG2); PRE_REG_READ2(long, "old_getrlimit", unsigned int, resource, struct rlimit *, rlim); PRE_MEM_WRITE( "old_getrlimit(rlim)", ARG2, sizeof(struct vki_rlimit) ); @@ -3542,7 +3564,7 @@ POST(sys_old_getrlimit) PRE(sys_getrlimit) { - PRINT("sys_getrlimit ( %lu, %#lx )", ARG1, ARG2); + PRINT("sys_getrlimit ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1, ARG2); PRE_REG_READ2(long, "getrlimit", unsigned int, resource, struct rlimit *, rlim); PRE_MEM_WRITE( "getrlimit(rlim)", ARG2, sizeof(struct vki_rlimit) ); @@ -3555,7 +3577,7 @@ POST(sys_getrlimit) PRE(sys_getrusage) { - PRINT("sys_getrusage ( %ld, %#lx )", SARG1, ARG2); + PRINT("sys_getrusage ( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2); PRE_REG_READ2(long, "getrusage", int, who, struct rusage *, usage); PRE_MEM_WRITE( "getrusage(usage)", ARG2, sizeof(struct vki_rusage) ); } @@ -3569,12 +3591,13 @@ POST(sys_getrusage) PRE(sys_gettimeofday) { - PRINT("sys_gettimeofday ( %#lx, %#lx )", ARG1,ARG2); + PRINT("sys_gettimeofday ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", + ARG1,ARG2); PRE_REG_READ2(long, "gettimeofday", struct timeval *, tv, struct timezone *, tz); // GrP fixme does darwin write to *tz anymore? if (ARG1 != 0) - PRE_timeval_WRITE( "gettimeofday(tv)", ARG1 ); + PRE_timeval_WRITE( "gettimeofday(tv)", (Addr)ARG1 ); if (ARG2 != 0) PRE_MEM_WRITE( "gettimeofday(tz)", ARG2, sizeof(struct vki_timezone) ); } @@ -3584,7 +3607,7 @@ POST(sys_gettimeofday) vg_assert(SUCCESS); if (RES == 0) { if (ARG1 != 0) - POST_timeval_WRITE( ARG1 ); + POST_timeval_WRITE( (Addr)ARG1 ); if (ARG2 != 0) POST_MEM_WRITE( ARG2, sizeof(struct vki_timezone) ); } @@ -3592,11 +3615,12 @@ POST(sys_gettimeofday) PRE(sys_settimeofday) { - PRINT("sys_settimeofday ( %#lx, %#lx )", ARG1,ARG2); + PRINT("sys_settimeofday ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", + ARG1,ARG2); PRE_REG_READ2(long, "settimeofday", struct timeval *, tv, struct timezone *, tz); if (ARG1 != 0) - PRE_timeval_READ( "settimeofday(tv)", ARG1 ); + PRE_timeval_READ( "settimeofday(tv)", (Addr)ARG1 ); if (ARG2 != 0) { PRE_MEM_READ( "settimeofday(tz)", ARG2, sizeof(struct vki_timezone) ); /* maybe should warn if tz->tz_dsttime is non-zero? */ @@ -3774,7 +3798,8 @@ PRE(sys_kill) PRE(sys_link) { *flags |= SfMayBlock; - PRINT("sys_link ( %#lx(%s), %#lx(%s) )", ARG1,(char*)ARG1,ARG2,(char*)ARG2); + PRINT("sys_link ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x(%s) )", ARG1, + (char*)(Addr)ARG1,ARG2,(char*)(Addr)ARG2); PRE_REG_READ2(long, "link", const char *, oldpath, const char *, newpath); PRE_MEM_RASCIIZ( "link(oldpath)", ARG1); PRE_MEM_RASCIIZ( "link(newpath)", ARG2); @@ -3782,7 +3807,8 @@ PRE(sys_link) PRE(sys_newlstat) { - PRINT("sys_newlstat ( %#lx(%s), %#lx )", ARG1,(char*)ARG1,ARG2); + PRINT("sys_newlstat ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )", ARG1, + (char*)(Addr)ARG1,ARG2); PRE_REG_READ2(long, "lstat", char *, file_name, struct stat *, buf); PRE_MEM_RASCIIZ( "lstat(file_name)", ARG1 ); PRE_MEM_WRITE( "lstat(buf)", ARG2, sizeof(struct vki_stat) ); @@ -3797,14 +3823,16 @@ POST(sys_newlstat) PRE(sys_mkdir) { *flags |= SfMayBlock; - PRINT("sys_mkdir ( %#lx(%s), %ld )", ARG1, (HChar*)ARG1, SARG2); + PRINT("sys_mkdir ( %#" FMT_REGWORD "x(%s), %ld )", ARG1, + (HChar*)(Addr)ARG1, SARG2); PRE_REG_READ2(long, "mkdir", const char *, pathname, int, mode); PRE_MEM_RASCIIZ( "mkdir(pathname)", ARG1 ); } PRE(sys_mprotect) { - PRINT("sys_mprotect ( %#lx, %lu, %lu )", ARG1, ARG2, ARG3); + PRINT("sys_mprotect ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %" + FMT_REGWORD "u )", ARG1, ARG2, ARG3); PRE_REG_READ3(long, "mprotect", unsigned long, addr, vki_size_t, len, unsigned long, prot); @@ -3877,8 +3905,8 @@ POST(sys_mprotect) PRE(sys_munmap) { - if (0) VG_(printf)(" munmap( %#lx )\n", ARG1); - PRINT("sys_munmap ( %#lx, %llu )", ARG1,(ULong)ARG2); + if (0) VG_(printf)(" munmap( %#" FMT_REGWORD "x )\n", ARG1); + PRINT("sys_munmap ( %#" FMT_REGWORD "x, %llu )", ARG1,(ULong)ARG2); PRE_REG_READ2(long, "munmap", unsigned long, start, vki_size_t, length); if (!ML_(valid_client_addr)(ARG1, ARG2, tid, "munmap")) @@ -3895,7 +3923,8 @@ POST(sys_munmap) PRE(sys_mincore) { - PRINT("sys_mincore ( %#lx, %llu, %#lx )", ARG1,(ULong)ARG2,ARG3); + PRINT("sys_mincore ( %#" FMT_REGWORD "x, %llu, %#" FMT_REGWORD "x )", + ARG1, (ULong)ARG2, ARG3); PRE_REG_READ3(long, "mincore", unsigned long, start, vki_size_t, length, unsigned char *, vec); @@ -3909,7 +3938,7 @@ POST(sys_mincore) PRE(sys_nanosleep) { *flags |= SfMayBlock|SfPostOnFail; - PRINT("sys_nanosleep ( %#lx, %#lx )", ARG1,ARG2); + PRINT("sys_nanosleep ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1,ARG2); PRE_REG_READ2(long, "nanosleep", struct timespec *, req, struct timespec *, rem); PRE_MEM_READ( "nanosleep(req)", ARG1, sizeof(struct vki_timespec) ); @@ -3971,12 +4000,14 @@ PRE(sys_open) { if (ARG2 & VKI_O_CREAT) { // 3-arg version - PRINT("sys_open ( %#lx(%s), %ld, %ld )",ARG1, (HChar*)ARG1, SARG2, SARG3); + PRINT("sys_open ( %#" FMT_REGWORD "x(%s), %ld, %ld )",ARG1, + (HChar*)(Addr)ARG1, SARG2, SARG3); PRE_REG_READ3(long, "open", const char *, filename, int, flags, int, mode); } else { // 2-arg version - PRINT("sys_open ( %#lx(%s), %ld )",ARG1, (HChar*)ARG1, SARG2); + PRINT("sys_open ( %#" FMT_REGWORD "x(%s), %ld )",ARG1, + (HChar*)(Addr)ARG1, SARG2); PRE_REG_READ2(long, "open", const char *, filename, int, flags); } @@ -3989,7 +4020,7 @@ PRE(sys_open) cloned fd back to the start. */ { HChar name[30]; // large enough - HChar* arg1s = (HChar*) ARG1; + HChar* arg1s = (HChar*) (Addr)ARG1; SysRes sres; VG_(sprintf)(name, "/proc/%d/cmdline", VG_(getpid)()); @@ -4007,7 +4038,7 @@ PRE(sys_open) } /* Handle also the case of /proc/self/auxv or /proc/<pid>/auxv. */ - if (ML_(handle_auxv_open)(status, (const HChar *)ARG1, ARG2)) + if (ML_(handle_auxv_open)(status, (const HChar *)(Addr)ARG1, ARG2)) return; #endif // defined(VGO_linux) @@ -4023,14 +4054,15 @@ POST(sys_open) SET_STATUS_Failure( VKI_EMFILE ); } else { if (VG_(clo_track_fds)) - ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG1); + ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)(Addr)ARG1); } } PRE(sys_read) { *flags |= SfMayBlock; - PRINT("sys_read ( %lu, %#lx, %lu )", ARG1, ARG2, ARG3); + PRINT("sys_read ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" + FMT_REGWORD "u )", ARG1, ARG2, ARG3); PRE_REG_READ3(ssize_t, "read", unsigned int, fd, char *, buf, vki_size_t, count); @@ -4050,7 +4082,8 @@ PRE(sys_write) { Bool ok; *flags |= SfMayBlock; - PRINT("sys_write ( %lu, %#lx, %lu )", ARG1, ARG2, ARG3); + PRINT("sys_write ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" + FMT_REGWORD "u )", ARG1, ARG2, ARG3); PRE_REG_READ3(ssize_t, "write", unsigned int, fd, const char *, buf, vki_size_t, count); /* check to see if it is allowed. If not, try for an exemption from @@ -4073,7 +4106,8 @@ PRE(sys_write) PRE(sys_creat) { *flags |= SfMayBlock; - PRINT("sys_creat ( %#lx(%s), %ld )", ARG1, (HChar*)ARG1, SARG2); + PRINT("sys_creat ( %#" FMT_REGWORD "x(%s), %ld )", ARG1, + (HChar*)(Addr)ARG1, SARG2); PRE_REG_READ2(long, "creat", const char *, pathname, int, mode); PRE_MEM_RASCIIZ( "creat(pathname)", ARG1 ); } @@ -4086,7 +4120,7 @@ POST(sys_creat) SET_STATUS_Failure( VKI_EMFILE ); } else { if (VG_(clo_track_fds)) - ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG1); + ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)(Addr)ARG1); } } @@ -4100,9 +4134,10 @@ PRE(sys_poll) int poll(struct pollfd *ufds, unsigned int nfds, int timeout) */ UInt i; - struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1; + struct vki_pollfd* ufds = (struct vki_pollfd *)(Addr)ARG1; *flags |= SfMayBlock; - PRINT("sys_poll ( %#lx, %lu, %ld )\n", ARG1, ARG2, SARG3); + PRINT("sys_poll ( %#" FMT_REGWORD "x, %" FMT_REGWORD "u, %ld )\n", + ARG1, ARG2, SARG3); PRE_REG_READ3(long, "poll", struct vki_pollfd *, ufds, unsigned int, nfds, long, timeout); @@ -4120,7 +4155,7 @@ POST(sys_poll) { if (RES >= 0) { UInt i; - struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1; + struct vki_pollfd* ufds = (struct vki_pollfd *)(Addr)ARG1; for (i = 0; i < ARG2; i++) POST_MEM_WRITE( (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) ); } @@ -4131,7 +4166,8 @@ PRE(sys_readlink) FUSE_COMPATIBLE_MAY_BLOCK(); Word saved = SYSNO; - PRINT("sys_readlink ( %#lx(%s), %#lx, %llu )", ARG1,(char*)ARG1,ARG2,(ULong)ARG3); + PRINT("sys_readlink ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %llu )", + ARG1, (char*)(Addr)ARG1, ARG2, (ULong)ARG3); PRE_REG_READ3(long, "readlink", const char *, path, char *, buf, int, bufsiz); PRE_MEM_RASCIIZ( "readlink(path)", ARG1 ); @@ -4154,7 +4190,7 @@ PRE(sys_readlink) * /proc/<pid>/exe, or equivalent on Solaris. */ HChar name[30]; // large enough - HChar* arg1s = (HChar*) ARG1; + HChar* arg1s = (HChar*) (Addr)ARG1; VG_(sprintf)(name, PID_EXEPATH, VG_(getpid)()); if (ML_(safe_to_deref)(arg1s, 1) && (VG_STREQ(arg1s, name) || VG_STREQ(arg1s, SELF_EXEPATH))) { @@ -4178,7 +4214,8 @@ PRE(sys_readv) Int i; struct vki_iovec * vec; *flags |= SfMayBlock; - PRINT("sys_readv ( %lu, %#lx, %lu )", ARG1, ARG2, ARG3); + PRINT("sys_readv ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" + FMT_REGWORD "u )", ARG1, ARG2, ARG3); PRE_REG_READ3(ssize_t, "readv", unsigned long, fd, const struct iovec *, vector, unsigned long, count); @@ -4190,7 +4227,7 @@ PRE(sys_readv) if (ARG2 != 0) { /* ToDo: don't do any of the following if the vector is invalid */ - vec = (struct vki_iovec *)ARG2; + vec = (struct vki_iovec *)(Addr)ARG2; for (i = 0; i < (Int)ARG3; i++) PRE_MEM_WRITE( "readv(vector[...])", (Addr)vec[i].iov_base, vec[i].iov_len ); @@ -4203,7 +4240,7 @@ POST(sys_readv) vg_assert(SUCCESS); if (RES > 0) { Int i; - struct vki_iovec * vec = (struct vki_iovec *)ARG2; + struct vki_iovec * vec = (struct vki_iovec *)(Addr)ARG2; Int remains = RES; /* RES holds the number of bytes read. */ @@ -4220,7 +4257,8 @@ POST(sys_readv) PRE(sys_rename) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_rename ( %#lx(%s), %#lx(%s) )", ARG1,(char*)ARG1,ARG2,(char*)ARG2); + PRINT("sys_rename ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x(%s) )", ARG1, + (char*)(Addr)ARG1,ARG2,(char*)(Addr)ARG2); PRE_REG_READ2(long, "rename", const char *, oldpath, const char *, newpath); PRE_MEM_RASCIIZ( "rename(oldpath)", ARG1 ); PRE_MEM_RASCIIZ( "rename(newpath)", ARG2 ); @@ -4229,7 +4267,7 @@ PRE(sys_rename) PRE(sys_rmdir) { *flags |= SfMayBlock; - PRINT("sys_rmdir ( %#lx(%s) )", ARG1,(char*)ARG1); + PRINT("sys_rmdir ( %#" FMT_REGWORD "x(%s) )", ARG1,(char*)(Addr)ARG1); PRE_REG_READ1(long, "rmdir", const char *, pathname); PRE_MEM_RASCIIZ( "rmdir(pathname)", ARG1 ); } @@ -4237,8 +4275,8 @@ PRE(sys_rmdir) PRE(sys_select) { *flags |= SfMayBlock; - PRINT("sys_select ( %ld, %#lx, %#lx, %#lx, %#lx )", SARG1, ARG2, ARG3, - ARG4, ARG5); + PRINT("sys_select ( %ld, %#" FMT_REGWORD "x, %#" FMT_REGWORD "x, %#" + FMT_REGWORD "x, %#" FMT_REGWORD "x )", SARG1, ARG2, ARG3, ARG4, ARG5); PRE_REG_READ5(long, "select", int, n, vki_fd_set *, readfds, vki_fd_set *, writefds, vki_fd_set *, exceptfds, struct vki_timeval *, timeout); @@ -4253,12 +4291,12 @@ PRE(sys_select) PRE_MEM_READ( "select(exceptfds)", ARG4, ARG1/8 /* __FD_SETSIZE/8 */ ); if (ARG5 != 0) - PRE_timeval_READ( "select(timeout)", ARG5 ); + PRE_timeval_READ( "select(timeout)", (Addr)ARG5 ); } PRE(sys_setgid) { - PRINT("sys_setgid ( %lu )", ARG1); + PRINT("sys_setgid ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(long, "setgid", vki_gid_t, gid); } @@ -4270,7 +4308,7 @@ PRE(sys_setsid) PRE(sys_setgroups) { - PRINT("setgroups ( %llu, %#lx )", (ULong)ARG1, ARG2); + PRINT("setgroups ( %llu, %#" FMT_REGWORD "x )", (ULong)ARG1, ARG2); PRE_REG_READ2(long, "setgroups", int, size, vki_gid_t *, list); if (ARG1 > 0) PRE_MEM_READ( "setgroups(list)", ARG2, ARG1 * sizeof(vki_gid_t) ); @@ -4284,20 +4322,21 @@ PRE(sys_setpgid) PRE(sys_setregid) { - PRINT("sys_setregid ( %lu, %lu )", ARG1, ARG2); + PRINT("sys_setregid ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2); PRE_REG_READ2(long, "setregid", vki_gid_t, rgid, vki_gid_t, egid); } PRE(sys_setreuid) { - PRINT("sys_setreuid ( 0x%lx, 0x%lx )", ARG1, ARG2); + PRINT("sys_setreuid ( 0x%" FMT_REGWORD "x, 0x%" FMT_REGWORD "x )", + ARG1, ARG2); PRE_REG_READ2(long, "setreuid", vki_uid_t, ruid, vki_uid_t, euid); } PRE(sys_setrlimit) { UWord arg1 = ARG1; - PRINT("sys_setrlimit ( %lu, %#lx )", ARG1, ARG2); + PRINT("sys_setrlimit ( %" FMT_REGWORD "u, %#" FMT_REGWORD "x )", ARG1, ARG2); PRE_REG_READ2(long, "setrlimit", unsigned int, resource, struct rlimit *, rlim); PRE_MEM_READ( "setrlimit(rlim)", ARG2, sizeof(struct vki_rlimit) ); @@ -4312,33 +4351,37 @@ PRE(sys_setrlimit) VKI_PROT_READ)) { SET_STATUS_Failure( VKI_EFAULT ); } - else if (((struct vki_rlimit *)ARG2)->rlim_cur - > ((struct vki_rlimit *)ARG2)->rlim_max) { + else if (((struct vki_rlimit *)(Addr)ARG2)->rlim_cur + > ((struct vki_rlimit *)(Addr)ARG2)->rlim_max) { SET_STATUS_Failure( VKI_EINVAL ); } else if (arg1 == VKI_RLIMIT_NOFILE) { - if (((struct vki_rlimit *)ARG2)->rlim_cur > VG_(fd_hard_limit) || - ((struct vki_rlimit *)ARG2)->rlim_max != VG_(fd_hard_limit)) { + if (((struct vki_rlimit *)(Addr)ARG2)->rlim_cur > VG_(fd_hard_limit) || + ((struct vki_rlimit *)(Addr)ARG2)->rlim_max != VG_(fd_hard_limit)) { SET_STATUS_Failure( VKI_EPERM ); } else { - VG_(fd_soft_limit) = ((struct vki_rlimit *)ARG2)->rlim_cur; + VG_(fd_soft_limit) = ((struct vki_rlimit *)(Addr)ARG2)->rlim_cur; SET_STATUS_Success( 0 ); } } else if (arg1 == VKI_RLIMIT_DATA) { - if (((struct vki_rlimit *)ARG2)->rlim_cur > VG_(client_rlimit_data).rlim_max || - ((struct vki_rlimit *)ARG2)->rlim_max > VG_(client_rlimit_data).rlim_max) { + if (((struct vki_rlimit *)(Addr)ARG2)->rlim_cur + > VG_(client_rlimit_data).rlim_max || + ((struct vki_rlimit *)(Addr)ARG2)->rlim_max + > VG_(client_rlimit_data).rlim_max) { SET_STATUS_Failure( VKI_EPERM ); } else { - VG_(client_rlimit_data) = *(struct vki_rlimit *)ARG2; + VG_(client_rlimit_data) = *(struct vki_rlimit *)(Addr)ARG2; SET_STATUS_Success( 0 ); } } else if (arg1 == VKI_RLIMIT_STACK && tid == 1) { - if (((struct vki_rlimit *)ARG2)->rlim_cur > VG_(client_rlimit_stack).rlim_max || - ((struct vki_rlimit *)ARG2)->rlim_max > VG_(client_rlimit_stack).rlim_max) { + if (((struct vki_rlimit *)(Addr)ARG2)->rlim_cur + > VG_(client_rlimit_stack).rlim_max || + ((struct vki_rlimit *)(Addr)ARG2)->rlim_max + > VG_(client_rlimit_stack).rlim_max) { SET_STATUS_Failure( VKI_EPERM ); } else { @@ -4348,10 +4391,10 @@ PRE(sys_setrlimit) TODO: All platforms should set VG_(clstk_max_size) as part of their setup_client_stack(). */ if ((VG_(clstk_max_size) == 0) - || (((struct vki_rlimit *) ARG2)->rlim_cur <= VG_(clstk_max_size))) - VG_(threads)[tid].client_stack_szB = ((struct vki_rlimit *)ARG2)->rlim_cur; + || (((struct vki_rlimit *) (Addr)ARG2)->rlim_cur <= VG_(clstk_max_size))) + VG_(threads)[tid].client_stack_szB = ((struct vki_rlimit *)(Addr)ARG2)->rlim_cur; - VG_(client_rlimit_stack) = *(struct vki_rlimit *)ARG2; + VG_(client_rlimit_stack) = *(struct vki_rlimit *)(Addr)ARG2; SET_STATUS_Success( 0 ); } } @@ -4359,14 +4402,15 @@ PRE(sys_setrlimit) PRE(sys_setuid) { - PRINT("sys_setuid ( %lu )", ARG1); + PRINT("sys_setuid ( %" FMT_REGWORD "u )", ARG1); PRE_REG_READ1(long, "setuid", vki_uid_t, uid); } PRE(sys_newstat) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_newstat ( %#lx(%s), %#lx )", ARG1,(char*)ARG1,ARG2); + PRINT("sys_newstat ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )", + ARG1,(char*)(Addr)ARG1,ARG2); PRE_REG_READ2(long, "stat", char *, file_name, struct stat *, buf); PRE_MEM_RASCIIZ( "stat(file_name)", ARG1 ); PRE_MEM_WRITE( "stat(buf)", ARG2, sizeof(struct vki_stat) ); @@ -4380,7 +4424,8 @@ POST(sys_newstat) PRE(sys_statfs) { FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_statfs ( %#lx(%s), %#lx )",ARG1,(char*)ARG1,ARG2); + PRINT("sys_statfs ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x )", + ARG1, (char*)(Addr)ARG1, ARG2); PRE_REG_READ2(long, "statfs", const char *, path, struct statfs *, buf); PRE_MEM_RASCIIZ( "statfs(path)", ARG1 ); PRE_MEM_WRITE( "statfs(buf)", ARG2, sizeof(struct vki_statfs) ); @@ -4392,7 +4437,8 @@ POST(sys_statfs) PRE(sys_statfs64) { - PRINT("sys_statfs64 ( %#lx(%s), %llu, %#lx )",ARG1,(char*)ARG1,(ULong)ARG2,ARG3); + PRINT("sys_statfs64 ( %#" FMT_REGWORD "x(%s), %llu, %#" FMT_REGWORD "x )", + ARG1, (char*)(Addr)ARG1, (ULong)ARG2, ARG3); PRE_REG_READ3(long, "statfs64", const char *, path, vki_size_t, size, struct statfs64 *, buf); PRE_MEM_RASCIIZ( "statfs64(path)", ARG1 ); @@ -4406,7 +4452,8 @@ POST(sys_statfs64) PRE(sys_symlink) { *flags |= SfMayBlock; - PRINT("sys_symlink ( %#lx(%s), %#lx(%s) )",ARG1,(char*)ARG1,ARG2,(char*)ARG2); + PRINT("sys_symlink ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x(%s) )", + ARG1, (char*)(Addr)ARG1, ARG2, (char*)(Addr)ARG2); PRE_REG_READ2(long, "symlink", const char *, oldpath, const char *, newpath); PRE_MEM_RASCIIZ( "symlink(oldpath)", ARG1 ); PRE_MEM_RASCIIZ( "symlink(newpath)", ARG2 ); @@ -4415,7 +4462,7 @@ PRE(sys_symlink) PRE(sys_time) { /* time_t time(time_t *t); */ - PRINT("sys_time ( %#lx )",ARG1); + PRINT("sys_time ( %#" FMT_REGWORD "x )",ARG1); PRE_REG_READ1(long, "time", int *, t); if (ARG1 != 0) { PRE_MEM_WRITE( "time(t)", ARG1, sizeof(vki_time_t) ); @@ -4431,7 +4478,7 @@ POST(sys_time) PRE(sys_times) { - PRINT("sys_times ( %#lx )", ARG1); + PRINT("sys_times ( %#" FMT_REGWORD "x )", ARG1); PRE_REG_READ1(long, "times", struct tms *, buf); if (ARG1 != 0) { PRE_MEM_WRITE( "times(buf)", ARG1, sizeof(struct vki_tms) ); @@ -4454,14 +4501,14 @@ PRE(sys_umask) PRE(sys_unlink) { *flags |= SfMayBlock; - PRINT("sys_unlink ( %#lx(%s) )", ARG1,(char*)ARG1); + PRINT("sys_unlink ( %#" FMT_REGWORD "x(%s) )", ARG1,(char*)(Addr)ARG1); PRE_REG_READ1(long, "unlink", const char *, pathname); PRE_MEM_RASCIIZ( "unlink(pathname)", ARG1 ); } PRE(sys_newuname) { - PRINT("sys_newuname ( %#lx )", ARG1); + PRINT("sys_newuname ( %#" FMT_REGWORD "x )", ARG1); PRE_REG_READ1(long, "uname", struct new_utsname *, buf); PR... [truncated message content] |
|
From: John R. <jr...@bi...> - 2018-04-10 15:12:36
|
> Introduce RegWord type
> On mips n32 size of long is 32 bits and register width is 64 bits.
> Valgrind is written with assumption that long size matches register
> width. This is the reason why both UWord for Valgrind and HWord for VEX
> match size of long. Long size differs from register size on mips n32 ABI.
>
> Introducing RegWord type that will match size of registers.
Why are there not separate RegWord for Host (HRegWord) and User (URegWord),
particularly in the system call wrapper functions? Why are there no problems
when a 32-bit host valgrinds execution for a 64-bit target?
+ PRINT("sys_getcwd ( %#" FMT_REGWORD "x, %llu )", ARG1,(ULong)ARG2);
Why is there not a FMT_ULong? On its face "llu" says "long long unsigned"
with two 'long', but "ULong" says only one 'long'.
|
|
From: Petar J. <mip...@gm...> - 2018-04-11 12:46:53
|
On Tue, Apr 10, 2018 at 5:12 PM, John Reiser <jr...@bi...> wrote:
> Why are there not separate RegWord for Host (HRegWord) and User (URegWord),
> particularly in the system call wrapper functions? Why are there no
> problems
> when a 32-bit host valgrinds execution for a 64-bit target?
>
Valgrind tools are built for targets they emulate, i.e. 32-bit Valgrind
tool executes 32-bit program.
>
> + PRINT("sys_getcwd ( %#" FMT_REGWORD "x, %llu )", ARG1,(ULong)ARG2);
>
> Why is there not a FMT_ULong? On its face "llu" says "long long unsigned"
> with two 'long', but "ULong" says only one 'long'.
>
I am not sure what you are asking. ULong is alias for "long long int".
Check:
./VEX/pub/libvex_basictypes.h:59:typedef unsigned long long int ULong;
Petar
|