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