From bd78cc2d2eb5cbe318678074302c9989eedf66e7 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Mon, 12 Mar 2007 00:42:26 +0000 Subject: [PATCH] Add a test for int3 on x86 (from Peter Maydell) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6643 --- memcheck/tests/x86/Makefile.am | 2 + memcheck/tests/x86/int3-x86.c | 52 ++++++++++++++++++++++++++ memcheck/tests/x86/int3-x86.stderr.exp | 0 memcheck/tests/x86/int3-x86.stdout.exp | 3 ++ memcheck/tests/x86/int3-x86.vgtest | 2 + 5 files changed, 59 insertions(+) create mode 100644 memcheck/tests/x86/int3-x86.c create mode 100644 memcheck/tests/x86/int3-x86.stderr.exp create mode 100644 memcheck/tests/x86/int3-x86.stdout.exp create mode 100644 memcheck/tests/x86/int3-x86.vgtest 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 -- 2.47.2