]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add a test for int3 on x86 (from Peter Maydell)
authorJulian Seward <jseward@acm.org>
Mon, 12 Mar 2007 00:42:26 +0000 (00:42 +0000)
committerJulian Seward <jseward@acm.org>
Mon, 12 Mar 2007 00:42:26 +0000 (00:42 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6643

memcheck/tests/x86/Makefile.am
memcheck/tests/x86/int3-x86.c [new file with mode: 0644]
memcheck/tests/x86/int3-x86.stderr.exp [new file with mode: 0644]
memcheck/tests/x86/int3-x86.stdout.exp [new file with mode: 0644]
memcheck/tests/x86/int3-x86.vgtest [new file with mode: 0644]

index 60d4427f059e411f8eb0f9a3ff58f31960c72403..9082d16a428b97b4935896115c34d54e9b9ee162 100644 (file)
@@ -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 (file)
index 0000000..2a7fc64
--- /dev/null
@@ -0,0 +1,52 @@
+
+#undef _GNU_SOURCE
+#define _GNU_SOURCE 1
+
+#include <signal.h>
+#include <stdio.h>
+#include <sys/ucontext.h>
+
+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 (file)
index 0000000..e69de29
diff --git a/memcheck/tests/x86/int3-x86.stdout.exp b/memcheck/tests/x86/int3-x86.stdout.exp
new file mode 100644 (file)
index 0000000..e4efc4a
--- /dev/null
@@ -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 (file)
index 0000000..1f2f1b5
--- /dev/null
@@ -0,0 +1,2 @@
+prog: int3-x86
+vgopts: -q