@@ -40,6 +40,8 @@ module System.Hatrace
4040 , SyscallExitDetails_faccessat (.. )
4141 , SyscallEnterDetails_write (.. )
4242 , SyscallExitDetails_write (.. )
43+ , SyscallEnterDetails_writev (.. )
44+ , SyscallExitDetails_writev (.. )
4345 , SyscallEnterDetails_read (.. )
4446 , SyscallExitDetails_read (.. )
4547 , SyscallEnterDetails_close (.. )
@@ -193,7 +195,7 @@ import Foreign.Marshal.Alloc (alloca)
193195import Foreign.Marshal.Array (withArray )
194196import qualified Foreign.Marshal.Array (peekArray )
195197import Foreign.Marshal.Utils (withMany )
196- import Foreign.Ptr (castPtr , Ptr , nullPtr , wordPtrToPtr )
198+ import Foreign.Ptr (castPtr , Ptr , nullPtr , wordPtrToPtr , intPtrToPtr )
197199import Foreign.Storable (Storable , peekByteOff , sizeOf )
198200import GHC.Stack (HasCallStack , callStack , getCallStack , prettySrcLoc )
199201import System.Directory (canonicalizePath , doesFileExist , findExecutable )
@@ -1813,6 +1815,26 @@ instance SyscallExitFormatting SyscallExitDetails_rmdir where
18131815 syscallExitToFormatted SyscallExitDetails_rmdir { enterDetail } =
18141816 (syscallEnterToFormatted enterDetail, NoReturn )
18151817
1818+ data SyscallEnterDetails_writev = SyscallEnterDetails_writev
1819+ { fd :: CInt
1820+ , count :: CSize
1821+ -- Peeked details
1822+ , iovs :: [IovecStruct ]
1823+ , bufContents :: [ByteString ]
1824+ } deriving (Eq , Ord , Show )
1825+
1826+ instance SyscallEnterFormatting SyscallEnterDetails_writev where
1827+ syscallEnterToFormatted SyscallEnterDetails_writev { fd, iovs, bufContents, count } =
1828+ FormattedSyscall " writev" [formatArg fd, argPlaceholder " *iovec" , formatArg iovs, formatArg bufContents, formatArg count]
1829+
1830+ data SyscallExitDetails_writev = SyscallExitDetails_writev
1831+ { enterDetail :: SyscallEnterDetails_writev
1832+ , writtenCount :: CSize
1833+ } deriving (Eq , Ord , Show )
1834+
1835+ instance SyscallExitFormatting SyscallExitDetails_writev where
1836+ syscallExitToFormatted SyscallExitDetails_writev { enterDetail, writtenCount } =
1837+ (syscallEnterToFormatted enterDetail, formatReturn writtenCount)
18161838
18171839data DetailedSyscallEnter
18181840 = DetailedSyscallEnter_open SyscallEnterDetails_open
@@ -1823,6 +1845,7 @@ data DetailedSyscallEnter
18231845 | DetailedSyscallEnter_access SyscallEnterDetails_access
18241846 | DetailedSyscallEnter_faccessat SyscallEnterDetails_faccessat
18251847 | DetailedSyscallEnter_write SyscallEnterDetails_write
1848+ | DetailedSyscallEnter_writev SyscallEnterDetails_writev
18261849 | DetailedSyscallEnter_read SyscallEnterDetails_read
18271850 | DetailedSyscallEnter_execve SyscallEnterDetails_execve
18281851 | DetailedSyscallEnter_close SyscallEnterDetails_close
@@ -1885,6 +1908,7 @@ data DetailedSyscallExit
18851908 | DetailedSyscallExit_access SyscallExitDetails_access
18861909 | DetailedSyscallExit_faccessat SyscallExitDetails_faccessat
18871910 | DetailedSyscallExit_write SyscallExitDetails_write
1911+ | DetailedSyscallExit_writev SyscallExitDetails_writev
18881912 | DetailedSyscallExit_read SyscallExitDetails_read
18891913 | DetailedSyscallExit_execve SyscallExitDetails_execve
18901914 | DetailedSyscallExit_close SyscallExitDetails_close
@@ -2043,6 +2067,17 @@ getSyscallEnterDetails syscall syscallArgs pid = let proc = TracedProcess pid in
20432067 , count = fromIntegral count
20442068 , bufContents
20452069 }
2070+ Syscall_writev -> do
2071+ let SyscallArgs { arg0 = fd, arg1 = iovPtr, arg2 = iovcnt } = syscallArgs
2072+ n = fromIntegral $ min iovcnt $ fromIntegral (maxBound :: Int )
2073+ iovs <- peekArray (TracedProcess pid) n (word64ToPtr iovPtr :: Ptr IovecStruct )
2074+ contents <- mapM (\ IovecStruct { iov_base = base, iov_len = len } -> peekBytes proc (intPtrToPtr $ fromIntegral base) (fromIntegral len)) iovs
2075+ pure $ DetailedSyscallEnter_writev $ SyscallEnterDetails_writev
2076+ { fd = fromIntegral fd
2077+ , iovs = iovs
2078+ , count = fromIntegral iovcnt
2079+ , bufContents = contents
2080+ }
20462081 Syscall_read -> do
20472082 let SyscallArgs { arg0 = fd, arg1 = bufAddr, arg2 = count } = syscallArgs
20482083 let bufPtr = word64ToPtr bufAddr
@@ -2577,6 +2612,11 @@ getSyscallExitDetails detailedSyscallEnter result pid =
25772612 pure $ DetailedSyscallExit_write $
25782613 SyscallExitDetails_write { enterDetail, writtenCount = fromIntegral result }
25792614
2615+ DetailedSyscallEnter_writev
2616+ enterDetail@ SyscallEnterDetails_writev {} -> do
2617+ pure $ DetailedSyscallExit_writev $
2618+ SyscallExitDetails_writev { enterDetail, writtenCount = fromIntegral result }
2619+
25802620 DetailedSyscallEnter_access
25812621 enterDetail@ SyscallEnterDetails_access {} -> do
25822622 pure $ DetailedSyscallExit_access $
@@ -2880,7 +2920,9 @@ peekArray pid size ptr
28802920 let (tmpPtr, _, _) = BSI. toForeignPtr arrayBytes
28812921 withForeignPtr tmpPtr (\ p -> Foreign.Marshal.Array. peekArray size (castPtr p))
28822922 where
2883- elemSize = sizeOf ptr
2923+ elemSize = sizeOf (valueOf ptr)
2924+ valueOf :: Ptr a -> a
2925+ valueOf = undefined
28842926
28852927readPipeFds :: CPid -> Ptr CInt -> IO (CInt , CInt )
28862928readPipeFds pid pipefd = do
@@ -3277,6 +3319,8 @@ formatSyscallEnter enterDetails =
32773319
32783320 DetailedSyscallEnter_write details -> syscallEnterToFormatted details
32793321
3322+ DetailedSyscallEnter_writev details -> syscallEnterToFormatted details
3323+
32803324 DetailedSyscallEnter_read details -> syscallEnterToFormatted details
32813325
32823326 DetailedSyscallEnter_close details -> syscallEnterToFormatted details
@@ -3430,6 +3474,8 @@ formatDetailedSyscallExit detailedExit handleUnimplemented =
34303474
34313475 DetailedSyscallExit_write details -> formatDetails details
34323476
3477+ DetailedSyscallExit_writev details -> formatDetails details
3478+
34333479 DetailedSyscallExit_read details -> formatDetails details
34343480
34353481 DetailedSyscallExit_close details -> formatDetails details
0 commit comments