From: Julian Seward Date: Mon, 12 Mar 2007 00:27:30 +0000 (+0000) Subject: Add a test for int3 on amd64 (from Peter Maydell) X-Git-Tag: svn/VALGRIND_3_3_0~324 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=599d74dcf09e5ab73b57209e4a3108cf1a85b698;p=thirdparty%2Fvalgrind.git Add a test for int3 on amd64 (from Peter Maydell) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6642 --- diff --git a/memcheck/tests/amd64/Makefile.am b/memcheck/tests/amd64/Makefile.am index 2a5b5bc61e..69ce4205f4 100644 --- a/memcheck/tests/amd64/Makefile.am +++ b/memcheck/tests/amd64/Makefile.am @@ -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 index 0000000000..3a0fb0c8b0 --- /dev/null +++ b/memcheck/tests/amd64/int3-amd64.c @@ -0,0 +1,52 @@ + +#undef _GNU_SOURCE +#define _GNU_SOURCE 1 + +#include +#include +#include + +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 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/amd64/int3-amd64.stdout.exp b/memcheck/tests/amd64/int3-amd64.stdout.exp new file mode 100644 index 0000000000..5bcea36782 --- /dev/null +++ b/memcheck/tests/amd64/int3-amd64.stdout.exp @@ -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 index 0000000000..1992aa3daa --- /dev/null +++ b/memcheck/tests/amd64/int3-amd64.vgtest @@ -0,0 +1,2 @@ +prog: int3-amd64 +vgopts: -q