1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <errno.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <fcntl.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_basics.h" 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "vki/vki-scnums-darwin.h" 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_vkiscnums.h" 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Since we use vki_unistd.h, we can't include <unistd.h>. So we have to 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// declare this ourselves. 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int syscall (int __sysno, ...); 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Thorough syscall scalar arg checking. Also serves as thorough checking 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// for (very) basic syscall use. Generally not trying to do anything 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// meaningful with the syscalls. 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GO(__NR_xxx, N, s) \ 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "-----------------------------------------------------\n" \ 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "x%lx(%d):%20s %s\n" \ 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "-----------------------------------------------------\n", \ 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (unsigned long)__NR_xxx, N, #__NR_xxx, s); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GO_UNIMP(n, s) \ 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "-----------------------------------------------------\n" \ 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "%-17s%s\n" \ 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "-----------------------------------------------------\n", \ 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "("#n"): ", s); 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SY(__NR_xxx, args...) res = syscall(__NR_xxx, ##args); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define FAIL assert(-1 == res); 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SUCC assert(-1 != res); 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SUCC_OR_FAIL /* no test */ 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define FAILx(E) \ 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do { \ 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int myerrno = errno; \ 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (-1 == res) { \ 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (E == myerrno) { \ 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* as expected */ \ 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { \ 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Expected error %s (%d), got %d\n", #E, E, myerrno); \ 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); \ 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } \ 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { \ 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Expected error %s (%d), got success\n", #E, E); \ 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); \ 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } \ 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } while (0); 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define SUCC_OR_FAILx(E) \ 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do { \ 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int myerrno = errno; \ 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (-1 == res) { \ 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (E == myerrno) { \ 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* as expected */ \ 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { \ 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Expected error %s (%d), got %d\n", #E, E, myerrno); \ 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); \ 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } \ 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } \ 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } while (0); 65