From: Julian Seward Date: Mon, 12 Mar 2007 00:42:26 +0000 (+0000) Subject: Add a test for int3 on x86 (from Peter Maydell) X-Git-Tag: svn/VALGRIND_3_3_0~323 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bd78cc2d2eb5cbe318678074302c9989eedf66e7;p=thirdparty%2Fvalgrind.git Add a test for int3 on x86 (from Peter Maydell) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6643 --- diff --git a/memcheck/tests/x86/Makefile.am b/memcheck/tests/x86/Makefile.am index 60d4427f05..9082d16a42 100644 --- a/memcheck/tests/x86/Makefile.am +++ b/memcheck/tests/x86/Makefile.am @@ -11,6 +11,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ $(addsuffix .stderr.exp,$(INSN_TESTS)) \ $(addsuffix .stdout.exp,$(INSN_TESTS)) \ $(addsuffix .vgtest,$(INSN_TESTS)) \ + int3-x86.vgtest int3-x86.stderr.exp int3-x86.stdout.exp \ pushfpopf.stderr.exp pushfpopf.stdout.exp pushfpopf.vgtest \ pushpopmem.stderr.exp pushpopmem.stdout.exp pushpopmem.vgtest \ scalar.stderr.exp scalar.stderr.exp2 scalar.vgtest \ @@ -31,6 +32,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ check_PROGRAMS = \ bug133694 \ espindola2 \ + int3-x86 \ scalar_exit_group scalar_fork scalar_supp scalar_vfork \ fpeflags pushfpopf pushpopmem scalar sse_memory tronical \ more_x86_fp fprem xor-undef-x86 diff --git a/memcheck/tests/x86/int3-x86.c b/memcheck/tests/x86/int3-x86.c new file mode 100644 index 0000000000..2a7fc643aa --- /dev/null +++ b/memcheck/tests/x86/int3-x86.c @@ -0,0 +1,52 @@ + +#undef _GNU_SOURCE +#define _GNU_SOURCE 1 + +#include +#include +#include + +static char* eip_at_sig = NULL; + +static void int_handler(int signum, siginfo_t *si, void *uc_arg) +{ + ucontext_t *uc = (ucontext_t *)uc_arg; + /* Note that uc->uc_mcontext is an embedded struct, not a pointer */ + mcontext_t *mc = &(uc->uc_mcontext); + void *pc = (void*)mc->gregs[REG_EIP]; + printf("in int_handler, EIP is ...\n"); + eip_at_sig = pc; +} + +static void register_handler(int sig, void *handler) +{ + struct sigaction sa; + sa.sa_flags = SA_RESTART | SA_SIGINFO; + sigfillset(&sa.sa_mask); + sa.sa_sigaction = handler; + sigaction(sig, &sa, NULL); +} + +int main(void) { + char *intaddr = NULL; + puts("main"); + register_handler(SIGTRAP, int_handler); + asm volatile( + "movl $zz_int, %%edx\n" + "mov %%edx, %0\n" + "zz_int:\n" + "int $3\n" + : /* no outputs */ + : "m" (intaddr) /* input: address of var to store target addr to */ + : /* clobbers */ "edx" + ); + /* intaddr is the address of the int 3 insn. eip_at_sig is the PC + after the exception, which should be the next insn along. + Hence: */ + if (intaddr != NULL && eip_at_sig != NULL + && eip_at_sig == intaddr+1) + printf("PASS\n"); + else + printf("FAIL\n"); + return 0; +} diff --git a/memcheck/tests/x86/int3-x86.stderr.exp b/memcheck/tests/x86/int3-x86.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/x86/int3-x86.stdout.exp b/memcheck/tests/x86/int3-x86.stdout.exp new file mode 100644 index 0000000000..e4efc4a747 --- /dev/null +++ b/memcheck/tests/x86/int3-x86.stdout.exp @@ -0,0 +1,3 @@ +main +in int_handler, EIP is ... +PASS diff --git a/memcheck/tests/x86/int3-x86.vgtest b/memcheck/tests/x86/int3-x86.vgtest new file mode 100644 index 0000000000..1f2f1b55b5 --- /dev/null +++ b/memcheck/tests/x86/int3-x86.vgtest @@ -0,0 +1,2 @@ +prog: int3-x86 +vgopts: -q