]> mj.ucw.cz Git - eval.git/commitdiff
Box: Added a toy program testing various kinds of syscalls
authorMartin Mares <mj@ucw.cz>
Sun, 20 Jun 2010 00:14:18 +0000 (02:14 +0200)
committerMartin Mares <mj@ucw.cz>
Sun, 20 Jun 2010 00:14:18 +0000 (02:14 +0200)
box/Makefile
box/test-syscalls.c [new file with mode: 0644]

index 8cc8716aadee5e2068bffa2c4936b92d2519b210..bb9e2d6cd8287e5db690a70ee6b8c2ddb26e296d 100644 (file)
@@ -9,3 +9,25 @@ $(o)/box/box.o: $(o)/box/syscall-table.h
 
 $(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
diff --git a/box/test-syscalls.c b/box/test-syscalls.c
new file mode 100644 (file)
index 0000000..46c001c
--- /dev/null
@@ -0,0 +1,25 @@
+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;
+}