14eee476691a0648b893665d3227277eb60f30cdfsewardj#include "../../../include/vki/vki-scnums-x86-linux.h"
2e365ff5f6f21bd92df08d42c00de265f9d6c521cnethercote
375a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote#include <assert.h>
492b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote#include <errno.h>
575a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote#include <fcntl.h>
675a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote#include <stdio.h>
775a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote#include <stdlib.h>
875a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote#include <sys/syscall.h>
99a3beb9fc89e9859ca9c3b93fa9c08ee2a2df11bnethercote#include <sys/stat.h>
109a3beb9fc89e9859ca9c3b93fa9c08ee2a2df11bnethercote#include <sys/ptrace.h>
1175a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote#include <sys/types.h>
120c865b49c9478b7be2c3ba44f0b763341ce7cf1eflorian#include <sys/mman.h>
1375a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote
14e365ff5f6f21bd92df08d42c00de265f9d6c521cnethercote// Since we use vki_unistd.h, we can't include <unistd.h>.  So we have to
15e365ff5f6f21bd92df08d42c00de265f9d6c521cnethercote// declare this ourselves.
16e365ff5f6f21bd92df08d42c00de265f9d6c521cnethercoteextern long int syscall (long int __sysno, ...) __THROW;
17e365ff5f6f21bd92df08d42c00de265f9d6c521cnethercote
1875a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote// Thorough syscall scalar arg checking.  Also serves as thorough checking
1975a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote// for (very) basic syscall use.  Generally not trying to do anything
2075a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote// meaningful with the syscalls.
2175a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote
2275a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote#define GO(__NR_xxx, s) \
2375a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote   fprintf(stderr, "-----------------------------------------------------\n"  \
2475a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote                   "%3d:%20s %s\n"                                            \
2575a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote                   "-----------------------------------------------------\n", \
2675a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote                   __NR_xxx, #__NR_xxx, s);
2775a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote
2892b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote#define SY  res = syscall
2975a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote
3092b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote#define FAIL  assert(-1 == res);
3192b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote#define SUCC  assert(-1 != res);
3292b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote#define SUCC_OR_FAIL    /* no test */
3392b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote
3492b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote#define FAILx(E) \
3592b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote   do { \
3692b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote      int myerrno = errno; \
3792b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote      if (-1 == res) { \
3892b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote         if (E == myerrno) { \
3992b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote            /* as expected */ \
4092b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote         } else { \
4192b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote         fprintf(stderr, "Expected error %s (%d), got %d\n", #E, E, myerrno); \
4292b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote         exit(1); \
4392b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote         } \
4492b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote      } else { \
4592b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote         fprintf(stderr, "Expected error %s (%d), got success\n", #E, E); \
4692b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote         exit(1); \
4792b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote      } \
4892b2fd542e89939b46edfa5c424af81f4a3bfe0cnethercote   } while (0);
4975a8c98921a3f59ac0351c270b84fa1c7cc29e01nethercote
50b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj#define SUCC_OR_FAILx(E) \
51b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj   do { \
52b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj      int myerrno = errno; \
53b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj      if (-1 == res) { \
54b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj         if (E == myerrno) { \
55b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj            /* as expected */ \
56b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj         } else { \
57b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj         fprintf(stderr, "Expected error %s (%d), got %d\n", #E, E, myerrno); \
58b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj         exit(1); \
59b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj         } \
60b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj      } \
61b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj   } while (0);
62