From owner-svn-src-projects@freebsd.org Wed Jan 18 05:36:11 2017 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1CDA9CB326E for ; Wed, 18 Jan 2017 05:36:11 +0000 (UTC) (envelope-from ngie@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id DF7F01A86; Wed, 18 Jan 2017 05:36:10 +0000 (UTC) (envelope-from ngie@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v0I5aAER053997; Wed, 18 Jan 2017 05:36:10 GMT (envelope-from ngie@FreeBSD.org) Received: (from ngie@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v0I5a9w4053995; Wed, 18 Jan 2017 05:36:10 GMT (envelope-from ngie@FreeBSD.org) Message-Id: <201701180536.v0I5a9w4053995@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ngie set sender to ngie@FreeBSD.org using -f From: Ngie Cooper Date: Wed, 18 Jan 2017 05:36:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r312372 - in projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests: kernel/arch/amd64 lib/libpthread X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Jan 2017 05:36:11 -0000 Author: ngie Date: Wed Jan 18 05:36:09 2017 New Revision: 312372 URL: https://svnweb.freebsd.org/changeset/base/312372 Log: Merge ^/vendor/NetBSD/tests/dist@r312370 Modified: projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/kernel/arch/amd64/t_ptrace_wait.c projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/lib/libpthread/h_common.h Directory Properties: projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/ (props changed) Modified: projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/kernel/arch/amd64/t_ptrace_wait.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/kernel/arch/amd64/t_ptrace_wait.c Wed Jan 18 05:35:34 2017 (r312371) +++ projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/kernel/arch/amd64/t_ptrace_wait.c Wed Jan 18 05:36:09 2017 (r312372) @@ -1,4 +1,4 @@ -/* $NetBSD: t_ptrace_wait.c,v 1.9 2017/01/13 21:30:41 christos Exp $ */ +/* $NetBSD: t_ptrace_wait.c,v 1.11 2017/01/18 05:14:34 kamil Exp $ */ /*- * Copyright (c) 2016 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include -__RCSID("$NetBSD: t_ptrace_wait.c,v 1.9 2017/01/13 21:30:41 christos Exp $"); +__RCSID("$NetBSD: t_ptrace_wait.c,v 1.11 2017/01/18 05:14:34 kamil Exp $"); #include #include @@ -247,6 +247,7 @@ ATF_TC_BODY(watchpoint_read, tc) printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -320,6 +321,7 @@ ATF_TC_BODY(watchpoint_write_unmodified, printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -364,6 +366,8 @@ ATF_TC_BODY(watchpoint_trap_code0, tc) struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -390,6 +394,7 @@ ATF_TC_BODY(watchpoint_trap_code0, tc) pw.pw_index = i; pw.pw_lwpid = 0; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = (void *)check_happy; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_EXECUTION; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -397,6 +402,7 @@ ATF_TC_BODY(watchpoint_trap_code0, tc) printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -414,6 +420,20 @@ ATF_TC_BODY(watchpoint_trap_code0, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 0); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + pw.pw_md.md_address = NULL; printf("Before writing watchpoint %d (disable it)\n", i); ATF_REQUIRE(ptrace(PT_WRITE_WATCHPOINT, child, &pw, len) != -1); @@ -452,6 +472,8 @@ ATF_TC_BODY(watchpoint_trap_code1, tc) struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -478,6 +500,7 @@ ATF_TC_BODY(watchpoint_trap_code1, tc) pw.pw_index = i; pw.pw_lwpid = 0; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = (void *)check_happy; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_EXECUTION; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -485,6 +508,7 @@ ATF_TC_BODY(watchpoint_trap_code1, tc) printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%d\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -502,6 +526,20 @@ ATF_TC_BODY(watchpoint_trap_code1, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 1); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + pw.pw_md.md_address = NULL; printf("Before writing watchpoint %d (disable it)\n", i); ATF_REQUIRE(ptrace(PT_WRITE_WATCHPOINT, child, &pw, len) != -1); @@ -540,6 +578,8 @@ ATF_TC_BODY(watchpoint_trap_code2, tc) struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -566,6 +606,7 @@ ATF_TC_BODY(watchpoint_trap_code2, tc) pw.pw_index = i; pw.pw_lwpid = 0; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = (void *)check_happy; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_EXECUTION; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -573,6 +614,7 @@ ATF_TC_BODY(watchpoint_trap_code2, tc) printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -590,6 +632,20 @@ ATF_TC_BODY(watchpoint_trap_code2, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 2); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + pw.pw_md.md_address = NULL; printf("Before writing watchpoint %d (disable it)\n", i); ATF_REQUIRE(ptrace(PT_WRITE_WATCHPOINT, child, &pw, len) != -1); @@ -628,6 +684,8 @@ ATF_TC_BODY(watchpoint_trap_code3, tc) struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -654,6 +712,7 @@ ATF_TC_BODY(watchpoint_trap_code3, tc) pw.pw_index = i; pw.pw_lwpid = 0; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = (void *)check_happy; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_EXECUTION; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -661,6 +720,7 @@ ATF_TC_BODY(watchpoint_trap_code3, tc) printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -678,6 +738,20 @@ ATF_TC_BODY(watchpoint_trap_code3, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 3); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + pw.pw_md.md_address = NULL; printf("Before writing watchpoint %d (disable it)\n", i); ATF_REQUIRE(ptrace(PT_WRITE_WATCHPOINT, child, &pw, len) != -1); @@ -716,6 +790,8 @@ ATF_TC_BODY(watchpoint_trap_data_write0, struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -741,6 +817,7 @@ ATF_TC_BODY(watchpoint_trap_data_write0, printf("Preparing code watchpoint trap %d\n", i); pw.pw_index = 0; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = &watchme; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_DATA_WRITE; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -748,6 +825,7 @@ ATF_TC_BODY(watchpoint_trap_data_write0, printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -765,6 +843,20 @@ ATF_TC_BODY(watchpoint_trap_data_write0, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 0); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + printf("Before resuming the child process where it left off and " "without signal to be sent\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -799,6 +891,8 @@ ATF_TC_BODY(watchpoint_trap_data_write1, struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -824,6 +918,7 @@ ATF_TC_BODY(watchpoint_trap_data_write1, printf("Preparing code watchpoint trap %d\n", i); pw.pw_index = i; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = &watchme; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_DATA_WRITE; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -831,6 +926,7 @@ ATF_TC_BODY(watchpoint_trap_data_write1, printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -848,6 +944,20 @@ ATF_TC_BODY(watchpoint_trap_data_write1, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 1); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + printf("Before resuming the child process where it left off and " "without signal to be sent\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -882,6 +992,8 @@ ATF_TC_BODY(watchpoint_trap_data_write2, struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -907,6 +1019,7 @@ ATF_TC_BODY(watchpoint_trap_data_write2, printf("Preparing code watchpoint trap %d\n", i); pw.pw_index = i; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = &watchme; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_DATA_WRITE; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -914,6 +1027,7 @@ ATF_TC_BODY(watchpoint_trap_data_write2, printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -931,6 +1045,20 @@ ATF_TC_BODY(watchpoint_trap_data_write2, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 2); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + printf("Before resuming the child process where it left off and " "without signal to be sent\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -966,6 +1094,8 @@ ATF_TC_BODY(watchpoint_trap_data_write3, struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -991,6 +1121,7 @@ ATF_TC_BODY(watchpoint_trap_data_write3, printf("Preparing code watchpoint trap %d\n", i); pw.pw_index = i; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = &watchme; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_DATA_WRITE; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -998,6 +1129,7 @@ ATF_TC_BODY(watchpoint_trap_data_write3, printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -1015,6 +1147,20 @@ ATF_TC_BODY(watchpoint_trap_data_write3, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 3); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + printf("Before resuming the child process where it left off and " "without signal to be sent\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -1049,6 +1195,8 @@ ATF_TC_BODY(watchpoint_trap_data_rw0, tc struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -1074,6 +1222,7 @@ ATF_TC_BODY(watchpoint_trap_data_rw0, tc printf("Preparing code watchpoint trap %d\n", i); pw.pw_index = i; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = &watchme; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_DATA_READWRITE; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -1081,6 +1230,7 @@ ATF_TC_BODY(watchpoint_trap_data_rw0, tc printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -1098,6 +1248,20 @@ ATF_TC_BODY(watchpoint_trap_data_rw0, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 0); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + printf("Before resuming the child process where it left off and " "without signal to be sent\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -1132,6 +1296,8 @@ ATF_TC_BODY(watchpoint_trap_data_rw1, tc struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -1157,6 +1323,7 @@ ATF_TC_BODY(watchpoint_trap_data_rw1, tc printf("Preparing code watchpoint trap %d\n", i); pw.pw_index = i; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = &watchme; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_DATA_READWRITE; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -1164,6 +1331,7 @@ ATF_TC_BODY(watchpoint_trap_data_rw1, tc printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -1181,6 +1349,20 @@ ATF_TC_BODY(watchpoint_trap_data_rw1, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 1); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + printf("Before resuming the child process where it left off and " "without signal to be sent\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -1215,6 +1397,8 @@ ATF_TC_BODY(watchpoint_trap_data_rw2, tc struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -1240,6 +1424,7 @@ ATF_TC_BODY(watchpoint_trap_data_rw2, tc printf("Preparing code watchpoint trap %d\n", i); pw.pw_index = i; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = &watchme; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_DATA_READWRITE; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -1247,6 +1432,7 @@ ATF_TC_BODY(watchpoint_trap_data_rw2, tc printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -1264,6 +1450,20 @@ ATF_TC_BODY(watchpoint_trap_data_rw2, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 2); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + printf("Before resuming the child process where it left off and " "without signal to be sent\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); @@ -1298,6 +1498,8 @@ ATF_TC_BODY(watchpoint_trap_data_rw3, tc struct ptrace_watchpoint pw; int len = sizeof(pw); int watchme = 1234; + struct ptrace_siginfo info; + memset(&info, 0, sizeof(info)); printf("Before forking process PID=%d\n", getpid()); ATF_REQUIRE((child = fork()) != -1); @@ -1323,6 +1525,7 @@ ATF_TC_BODY(watchpoint_trap_data_rw3, tc printf("Preparing code watchpoint trap %d\n", i); pw.pw_index = i; + pw.pw_type = PTRACE_PW_TYPE_DBREGS; pw.pw_md.md_address = &watchme; pw.pw_md.md_condition = X86_HW_WATCHPOINT_DR7_CONDITION_DATA_READWRITE; pw.pw_md.md_length = X86_HW_WATCHPOINT_DR7_LENGTH_BYTE; @@ -1330,6 +1533,7 @@ ATF_TC_BODY(watchpoint_trap_data_rw3, tc printf("struct ptrace {\n"); printf("\t.pw_index=%d\n", pw.pw_index); printf("\t.pw_lwpid=%d\n", pw.pw_lwpid); + printf("\t.pw_type=%#x\n", pw.pw_type); printf("\t.pw_md.md_address=%p\n", pw.pw_md.md_address); printf("\t.pw_md.md_condition=%#x\n", pw.pw_md.md_condition); printf("\t.pw_md.md_length=%#x\n", pw.pw_md.md_length); @@ -1347,6 +1551,20 @@ ATF_TC_BODY(watchpoint_trap_data_rw3, 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_HWWPT); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap2, 3); + ATF_REQUIRE_EQ(info.psi_siginfo.si_trap3, X86_HW_WATCHPOINT_EVENT_FIRED); + printf("Before resuming the child process where it left off and " "without signal to be sent\n"); ATF_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1); Modified: projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/lib/libpthread/h_common.h ============================================================================== --- projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/lib/libpthread/h_common.h Wed Jan 18 05:35:34 2017 (r312371) +++ projects/netbsd-tests-upstream-01-2017/contrib/netbsd-tests/lib/libpthread/h_common.h Wed Jan 18 05:36:09 2017 (r312372) @@ -5,14 +5,14 @@ #define PTHREAD_REQUIRE(x) \ do { \ - int ret = (x); \ - ATF_REQUIRE_MSG(ret == 0, "%s: %s", #x, strerror(ret)); \ + int _ret = (x); \ + ATF_REQUIRE_MSG(_ret == 0, "%s: %s", #x, strerror(_ret)); \ } while (0) #define PTHREAD_REQUIRE_STATUS(x, v) \ do { \ - int ret = (x); \ - ATF_REQUIRE_MSG(ret == (v), "%s: %s", #x, strerror(ret)); \ + int _ret = (x); \ + ATF_REQUIRE_MSG(_ret == (v), "%s: %s", #x, strerror(_ret)); \ } while (0) #endif // H_COMMON_H