blob: 8972cabd73b11d2a655f2441c383f99807a11b0f [file] [log] [blame] [edit]
// Syscall hooks for Sanitizer tools.
// They help sanitizers update their knowledge of the process memory state
// before and after a system call.
#if defined(ADDRESS_SANITIZER) || defined(HWADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || defined(THREAD_SANITIZER)
#include <sanitizer/linux_syscall_hooks.h>
#define PRE(name, ...) __sanitizer_syscall_pre_##name(__VA_ARGS__)
#define POST(name, res, ...) __sanitizer_syscall_post_##name(res, __VA_ARGS__)
#else
#define PRE(...)
#define POST(...)
#endif
#define __NR_io_setup 206
#define __NR_io_destroy 207
#define __NR_io_getevents 208
#define __NR_io_submit 209
#define __NR_io_cancel 210
#define __syscall_clobber "r11","rcx","memory"
#define __syscall "syscall"
#define io_syscall1(type,fname,sname,type1,arg1) \
type fname(type1 arg1) \
{ \
long __res; \
PRE(sname, arg1); \
__asm__ volatile (__syscall \
: "=a" (__res) \
: "0" (__NR_##sname),"D" ((long)(arg1)) : __syscall_clobber ); \
POST(sname, __res, arg1); \
return __res; \
}
#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
type fname(type1 arg1,type2 arg2) \
{ \
long __res; \
PRE(sname, arg1, arg2); \
__asm__ volatile (__syscall \
: "=a" (__res) \
: "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)) : __syscall_clobber ); \
POST(sname, __res, arg1, arg2); \
return __res; \
}
#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
type fname(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
PRE(sname, arg1, arg2, arg3); \
__asm__ volatile (__syscall \
: "=a" (__res) \
: "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)), \
"d" ((long)(arg3)) : __syscall_clobber); \
POST(sname, __res, arg1, arg2, arg3); \
return __res; \
}
#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
type fname (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
{ \
long __res; \
PRE(sname, arg1, arg2, arg3, arg4); \
__asm__ volatile ("movq %5,%%r10 ;" __syscall \
: "=a" (__res) \
: "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)), \
"d" ((long)(arg3)),"g" ((long)(arg4)) : __syscall_clobber,"r10" ); \
POST(sname, __res, arg1, arg2, arg3, arg4); \
return __res; \
}
#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
type5,arg5) \
type fname (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
{ \
long __res; \
PRE(sname, arg1, arg2, arg3, arg4, arg5); \
__asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; " __syscall \
: "=a" (__res) \
: "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)), \
"d" ((long)(arg3)),"g" ((long)(arg4)),"g" ((long)(arg5)) : \
__syscall_clobber,"r8","r10" ); \
POST(sname, __res, arg1, arg2, arg3, arg4, arg5); \
return __res; \
}