Int o_arg4;
Int s_arg5;
Int s_arg6;
- Int uu_arg7;
+ Int s_arg7;
Int uu_arg8;
# elif defined(VGP_x86_darwin) || defined(VGP_x86_solaris)
Int s_arg1;
fixed sized table exposed to the caller, but that's too inflexible;
hence now use a function which can do arbitrary messing around to
find the required entry. */
-#if defined(VGP_mips32_linux)
- /* Up to 6 parameters, 4 in registers 2 on stack. */
-# define PRA1(s,t,a) PRRAn(1,s,t,a)
-# define PRA2(s,t,a) PRRAn(2,s,t,a)
-# define PRA3(s,t,a) PRRAn(3,s,t,a)
-# define PRA4(s,t,a) PRRAn(4,s,t,a)
-# define PRA5(s,t,a) PSRAn(5,s,t,a)
-# define PRA6(s,t,a) PSRAn(6,s,t,a)
-#endif
#if defined(VGO_linux)
extern
SyscallTableEntry* ML_(get_linux_syscall_entry)( UInt sysno );
# define PRA4(s,t,a) PRRAn(4,s,t,a)
# define PRA5(s,t,a) PSRAn(5,s,t,a)
# define PRA6(s,t,a) PSRAn(6,s,t,a)
+# define PRA7(s,t,a) PSRAn(7,s,t,a)
#elif defined(VGO_linux) && !defined(VGP_mips32_linux)
/* Up to 6 parameters, all in registers. */
#define POST_FIELD_WRITE(zzfield) \
POST_MEM_WRITE((UWord)&zzfield, sizeof(zzfield))
+// Macros to support 64-bit syscall args split into two 32 bit values
+#define LOHI64(lo,hi) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
+#if defined(VG_LITTLEENDIAN)
+#define MERGE64(lo,hi) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
+#define MERGE64_FIRST(name) name##_low
+#define MERGE64_SECOND(name) name##_high
+#elif defined(VG_BIGENDIAN)
+#define MERGE64(hi,lo) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
+#define MERGE64_FIRST(name) name##_high
+#define MERGE64_SECOND(name) name##_low
+#else
+#error Unknown endianness
+#endif
#endif // __PRIV_TYPES_N_MACROS_H
#define PRE(name) DEFN_PRE_TEMPLATE(generic, name)
#define POST(name) DEFN_POST_TEMPLATE(generic, name)
-// Macros to support 64-bit syscall args split into two 32 bit values
-#if defined(VG_LITTLEENDIAN)
-#define MERGE64(lo,hi) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
-#define MERGE64_FIRST(name) name##_low
-#define MERGE64_SECOND(name) name##_high
-#elif defined(VG_BIGENDIAN)
-#define MERGE64(hi,lo) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
-#define MERGE64_FIRST(name) name##_high
-#define MERGE64_SECOND(name) name##_low
-#else
-#error Unknown endianness
-#endif
-
PRE(sys_exit)
{
ThreadState* tst;
#define PRE(name) DEFN_PRE_TEMPLATE(linux, name)
#define POST(name) DEFN_POST_TEMPLATE(linux, name)
-// Macros to support 64-bit syscall args split into two 32 bit values
-#define LOHI64(lo,hi) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
-#if defined(VG_LITTLEENDIAN)
-#define MERGE64(lo,hi) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
-#define MERGE64_FIRST(name) name##_low
-#define MERGE64_SECOND(name) name##_high
-#elif defined(VG_BIGENDIAN)
-#define MERGE64(hi,lo) ( ((ULong)(lo)) | (((ULong)(hi)) << 32) )
-#define MERGE64_FIRST(name) name##_high
-#define MERGE64_SECOND(name) name##_low
-#else
-#error Unknown endianness
-#endif
-
/* ---------------------------------------------------------------------
*mount wrappers
------------------------------------------------------------------ */
canonical->arg2 = gst->guest_r5; // a1
canonical->arg3 = gst->guest_r6; // a2
canonical->arg4 = gst->guest_r7; // a3
- canonical->arg5 = *((UInt*) (gst->guest_r29 + 16)); // 16(guest_SP/sp)
- canonical->arg6 = *((UInt*) (gst->guest_r29 + 20)); // 20(sp)
+ canonical->arg5 = *((UInt*) (gst->guest_r29 + 16)); // 16(guest_SP)
+ canonical->arg6 = *((UInt*) (gst->guest_r29 + 20)); // 20(guest_SP)
+ canonical->arg7 = *((UInt*) (gst->guest_r29 + 24)); // 24(guest_SP)
canonical->arg8 = 0;
} else {
// Fixme hack handle syscall()
layout->o_arg4 = OFFSET_mips32_r7;
layout->s_arg5 = sizeof(UWord) * 4;
layout->s_arg6 = sizeof(UWord) * 5;
- layout->uu_arg7 = -1; /* impossible value */
+ layout->s_arg7 = sizeof(UWord) * 6;
layout->uu_arg8 = -1; /* impossible value */
#elif defined(VGP_mips64_linux)
DECL_TEMPLATE (mips_linux, sys_mmap2);
DECL_TEMPLATE (mips_linux, sys_stat64);
DECL_TEMPLATE (mips_linux, sys_lstat64);
+DECL_TEMPLATE (mips_linux, sys_fadvise64);
DECL_TEMPLATE (mips_linux, sys_fstatat64);
DECL_TEMPLATE (mips_linux, sys_fstat64);
DECL_TEMPLATE (mips_linux, sys_clone);
POST_MEM_WRITE (ARG2, sizeof (struct vki_stat64));
}
+PRE(sys_fadvise64)
+{
+ PRINT("sys_fadvise64 ( %ld, %llu, %llu, %ld )",
+ SARG1, MERGE64(ARG3,ARG4), MERGE64(ARG5, ARG6), SARG7);
+
+ if (VG_(tdict).track_pre_reg_read) {
+ PRRSN;
+ PRA1("fadvise64", int, fd);
+ PRA3("fadvise64", vki_u32, MERGE64_FIRST(offset));
+ PRA4("fadvise64", vki_u32, MERGE64_SECOND(offset));
+ PRA5("fadvise64", vki_u32, MERGE64_FIRST(len));
+ PRA6("fadvise64", vki_u32, MERGE64_SECOND(len));
+ PRA7("fadvise64", int, advice);
+ }
+}
+
PRE(sys_fstatat64)
{
// ARG4 = int flags; Flags are or'ed together, therefore writing them
LINXY (__NR_epoll_wait, sys_epoll_wait), // 250
//..
LINX_ (__NR_set_tid_address, sys_set_tid_address), // 252
- LINX_ (__NR_fadvise64, sys_fadvise64), // 254
+ PLAX_ (__NR_fadvise64, sys_fadvise64), // 254
GENXY (__NR_statfs64, sys_statfs64), // 255
GENXY (__NR_fstatfs64, sys_fstatfs64), // 256
//..