From: Martin Mares Date: Sun, 20 Jun 2010 00:14:18 +0000 (+0200) Subject: Box: Added a toy program testing various kinds of syscalls X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=90f66e4da825cc0a803cbad2c9bffa9354660fdc;hp=83a277c9a93493668f4d922cdde4f9d5c0ece7d8;p=moe.git Box: Added a toy program testing various kinds of syscalls --- diff --git a/box/Makefile b/box/Makefile index 8cc8716..bb9e2d6 100644 --- a/box/Makefile +++ b/box/Makefile @@ -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 index 0000000..46c001c --- /dev/null +++ b/box/test-syscalls.c @@ -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; +}