Received: by 10.223.185.116 with SMTP id b49csp1383078wrg; Wed, 21 Feb 2018 18:03:01 -0800 (PST) X-Google-Smtp-Source: AH8x227q+klD2piT96YWZmrqX5dmkztRWlUuWCfGy6L2IR9WUv3M4SpiU4L0AV+bwApKwGTmur9c X-Received: by 10.99.0.147 with SMTP id 141mr4343724pga.364.1519264981864; Wed, 21 Feb 2018 18:03:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519264981; cv=none; d=google.com; s=arc-20160816; b=YZ/mLjqUu20SB9mSdhCtzY6Feq8WP0ldIN2yWZgiRRO6Y3T7b7dE8vQQZBqjNKrNy8 kpPyVqCPzPUjxobeA+WnDVFPVPmjBlXUL2ZbYjMhZvxSCGDprsx801SAWwxERLw3FoN8 GMC9uMkYyaYmBkNWWV2TkFbqEfw463kq19tWINFOKfEcobyXT1CmoIcACs7F02Bjyrsl HIiL9IN9Cg2LTPDYMznjuzwdsMwWO/RK3QjdKiKK8i8duPfmI8vS2q8Ksg2bF0Dnvm++ LNOWm231+BHbMaDSmBIMm1QhNhRrhriT2c5qcTfiJj+VZYsOm7HJk16WqUKLaeSigc6f TZWg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=sPH6Gm7ufadCFucxJkSIe6XdA5ca7Au6tw2OJHZZVXg=; b=a8gmpW5Q0cBl4tjcTLEuon1nxcFQsWf8uqV9sudy8hb4zJ/+kCNAP/zbCWyUZPtQ3L f8PofmZSqcFKh7k7rcZmwigfknT95nfiSFXe1KqzGkoCpTnSim1SUiGzEijiI3y+IVgB jskyDb6xD00kvYduRB+4i/mYL5kVa6wqQoHybmUskXrqdX91LjO8QFStpeXs1JGiWTmO 7DnLd5jp2OUlmb1hS5kjah4OBN0F7nLdVtS6ND/ggAiwjl26WRV5YfZZtIxR+WuGVxPz i8kRAcOb+ABCtxQ8KxBHc0j4225Y6uqnXuw2P5J24ah9S5QKfaqq8F+p6lcFzUrpOZhJ bw/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=UIaAFKDv; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i66si724745pgc.445.2018.02.21.18.02.47; Wed, 21 Feb 2018 18:03:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=UIaAFKDv; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752138AbeBVCBo (ORCPT + 99 others); Wed, 21 Feb 2018 21:01:44 -0500 Received: from mail-qk0-f194.google.com ([209.85.220.194]:38683 "EHLO mail-qk0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751901AbeBVB43 (ORCPT ); Wed, 21 Feb 2018 20:56:29 -0500 Received: by mail-qk0-f194.google.com with SMTP id s198so4628276qke.5; Wed, 21 Feb 2018 17:56:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=sPH6Gm7ufadCFucxJkSIe6XdA5ca7Au6tw2OJHZZVXg=; b=UIaAFKDvwEy4zovXLFFVyvM4HkQckCNNY/7i1ASeoTRJ6BKkrY38Vy6o7yxQB4dp7X 3lbcJq6PWApCQ6uMsGZ7FVU/q/C0nEr0zuePTyl8QBK7mfsKWUOX85QFmsJpMG6WIOqC zkX9ENv1cclHwASE3XOy2CUtmuGJBqJPQYTSxAS3kyYbdTeWJ21WhZcghfIpLyRW40ed A8l4XmpBUlNI0j6rG//xA+D/1nlXjh8ouIXjptNMKwDcrot562uP1eQLFgJdHAaGsGlN 57XYY1hDQfd08f2NKoQrSOMekwkqORq1mEA2ZAl8TPlLI0AgTw9EdE4I1slFR/housmF 6lQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=sPH6Gm7ufadCFucxJkSIe6XdA5ca7Au6tw2OJHZZVXg=; b=AXlEl3T6Dn2TNafevR89WtM1noaSBAhDVS8USDNxxs3RBtt5gh5JaPAE/tEwv/uD1k 6iH1qmhTsenJX+lTxjSOjyB6S6vaEhdRdGfN8gFlTNXEOMugSap7iJYHm2MdvvLsllIJ zp4HSrJtHglEEWWXGWuxPBE2kWLVPjg25RPeS3E6q6Bze5PI7zGpoa39jRWCAdOBtqNH L0NSJ/bDxxW80/ZWCUbuDqrI4auBM8XRrmT2HEjnnvDD3jD1TD6Sf1QGO73lKPiCJnDe DSigqBRJqgEqKAIuxHz+b8RwDWUNF9ncfRqnz1sR9kx6KxUr9CqoGXYwwGMV0r9Nj6EP V6Xg== X-Gm-Message-State: APf1xPBfeikJwMipKJnym1L0vbN+rlLGSR2gl0t+XqfeSOIDimh3y4GF UH29ZrIbF9/zirCIOXlw/Wc= X-Received: by 10.55.1.78 with SMTP id 75mr7909504qkb.310.1519264588688; Wed, 21 Feb 2018 17:56:28 -0800 (PST) Received: from localhost.localdomain (50-39-100-161.bvtn.or.frontiernet.net. [50.39.100.161]) by smtp.gmail.com with ESMTPSA id n29sm14182630qtf.18.2018.02.21.17.56.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Feb 2018 17:56:28 -0800 (PST) From: Ram Pai To: shuahkh@osg.samsung.com, linux-kselftest@vger.kernel.org Cc: mpe@ellerman.id.au, linuxppc-dev@lists.ozlabs.org, linux-mm@kvack.org, x86@kernel.org, linux-arch@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, mingo@redhat.com, akpm@linux-foundation.org, dave.hansen@intel.com, benh@kernel.crashing.org, paulus@samba.org, khandual@linux.vnet.ibm.com, aneesh.kumar@linux.vnet.ibm.com, bsingharora@gmail.com, hbabu@us.ibm.com, mhocko@kernel.org, bauerman@linux.vnet.ibm.com, ebiederm@xmission.com, linuxram@us.ibm.com, arnd@arndb.de Subject: [PATCH v12 05/22] selftests/vm: generic function to handle shadow key register Date: Wed, 21 Feb 2018 17:55:24 -0800 Message-Id: <1519264541-7621-6-git-send-email-linuxram@us.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1519264541-7621-1-git-send-email-linuxram@us.ibm.com> References: <1519264541-7621-1-git-send-email-linuxram@us.ibm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org helper functions to handler shadow pkey register cc: Dave Hansen cc: Florian Weimer Signed-off-by: Ram Pai --- tools/testing/selftests/vm/pkey-helpers.h | 27 ++++++++++++++++++++ tools/testing/selftests/vm/protection_keys.c | 34 ++++++++++++++++--------- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/vm/pkey-helpers.h b/tools/testing/selftests/vm/pkey-helpers.h index b6c2133..7c979ad 100644 --- a/tools/testing/selftests/vm/pkey-helpers.h +++ b/tools/testing/selftests/vm/pkey-helpers.h @@ -44,6 +44,33 @@ #define DEBUG_LEVEL 0 #endif #define DPRINT_IN_SIGNAL_BUF_SIZE 4096 + +static inline u32 pkey_to_shift(int pkey) +{ + return pkey * PKEY_BITS_PER_PKEY; +} + +static inline pkey_reg_t reset_bits(int pkey, pkey_reg_t bits) +{ + u32 shift = pkey_to_shift(pkey); + + return ~(bits << shift); +} + +static inline pkey_reg_t left_shift_bits(int pkey, pkey_reg_t bits) +{ + u32 shift = pkey_to_shift(pkey); + + return (bits << shift); +} + +static inline pkey_reg_t right_shift_bits(int pkey, pkey_reg_t bits) +{ + u32 shift = pkey_to_shift(pkey); + + return (bits >> shift); +} + extern int dprint_in_signal; extern char dprint_in_signal_buffer[DPRINT_IN_SIGNAL_BUF_SIZE]; static inline void sigsafe_printf(const char *format, ...) diff --git a/tools/testing/selftests/vm/protection_keys.c b/tools/testing/selftests/vm/protection_keys.c index 3ef2569..83216c5 100644 --- a/tools/testing/selftests/vm/protection_keys.c +++ b/tools/testing/selftests/vm/protection_keys.c @@ -374,7 +374,7 @@ u32 pkey_get(int pkey, unsigned long flags) __func__, pkey, flags, 0, 0); dprintf2("%s() raw pkey_reg: %x\n", __func__, pkey_reg); - shifted_pkey_reg = (pkey_reg >> (pkey * PKEY_BITS_PER_PKEY)); + shifted_pkey_reg = right_shift_bits(pkey, pkey_reg); dprintf2("%s() shifted_pkey_reg: %x\n", __func__, shifted_pkey_reg); masked_pkey_reg = shifted_pkey_reg & mask; dprintf2("%s() masked pkey_reg: %x\n", __func__, masked_pkey_reg); @@ -397,9 +397,9 @@ int pkey_set(int pkey, unsigned long rights, unsigned long flags) /* copy old pkey_reg */ new_pkey_reg = old_pkey_reg; /* mask out bits from pkey in old value: */ - new_pkey_reg &= ~(mask << (pkey * PKEY_BITS_PER_PKEY)); + new_pkey_reg &= reset_bits(pkey, mask); /* OR in new bits for pkey: */ - new_pkey_reg |= (rights << (pkey * PKEY_BITS_PER_PKEY)); + new_pkey_reg |= left_shift_bits(pkey, rights); __wrpkey_reg(new_pkey_reg); @@ -430,7 +430,7 @@ void pkey_disable_set(int pkey, int flags) ret = pkey_set(pkey, pkey_rights, syscall_flags); assert(!ret); /*pkey_reg and flags have the same format */ - shadow_pkey_reg |= flags << (pkey * 2); + shadow_pkey_reg |= left_shift_bits(pkey, flags); dprintf1("%s(%d) shadow: 0x%016lx\n", __func__, pkey, shadow_pkey_reg); @@ -465,7 +465,7 @@ void pkey_disable_clear(int pkey, int flags) ret = pkey_set(pkey, pkey_rights, 0); /* pkey_reg and flags have the same format */ - shadow_pkey_reg &= ~(flags << (pkey * 2)); + shadow_pkey_reg &= reset_bits(pkey, flags); pkey_assert(ret >= 0); pkey_rights = pkey_get(pkey, syscall_flags); @@ -523,6 +523,21 @@ int sys_pkey_alloc(unsigned long flags, unsigned long init_val) return ret; } +void pkey_setup_shadow(void) +{ + shadow_pkey_reg = __rdpkey_reg(); +} + +void pkey_reset_shadow(u32 key) +{ + shadow_pkey_reg &= reset_bits(key, 0x3); +} + +void pkey_set_shadow(u32 key, u64 init_val) +{ + shadow_pkey_reg |= left_shift_bits(key, init_val); +} + int alloc_pkey(void) { int ret; @@ -540,7 +555,7 @@ int alloc_pkey(void) shadow_pkey_reg); if (ret) { /* clear both the bits: */ - shadow_pkey_reg &= ~(0x3 << (ret * 2)); + pkey_reset_shadow(ret); dprintf4("%s()::%d, ret: %d pkey_reg: 0x%016lx " "shadow: 0x%016lx\n", __func__, @@ -550,7 +565,7 @@ int alloc_pkey(void) * move the new state in from init_val * (remember, we cheated and init_val == pkey_reg format) */ - shadow_pkey_reg |= (init_val << (ret * 2)); + pkey_set_shadow(ret, init_val); } dprintf4("%s()::%d, ret: %d pkey_reg: 0x%016lx shadow: 0x%016lx\n", __func__, __LINE__, ret, __rdpkey_reg(), @@ -1322,11 +1337,6 @@ void run_tests_once(void) iteration_nr++; } -void pkey_setup_shadow(void) -{ - shadow_pkey_reg = __rdpkey_reg(); -} - int main(void) { int nr_iterations = 22; -- 1.7.1