$(o)/box/syscall-table.h: $(s)/box/mk-syscall-table
sh $^ >$@
+
+box-tests: $(addprefix $(o)/box/test-sys,32-int80 64-int80 32-syscall 64-syscall 32-sysenter 64-sysenter)
+
+.PHONY: box-tests
+
+$(o)/box/test-sys32-int80: $(s)/box/test-syscalls.c
+ $(CC) -m32 $^ -o $@ -DTEST_INT80
+
+$(o)/box/test-sys64-int80: $(s)/box/test-syscalls.c
+ $(CC) -m64 $^ -o $@ -DTEST_INT80
+
+$(o)/box/test-sys32-syscall: $(s)/box/test-syscalls.c
+ $(CC) -m32 $^ -o $@ -DTEST_SYSCALL_32
+
+$(o)/box/test-sys64-syscall: $(s)/box/test-syscalls.c
+ $(CC) -m64 $^ -o $@ -DTEST_SYSCALL_64
+
+$(o)/box/test-sys32-sysenter: $(s)/box/test-syscalls.c
+ $(CC) -m32 $^ -o $@ -DTEST_SYSENTER_32
+
+$(o)/box/test-sys64-sysenter: $(s)/box/test-syscalls.c
+ $(CC) -m64 $^ -o $@ -DTEST_SYSENTER_32 #sic
--- /dev/null
+int main(void)
+{
+ /*
+ * This program calls exit(42) using several different
+ * syscall mechanisms.
+ */
+#if defined(TEST_INT80)
+ asm volatile("int $0x80" : : "a" (1), "b" (42) : "memory");
+#elif defined(TEST_SYSCALL_32)
+ asm volatile("syscall" : : "a" (1), "b" (42) : "memory");
+#elif defined(TEST_SYSCALL_64)
+ asm volatile("syscall" : : "a" (60), "D" (42) : "memory");
+#elif defined(TEST_SYSENTER_32)
+ /*
+ * Hack alert! The SYSENTER instruction does not record
+ * the return address, so the syscall returns to a fixed
+ * address inside the VDSO. However, we need not worry
+ * about all this, since exit() never returns anyway.
+ */
+ asm volatile("sysenter" : : "a" (1), "b" (42) : "memory");
+#else
+#error "TEST_xxx must be defined."
+#endif
+ return 1;
+}