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

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

index 2a5b5bc61e6fb27240e2476b7ba3a953c2dda589..69ce4205f44ae71b170fb201ff4de700b5fde121 100644 (file)
@@ -13,12 +13,14 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
        bug132146.vgtest bug132146.stderr.exp bug132146.stdout.exp \
        defcfaexpr.vgtest defcfaexpr.stderr.exp \
        fxsave-amd64.vgtest fxsave-amd64.stdout.exp fxsave-amd64.stderr.exp \
+       int3-amd64.vgtest int3-amd64.stdout.exp int3-amd64.stderr.exp \
        more_x87_fp.stderr.exp more_x87_fp.stdout.exp more_x87_fp.vgtest \
        sse_memory.stderr.exp sse_memory.stdout.exp sse_memory.vgtest \
        xor-undef-amd64.stderr.exp xor-undef-amd64.stdout.exp \
        xor-undef-amd64.vgtest
 
 check_PROGRAMS = bt_everything bug132146 defcfaexpr fxsave-amd64 \
+               int3-amd64 \
                more_x87_fp sse_memory xor-undef-amd64
 
 AM_CPPFLAGS = -I$(top_srcdir)/include
diff --git a/memcheck/tests/amd64/int3-amd64.c b/memcheck/tests/amd64/int3-amd64.c
new file mode 100644 (file)
index 0000000..3a0fb0c
--- /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* rip_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_RIP];
+   printf("in int_handler, RIP is ...\n");
+   rip_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(
+      "movabsq $zz_int, %%rdx\n"
+      "mov %%rdx, %0\n"
+      "zz_int:\n"
+      "int $3\n"
+      : /* no outputs */
+      : "m" (intaddr) /* input: address of var to store target addr to */
+      : /* clobbers */ "rdx"
+      );
+   /* intaddr is the address of the int 3 insn.  rip_at_sig is the PC
+      after the exception, which should be the next insn along.
+      Hence: */
+   if (intaddr != NULL && rip_at_sig != NULL
+       && rip_at_sig == intaddr+1)
+     printf("PASS\n");
+   else
+     printf("FAIL\n");
+   return 0;
+}
diff --git a/memcheck/tests/amd64/int3-amd64.stderr.exp b/memcheck/tests/amd64/int3-amd64.stderr.exp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/memcheck/tests/amd64/int3-amd64.stdout.exp b/memcheck/tests/amd64/int3-amd64.stdout.exp
new file mode 100644 (file)
index 0000000..5bcea36
--- /dev/null
@@ -0,0 +1,3 @@
+main
+in int_handler, RIP is ...
+PASS
diff --git a/memcheck/tests/amd64/int3-amd64.vgtest b/memcheck/tests/amd64/int3-amd64.vgtest
new file mode 100644 (file)
index 0000000..1992aa3
--- /dev/null
@@ -0,0 +1,2 @@
+prog: int3-amd64
+vgopts: -q