syscall_cp_fixup.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #include <sys/syscall.h>
  2. __attribute__((__visibility__("hidden")))
  3. long __syscall_cp_internal(volatile void*, long long, long long, long long, long long,
  4. long long, long long, long long);
  5. struct __timespec { long long tv_sec; long tv_nsec; };
  6. struct __timespec_kernel { long long tv_sec; long long tv_nsec; };
  7. #define __tsc(X) ((struct __timespec*)(unsigned long)(X))
  8. #define __fixup(X) do { if(X) { \
  9. ts->tv_sec = __tsc(X)->tv_sec; \
  10. ts->tv_nsec = __tsc(X)->tv_nsec; \
  11. (X) = (unsigned long)ts; } } while(0)
  12. __attribute__((__visibility__("hidden")))
  13. long __syscall_cp_asm (volatile void * foo, long long n, long long a1, long long a2, long long a3,
  14. long long a4, long long a5, long long a6)
  15. {
  16. struct __timespec_kernel ts[1];
  17. switch (n) {
  18. case SYS_mq_timedsend: case SYS_mq_timedreceive: case SYS_pselect6:
  19. __fixup(a5);
  20. break;
  21. case SYS_futex:
  22. if((a2 & (~128 /* FUTEX_PRIVATE_FLAG */)) == 0 /* FUTEX_WAIT */)
  23. __fixup(a4);
  24. break;
  25. case SYS_clock_nanosleep:
  26. case SYS_rt_sigtimedwait: case SYS_ppoll:
  27. __fixup(a3);
  28. break;
  29. case SYS_nanosleep:
  30. __fixup(a1);
  31. break;
  32. }
  33. return __syscall_cp_internal(foo, n, a1, a2, a3, a4, a5, a6);
  34. }