|
From: <sv...@va...> - 2007-03-12 00:42:28
|
Author: sewardj
Date: 2007-03-12 00:42:26 +0000 (Mon, 12 Mar 2007)
New Revision: 6643
Log:
Add a test for int3 on x86 (from Peter Maydell)
Added:
trunk/memcheck/tests/x86/int3-x86.c
trunk/memcheck/tests/x86/int3-x86.stderr.exp
trunk/memcheck/tests/x86/int3-x86.stdout.exp
trunk/memcheck/tests/x86/int3-x86.vgtest
Modified:
trunk/memcheck/tests/x86/Makefile.am
Modified: trunk/memcheck/tests/x86/Makefile.am
===================================================================
--- trunk/memcheck/tests/x86/Makefile.am 2007-03-12 00:27:30 UTC (rev 6642)
+++ trunk/memcheck/tests/x86/Makefile.am 2007-03-12 00:42:26 UTC (rev 6643)
@@ -11,6 +11,7 @@
$(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 @@
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
Added: trunk/memcheck/tests/x86/int3-x86.c
===================================================================
--- trunk/memcheck/tests/x86/int3-x86.c (rev 0)
+++ trunk/memcheck/tests/x86/int3-x86.c 2007-03-12 00:42:26 UTC (rev 6643)
@@ -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;
+}
Added: trunk/memcheck/tests/x86/int3-x86.stderr.exp
===================================================================
Added: trunk/memcheck/tests/x86/int3-x86.stdout.exp
===================================================================
--- trunk/memcheck/tests/x86/int3-x86.stdout.exp (rev 0)
+++ trunk/memcheck/tests/x86/int3-x86.stdout.exp 2007-03-12 00:42:26 UTC (rev 6643)
@@ -0,0 +1,3 @@
+main
+in int_handler, EIP is ...
+PASS
Added: trunk/memcheck/tests/x86/int3-x86.vgtest
===================================================================
--- trunk/memcheck/tests/x86/int3-x86.vgtest (rev 0)
+++ trunk/memcheck/tests/x86/int3-x86.vgtest 2007-03-12 00:42:26 UTC (rev 6643)
@@ -0,0 +1,2 @@
+prog: int3-x86
+vgopts: -q
|