From 6aaeefab2490d56743ec49d0e20d3fd6ff45fb55 Mon Sep 17 00:00:00 2001 From: Roman Bogorodskiy Date: Sat, 9 Sep 2017 18:27:15 +0400 Subject: [PATCH v2] ino64 support --- coregrind/m_syswrap/priv_syswrap-freebsd.h | 4 ++ coregrind/m_syswrap/syswrap-freebsd.c | 65 ++++++++++++++++++++++++++++++ include/vki/vki-freebsd.h | 56 +++++++++++++++++++++++++ include/vki/vki-scnums-freebsd.h | 4 ++ 4 files changed, 129 insertions(+) diff --git a/coregrind/m_syswrap/priv_syswrap-freebsd.h b/coregrind/m_syswrap/priv_syswrap-freebsd.h index 63d122f..715ad48 100644 --- a/coregrind/m_syswrap/priv_syswrap-freebsd.h +++ b/coregrind/m_syswrap/priv_syswrap-freebsd.h @@ -97,10 +97,12 @@ DECL_TEMPLATE(freebsd, sys_setegid); DECL_TEMPLATE(freebsd, sys_seteuid); DECL_TEMPLATE(freebsd, sys_stat); DECL_TEMPLATE(freebsd, sys_fstat); +DECL_TEMPLATE(freebsd, sys_fstat64); DECL_TEMPLATE(freebsd, sys_lstat); DECL_TEMPLATE(freebsd, sys_pathconf); DECL_TEMPLATE(freebsd, sys_fpathconf); DECL_TEMPLATE(freebsd, sys_getdirentries); +DECL_TEMPLATE(freebsd, sys_getdirentries64); DECL_TEMPLATE(freebsd, sys_mmap); DECL_TEMPLATE(freebsd, sys___syscall); DECL_TEMPLATE(freebsd, sys_lseek); @@ -208,6 +210,7 @@ DECL_TEMPLATE(freebsd, sys_kevent); DECL_TEMPLATE(freebsd, sys_sendfile); DECL_TEMPLATE(freebsd, sys_statfs6); DECL_TEMPLATE(freebsd, sys_fstatfs6); +DECL_TEMPLATE(freebsd, sys_fstatfs64); DECL_TEMPLATE(freebsd, sys_fhstatfs6); DECL_TEMPLATE(freebsd, sys_thr_exit); DECL_TEMPLATE(freebsd, sys_thr_self); @@ -251,6 +254,7 @@ DECL_TEMPLATE(freebsd, sys_fchmodat); DECL_TEMPLATE(freebsd, sys_fchownat); DECL_TEMPLATE(freebsd, sys_fexecve); DECL_TEMPLATE(freebsd, sys_fstatat); +DECL_TEMPLATE(freebsd, sys_fstatat64); DECL_TEMPLATE(freebsd, sys_futimesat); DECL_TEMPLATE(freebsd, sys_linkat); DECL_TEMPLATE(freebsd, sys_mkdirat); diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index bf6b1f1..978e98e 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -885,6 +885,18 @@ POST(sys_fstat) POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) ); } +PRE(sys_fstat64) +{ + PRINT("sys_fstat64 ( %ld, %#lx )", ARG1, ARG2); + PRE_REG_READ2(long, "fstat", unsigned long, fd, struct stat *, buf); + PRE_MEM_WRITE( "fstat(buf)", ARG2, sizeof(struct vki_stat64) ); +} + +POST(sys_fstat64) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); +} + PRE(sys_pathconf) { PRINT("sys_pathconf ( %#lx(%s), %ld )",ARG1,(char *)ARG1,ARG2); @@ -1029,6 +1041,26 @@ POST(sys_getdirentries) } } +PRE(sys_getdirentries64) +{ + *flags |= SfMayBlock; + PRINT("sys_getdents ( %ld, %#lx, %ld )", ARG1,ARG2,ARG3); + PRE_REG_READ3(vki_ssize_t, "getdirentries", + unsigned int, fd, struct dirent *, dirp, + vki_size_t, count); + PRE_MEM_WRITE( "getdirentries(dirp)", ARG2, ARG3 ); +} + +POST(sys_getdirentries64) +{ + vg_assert(SUCCESS); + if (RES > 0) { + POST_MEM_WRITE( ARG2, RES ); + if ( ARG4 != 0 ) + POST_MEM_WRITE( ARG4, sizeof (vki_off_t)); + } +} + PRE(sys_seteuid) { PRINT("sys_seteuid ( %ld )", ARG1); @@ -1251,6 +1283,19 @@ POST(sys_fstatfs6) POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs6) ); } +PRE(sys_fstatfs64) +{ + PRINT("sys_fstatfs64 ( %ld, %#lx )", ARG1, ARG2); + PRE_REG_READ2(long, "fstatfs6", + unsigned int, fd, struct statfs *, buf); + PRE_MEM_WRITE( "fstatfs6(buf)", ARG2, sizeof(struct vki_statfs64) ); +} + +POST(sys_fstatfs64) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs64) ); +} + PRE(sys_statfs6) { PRINT("sys_statfs6 ( %#lx(%s), %#lx )",ARG1,(char *)ARG1,ARG2); @@ -3132,6 +3177,20 @@ POST(sys_fstatat) POST_MEM_WRITE( ARG3, sizeof(struct vki_stat) ); } +PRE(sys_fstatat64) +{ + PRINT("sys_fstatat ( %ld, %#lx(%s), %#lx )", ARG1,ARG2,(char*)ARG2,ARG3); + PRE_REG_READ3(long, "fstatat", + int, dfd, char *, file_name, struct stat *, buf); + PRE_MEM_RASCIIZ( "fstatat(file_name)", ARG2 ); + PRE_MEM_WRITE( "fstatat(buf)", ARG3, sizeof(struct vki_stat) ); +} + +POST(sys_fstatat64) +{ + POST_MEM_WRITE( ARG3, sizeof(struct vki_stat) ); +} + PRE(sys_unlinkat) { *flags |= SfMayBlock; @@ -4427,6 +4486,12 @@ const SyscallTableEntry ML_(syscall_table)[] = { BSDXY(__NR_accept4, sys_accept4), //541 BSDXY(__NR_pipe2, sys_pipe2), // 542 + // ino64 + BSDXY(__NR_fstat64, sys_fstat64), // 551 + BSDXY(__NR_fstatat64, sys_fstatat64), // 552 + BSDXY(__NR_getdirentries64, sys_getdirentries64), // 554 + GENXY(__NR_fstatfs64, sys_fstatfs), // 556 + BSDX_(__NR_fake_sigreturn, sys_fake_sigreturn), // 1000, fake sigreturn }; diff --git a/include/vki/vki-freebsd.h b/include/vki/vki-freebsd.h index aee453e..f20833a 100644 --- a/include/vki/vki-freebsd.h +++ b/include/vki/vki-freebsd.h @@ -367,6 +367,38 @@ struct vki_stat { unsigned int :(8 / 2) * (16 - (int)sizeof(struct vki_timespec)); }; +struct vki_stat64 { + vki_uint64_t st_dev; + vki_uint64_t st_ino; + vki_uint64_t st_nlink; + vki_mode_t st_mode; + vki_int16_t st_padding0; + vki_uid_t st_uid; + vki_gid_t st_gid; + vki_int32_t st_padding1; + vki_uint64_t st_rdev; +#if 0 + struct vki_timespec st_atimespec; + struct vki_timespec st_mtimespec; + struct vki_timespec st_ctimespec; +#else + vki_time_t st_atime; + long st_atime_nsec; + vki_time_t st_mtime; + long st_mtime_nsec; + vki_time_t st_ctime; + long st_ctime_nsec; +#endif + vki_off_t st_size; + vki_blkcnt_t st_blocks; + vki_blksize_t st_blksize; + vki_fflags_t st_flags; + vki_uint64_t st_gen; + vki_int64_t st_spare[10]; +// struct vki_timespec st_birthtimespec; +// unsigned int :(8 / 2) * (16 - (int)sizeof(struct vki_timespec)); +// unsigned int :(8 / 2) * (16 - (int)sizeof(struct vki_timespec)); +}; //---------------------------------------------------------------------- // From linux-2.6.8.1/include/linux/sched.h @@ -941,6 +973,30 @@ struct vki_statfs { char f_mntonname[VKI_MNAMELEN]; }; +struct vki_statfs64 { + vki_uint32_t f_version; + vki_uint32_t f_type; + vki_uint64_t f_flags; + vki_uint64_t f_bsize; + vki_uint64_t f_iosize; + vki_uint64_t f_blocks; + vki_uint64_t f_bfree; + vki_int64_t f_bavail; + vki_uint64_t f_files; + vki_int64_t f_ffree; + vki_uint64_t f_syncwrites; + vki_uint64_t f_asyncwrites; + vki_uint64_t f_syncreads; + vki_uint64_t f_asyncreads; + vki_uint64_t f_spare[10]; + vki_uint32_t f_namemax; + vki_uid_t f_owner; + vki_fsid_t f_fsid; + char f_charspare[80]; + char f_fstypename[VKI_MFSNAMELEN]; + char f_mntfromnname[VKI_MNAMELEN]; + char f_mntonname[VKI_MNAMELEN]; +}; #define MAXFIDSZ 16 struct vki_fid { diff --git a/include/vki/vki-scnums-freebsd.h b/include/vki/vki-scnums-freebsd.h index 605a42f..ffa241d 100644 --- a/include/vki/vki-scnums-freebsd.h +++ b/include/vki/vki-scnums-freebsd.h @@ -412,6 +412,10 @@ #define __NR_shmctl 512 #define __NR_accept4 541 #define __NR_pipe2 542 +#define __NR_fstat64 551 +#define __NR_fstatat64 552 +#define __NR_getdirentries64 554 +#define __NR_fstatfs64 556 #define __NR_fake_sigreturn 1000 -- 2.14.1