1#include <sys/types.h> 2#include <sys/stat.h> 3#include <fcntl.h> 4#include <time.h> 5#include <unistd.h> 6 7#include "capsicum.h" 8#include "syscalls.h" 9#include "capsicum-test.h" 10 11#ifdef HAVE_SYSCALL 12double RepeatSyscall(int count, int nr, long arg1, long arg2, long arg3) { 13 const clock_t t0 = clock(); // or gettimeofday or whatever 14 for (int ii = 0; ii < count; ii++) { 15 syscall(nr, arg1, arg2, arg3); 16 } 17 const clock_t t1 = clock(); 18 return (t1 - t0) / (double)CLOCKS_PER_SEC; 19} 20 21typedef int (*EntryFn)(void); 22 23double CompareSyscall(EntryFn entry_fn, int count, int nr, 24 long arg1, long arg2, long arg3) { 25 double bare = RepeatSyscall(count, nr, arg1, arg2, arg3); 26 EXPECT_OK(entry_fn()); 27 double capmode = RepeatSyscall(count, nr, arg1, arg2, arg3); 28 if (verbose) fprintf(stderr, "%d iterations bare=%fs capmode=%fs ratio=%.2f%%\n", 29 count, bare, capmode, 100.0*capmode/bare); 30 if (bare==0.0) { 31 if (capmode==0.0) return 1.0; 32 return 999.0; 33 } 34 return capmode/bare; 35} 36 37FORK_TEST(Overhead, GetTid) { 38 EXPECT_GT(10, CompareSyscall(&cap_enter, 10000, __NR_gettid, 0, 0, 0)); 39} 40FORK_TEST(Overhead, Seek) { 41 int fd = open("/etc/passwd", O_RDONLY); 42 EXPECT_GT(50, CompareSyscall(&cap_enter, 10000, __NR_lseek, fd, 0, SEEK_SET)); 43 close(fd); 44} 45#endif 46