diff options
| author | kamil <kamil@NetBSD.org> | 2017-02-19 22:09:29 +0000 |
|---|---|---|
| committer | kamil <kamil@NetBSD.org> | 2017-02-19 22:09:29 +0000 |
| commit | dc3f91f73a84e87ebe2e85bd08d364fd39d6c13d (patch) | |
| tree | a2a21835d73ecffd555c1c86be32cb7b87e4d625 | |
| parent | 291958f20008e1c2faf105d7d0c9f924a42a73d3 (diff) | |
Add checks for si_code in dbregs_dr[0123]_trap_variable in ATF arch/amd64
Validate that debug register traps generate appropriate SIGTRAP signal with
TRAP_DBREG property in si_code.
Sponsored by <The NetBSD Foundation>
| -rw-r--r-- | tests/kernel/arch/amd64/t_ptrace_wait.c | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/tests/kernel/arch/amd64/t_ptrace_wait.c b/tests/kernel/arch/amd64/t_ptrace_wait.c index 52e3de8f008..6e91e3b353e 100644 --- a/tests/kernel/arch/amd64/t_ptrace_wait.c +++ b/tests/kernel/arch/amd64/t_ptrace_wait.c @@ -1,4 +1,4 @@ -/* $NetBSD: t_ptrace_wait.c,v 1.14 2017/02/18 04:30:34 kamil Exp $ */ +/* $NetBSD: t_ptrace_wait.c,v 1.15 2017/02/19 22:09:29 kamil Exp $ */ /*- * Copyright (c) 2016 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_ptrace_wait.c,v 1.14 2017/02/18 04:30:34 kamil Exp $"); +__RCSID("$NetBSD: t_ptrace_wait.c,v 1.15 2017/02/19 22:09:29 kamil Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -1330,6 +1330,9 @@ ATF_TC_BODY(dbregs_dr0_trap_variable, tc) volatile int watchme; union u dr7; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); + dr7.raw = 0; dr7.bits.global_dr0_breakpoint = 1; dr7.bits.condition_dr0 = 3; /* 0b11 -- break on data write&read */ @@ -1392,6 +1395,18 @@ ATF_TC_BODY(dbregs_dr0_trap_variable, tc) validate_status_stopped(status, SIGTRAP); + printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); + ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); + + printf("Signal traced to lwpid=%d\n", info.psi_lwpid); + printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n", + info.psi_siginfo.si_signo, info.psi_siginfo.si_code, + info.psi_siginfo.si_errno); + + printf("Before checking siginfo_t\n"); + ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); + ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG); + printf("Call CONTINUE for the child process\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -1444,6 +1459,9 @@ ATF_TC_BODY(dbregs_dr1_trap_variable, tc) volatile int watchme; union u dr7; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); + dr7.raw = 0; dr7.bits.global_dr1_breakpoint = 1; dr7.bits.condition_dr1 = 3; /* 0b11 -- break on data write&read */ @@ -1506,6 +1524,18 @@ ATF_TC_BODY(dbregs_dr1_trap_variable, tc) validate_status_stopped(status, SIGTRAP); + printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); + ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); + + printf("Signal traced to lwpid=%d\n", info.psi_lwpid); + printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n", + info.psi_siginfo.si_signo, info.psi_siginfo.si_code, + info.psi_siginfo.si_errno); + + printf("Before checking siginfo_t\n"); + ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); + ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG); + printf("Call CONTINUE for the child process\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -1558,6 +1588,9 @@ ATF_TC_BODY(dbregs_dr2_trap_variable, tc) volatile int watchme; union u dr7; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); + dr7.raw = 0; dr7.bits.global_dr2_breakpoint = 1; dr7.bits.condition_dr2 = 3; /* 0b11 -- break on data write&read */ @@ -1620,6 +1653,18 @@ ATF_TC_BODY(dbregs_dr2_trap_variable, tc) validate_status_stopped(status, SIGTRAP); + printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); + ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); + + printf("Signal traced to lwpid=%d\n", info.psi_lwpid); + printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n", + info.psi_siginfo.si_signo, info.psi_siginfo.si_code, + info.psi_siginfo.si_errno); + + printf("Before checking siginfo_t\n"); + ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); + ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG); + printf("Call CONTINUE for the child process\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -1672,6 +1717,9 @@ ATF_TC_BODY(dbregs_dr3_trap_variable, tc) volatile int watchme; union u dr7; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); + dr7.raw = 0; dr7.bits.global_dr3_breakpoint = 1; dr7.bits.condition_dr3 = 3; /* 0b11 -- break on data write&read */ @@ -1734,6 +1782,18 @@ ATF_TC_BODY(dbregs_dr3_trap_variable, tc) validate_status_stopped(status, SIGTRAP); + printf("Before calling ptrace(2) with PT_GET_SIGINFO for child\n"); + ATF_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info)) != -1); + + printf("Signal traced to lwpid=%d\n", info.psi_lwpid); + printf("Signal properties: si_signo=%#x si_code=%#x si_errno=%#x\n", + info.psi_siginfo.si_signo, info.psi_siginfo.si_code, + info.psi_siginfo.si_errno); + + printf("Before checking siginfo_t\n"); + ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, SIGTRAP); + ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_DBREG); + printf("Call CONTINUE for the child process\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); |
