From patchwork Wed Jul 27 09:26:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Guo X-Patchwork-Id: 653251 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rzrRL1577z9s9c for ; Wed, 27 Jul 2016 20:13:18 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=l4Mex3WW; dkim-atps=neutral Received: from ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3rzrRK70N9zDrp8 for ; Wed, 27 Jul 2016 20:13:17 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=l4Mex3WW; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from mail-pf0-x244.google.com (mail-pf0-x244.google.com [IPv6:2607:f8b0:400e:c00::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3rzqT63Hp6zDrFf for ; Wed, 27 Jul 2016 19:29:46 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=l4Mex3WW; dkim-atps=neutral Received: by mail-pf0-x244.google.com with SMTP id h186so1525304pfg.2 for ; Wed, 27 Jul 2016 02:29:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=oQz8XEZJszJHLPD4swQn6x7X4+q4ZJjetiVxiQk3r1Q=; b=l4Mex3WWPmRFdIhVZNWQoVSpSYCkNXQkAE1ue0bMyjASvq/VB0GkvXIifjvUm8qbhh Sv2r5nmYl62n4TfvvRsrCzdJ70ZSNgP3e1v07Y8cl0GD46JEPHCIYAzV+G5tvEBXw0hE jYEzNKhVhzdo/e768if2Qo2rtD3192NYyw4qPKcPXxvGxeddBkw0uuuNaeHwHmnf/982 pQpwx9bktG0AoIsxpV36ek9a50JK0dIJ1gcZeIOdI4fjfnPOkqbud1ycVfPReN23A5dQ ryx1YKwpOqrP13v+sNg1DjVZcSK/RVIY2wy9Mhp0YSkjiOny5hpXaRdWg4vlfjWJU02k ynwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=oQz8XEZJszJHLPD4swQn6x7X4+q4ZJjetiVxiQk3r1Q=; b=JqIJicigaIG9kMVo6hPvoyCWYzewCpevRHc6hAGXREbsyLp8rEj7MKCLSNeDDAtu+6 ZrSJKGCIWKiy54gJMIkqjFoGS1m8hOymoTUk66WQZy5G4YZq0UapCnVb9AVIF4OA330D s1UWMdkxaqXJMBZVFRGf4hqcOU1b6xgzU8hP1jLvBiW3fx+xCjsfsHIm9ahFjasT2HHe tNTQBOl1t3RsIcjZQ7FmAfAGQ3+ZVOvxO4Zznq1kK0uudxeC97tCpmBBF16Y/y1W8PbO t/wtrgz5yLFf2LcoDKxnFl8wkcG1l/OWrfzaAVOwBhB6eWuSduR8yi7Cfq4vLCIe7O09 7qIw== X-Gm-Message-State: AEkoouvN7WmPTsvchGf8s0o92kwj6YdP45Wu56HFmqzNV8kGbXaHPm3FfMV0lEhCA3vOCA== X-Received: by 10.98.51.131 with SMTP id z125mr12847377pfz.109.1469611784836; Wed, 27 Jul 2016 02:29:44 -0700 (PDT) Received: from simonLocalRHEL7.cn.ibm.com ([106.38.0.83]) by smtp.gmail.com with ESMTPSA id d185sm7414109pfd.80.2016.07.27.02.29.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Jul 2016 02:29:44 -0700 (PDT) From: wei.guo.simon@gmail.com To: Michael Ellerman Subject: [PATCH v12 24/30] selftests/powerpc: Add ptrace tests for TAR, PPR, DSCR in suspended TM Date: Wed, 27 Jul 2016 17:26:49 +0800 Message-Id: <1469611615-2935-25-git-send-email-wei.guo.simon@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1469611615-2935-1-git-send-email-wei.guo.simon@gmail.com> References: <1469611615-2935-1-git-send-email-wei.guo.simon@gmail.com> X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jessica Yu , Michael Neuling , linux-kernel@vger.kernel.org, Kees Cook , Chris Smart , linux-kselftest@vger.kernel.org, Simon Guo , Shuah Khan , Rashmica Gupta , Ulrich Weigand , Paul Mackerras , Anton Blanchard , Suraj Jitindar Singh , Jiri Kosina , Andrew Morton , Miroslav Benes , linuxppc-dev@lists.ozlabs.org, Cyril Bur , Khem Raj , Anshuman Khandual MIME-Version: 1.0 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" From: Anshuman Khandual This patch adds ptrace interface test for TAR, PPR, DSCR registers inside suspended TM context. Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Michael Ellerman Cc: Shuah Khan Cc: Anton Blanchard Cc: Cyril Bur Cc: Anshuman Khandual Cc: Simon Guo Cc: Ulrich Weigand Cc: Michael Neuling Cc: Andrew Morton Cc: Kees Cook Cc: Rashmica Gupta Cc: Khem Raj Cc: Jessica Yu Cc: Jiri Kosina Cc: Miroslav Benes Cc: Suraj Jitindar Singh Cc: Chris Smart Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-kernel@vger.kernel.org Cc: linux-kselftest@vger.kernel.org Signed-off-by: Anshuman Khandual Signed-off-by: Simon Guo --- tools/testing/selftests/powerpc/ptrace/Makefile | 2 +- .../selftests/powerpc/ptrace/ptrace-tm-spd-tar.c | 195 +++++++++++++++++++++ 2 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c diff --git a/tools/testing/selftests/powerpc/ptrace/Makefile b/tools/testing/selftests/powerpc/ptrace/Makefile index 77d7a13..2916759 100644 --- a/tools/testing/selftests/powerpc/ptrace/Makefile +++ b/tools/testing/selftests/powerpc/ptrace/Makefile @@ -1,5 +1,5 @@ TEST_PROGS := ptrace-ebb ptrace-gpr ptrace-tm-gpr ptrace-tm-spd-gpr \ -ptrace-tar ptrace-tm-tar +ptrace-tar ptrace-tm-tar ptrace-tm-spd-tar all: $(TEST_PROGS) CFLAGS += -m64 diff --git a/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c b/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c new file mode 100644 index 0000000..da4c477 --- /dev/null +++ b/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c @@ -0,0 +1,195 @@ +/* + * Ptrace test for TAR, PPR, DSCR registers in the TM Suspend context + * + * Copyright (C) 2015 Anshuman Khandual, IBM Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#include "ptrace.h" +#include "ptrace-tar.h" + +int shm_id; +volatile int *cptr, *pptr; + +__attribute__((used)) void wait_parent(void) +{ + cptr[2] = 1; + while (!cptr[1]); +} + +void tm_spd_tar(void) +{ + unsigned long result, texasr; + unsigned long regs[3]; + int ret; + + cptr = (int *)shmat(shm_id, NULL, 0); + +trans: + cptr[2] = 0; + asm __volatile__( + "li 4, %[tar_1];" + "mtspr %[sprn_tar], 4;" /* TAR_1 */ + "li 4, %[dscr_1];" + "mtspr %[sprn_dscr], 4;" /* DSCR_1 */ + "or 31,31,31;" /* PPR_1*/ + + "1: ;" + TBEGIN + "beq 2f;" + + "li 4, %[tar_2];" + "mtspr %[sprn_tar], 4;" /* TAR_2 */ + "li 4, %[dscr_2];" + "mtspr %[sprn_dscr], 4;" /* DSCR_2 */ + "or 1,1,1;" /* PPR_2 */ + + TSUSPEND + "li 4, %[tar_3];" + "mtspr %[sprn_tar], 4;" /* TAR_3 */ + "li 4, %[dscr_3];" + "mtspr %[sprn_dscr], 4;" /* DSCR_3 */ + "or 6,6,6;" /* PPR_3 */ + "bl wait_parent;" + TRESUME + + TEND + "li 0, 0;" + "ori %[res], 0, 0;" + "b 3f;" + + /* Transaction abort handler */ + "2: ;" + "li 0, 1;" + "ori %[res], 0, 0;" + "mfspr %[texasr], %[sprn_texasr];" + + "3: ;" + + : [res] "=r" (result), [texasr] "=r" (texasr) + : [val] "r" (cptr[1]), [sprn_dscr]"i"(SPRN_DSCR), + [sprn_tar]"i"(SPRN_TAR), [sprn_ppr]"i"(SPRN_PPR), + [sprn_texasr]"i"(SPRN_TEXASR), [tar_1]"i"(TAR_1), + [dscr_1]"i"(DSCR_1), [tar_2]"i"(TAR_2), [dscr_2]"i"(DSCR_2), + [tar_3]"i"(TAR_3), [dscr_3]"i"(DSCR_3) + : "memory", "r0", "r1", "r3", "r4", "r5", "r6" + ); + + /* TM failed, analyse */ + if (result) { + if (!cptr[0]) + goto trans; + + regs[0] = mfspr(SPRN_TAR); + regs[1] = mfspr(SPRN_PPR); + regs[2] = mfspr(SPRN_DSCR); + + shmdt(&cptr); + printf("%-30s TAR: %lu PPR: %lx DSCR: %lu\n", + user_read, regs[0], regs[1], regs[2]); + + ret = validate_tar_registers(regs, TAR_4, PPR_4, DSCR_4); + if (ret) + exit(1); + exit(0); + } + shmdt(&cptr); + exit(1); +} + +int trace_tm_spd_tar(pid_t child) +{ + unsigned long regs[3]; + int ret; + + ret = start_trace(child); + if (ret) + return TEST_FAIL; + + ret = show_tar_registers(child, regs); + if (ret) + return TEST_FAIL; + + printf("%-30s TAR: %lu PPR: %lx DSCR: %lu\n", + ptrace_read_running, regs[0], regs[1], regs[2]); + + ret = validate_tar_registers(regs, TAR_3, PPR_3, DSCR_3); + if (ret) + return TEST_FAIL; + + ret = show_tm_checkpointed_state(child, regs); + if (ret) + return TEST_FAIL; + + printf("%-30s TAR: %lu PPR: %lx DSCR: %lu\n", + ptrace_read_ckpt, regs[0], regs[1], regs[2]); + + ret = validate_tar_registers(regs, TAR_1, PPR_1, DSCR_1); + if (ret) + return TEST_FAIL; + + ret = write_ckpt_tar_registers(child, TAR_4, PPR_4, DSCR_4); + if (ret) + return TEST_FAIL; + + printf("%-30s TAR: %u PPR: %lx DSCR: %u\n", + ptrace_write_ckpt, TAR_4, PPR_4, DSCR_4); + + pptr[0] = 1; + pptr[1] = 1; + ret = stop_trace(child); + if (ret) + return TEST_FAIL; + return TEST_PASS; +} + +int ptrace_tm_spd_tar(void) +{ + pid_t pid; + int ret, status; + + SKIP_IF(!((long)get_auxv_entry(AT_HWCAP2) & PPC_FEATURE2_HTM)); + shm_id = shmget(IPC_PRIVATE, sizeof(int) * 3, 0777|IPC_CREAT); + pid = fork(); + if (pid == 0) + tm_spd_tar(); + + pptr = (int *)shmat(shm_id, NULL, 0); + pptr[0] = 0; + pptr[1] = 0; + + if (pid) { + while (!pptr[2]); + ret = trace_tm_spd_tar(pid); + if (ret) { + kill(pid, SIGTERM); + shmdt(&pptr); + shmctl(shm_id, IPC_RMID, NULL); + return TEST_FAIL; + } + + shmdt(&pptr); + + ret = wait(&status); + shmctl(shm_id, IPC_RMID, NULL); + if (ret != pid) { + printf("Child's exit status not captured\n"); + return TEST_FAIL; + } + + if (WIFEXITED(status)) { + if (WEXITSTATUS(status)) + return TEST_FAIL; + } + return TEST_PASS; + } + return TEST_PASS; +} + +int main(int argc, char *argv[]) +{ + return test_harness(ptrace_tm_spd_tar, "ptrace_tm_spd_tar"); +}