From patchwork Tue Mar 13 12:01:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Janosch Frank X-Patchwork-Id: 10278381 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B556360231 for ; Tue, 13 Mar 2018 12:02:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A619B284DA for ; Tue, 13 Mar 2018 12:02:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9945D286F1; Tue, 13 Mar 2018 12:02:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 76913284DA for ; Tue, 13 Mar 2018 12:02:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932864AbeCMMCc (ORCPT ); Tue, 13 Mar 2018 08:02:32 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:38246 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932789AbeCMMCb (ORCPT ); Tue, 13 Mar 2018 08:02:31 -0400 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w2DC2RXv112892 for ; Tue, 13 Mar 2018 08:02:31 -0400 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 2gpckymw1v-1 (version=TLSv1.2 cipher=AES256-SHA256 bits=256 verify=NOT) for ; Tue, 13 Mar 2018 08:02:30 -0400 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 13 Mar 2018 12:02:26 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 13 Mar 2018 12:02:24 -0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w2DC2O8d60555414; Tue, 13 Mar 2018 12:02:24 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B541C5204C; Tue, 13 Mar 2018 10:53:55 +0000 (GMT) Received: from s38lp20.boeblingen.de.ibm.com (unknown [9.145.6.90]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 2CC665204F; Tue, 13 Mar 2018 10:53:53 +0000 (GMT) From: Janosch Frank To: kvm@vger.kernel.org Cc: thuth@redhat.com, david@redhat.com Subject: [kvm-unit-tests PATCH 3/8] s390x: Add storage keys tests Date: Tue, 13 Mar 2018 13:01:38 +0100 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1520942503-6163-1-git-send-email-frankja@linux.vnet.ibm.com> References: <1520942503-6163-1-git-send-email-frankja@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18031312-0008-0000-0000-000004DBF543 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18031312-0009-0000-0000-00001E6F27B6 Message-Id: <1520942503-6163-4-git-send-email-frankja@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-03-13_06:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1803130143 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Storage keys are not used by Linux anymore, so let's show them some love and test if the basics still work. Signed-off-by: Janosch Frank --- lib/s390x/asm/mem.h | 61 ++++++++++++++++++++++++++++++++++ s390x/Makefile | 1 + s390x/skey.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ s390x/unittests.cfg | 3 ++ 4 files changed, 159 insertions(+) create mode 100644 lib/s390x/asm/mem.h create mode 100644 s390x/skey.c diff --git a/lib/s390x/asm/mem.h b/lib/s390x/asm/mem.h new file mode 100644 index 0000000..28772b0 --- /dev/null +++ b/lib/s390x/asm/mem.h @@ -0,0 +1,61 @@ +/* + * Physical memory management related functions and definitions. + * + * Copyright IBM Corp. 2017 + * Author(s): Janosch Frank + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU Library General Public License version 2. + */ +#ifndef _ASM_S390_MEM_H +#define _ASM_S390_MEM_H + +union skey { + struct { + uint8_t acc : 4; + uint8_t fp : 1; + uint8_t rf : 1; + uint8_t ch : 1; + uint8_t pad : 1; + } str; + uint8_t val; +}; + +static inline void set_storage_key(unsigned long addr, + unsigned char skey, + int nq) +{ + if (nq && test_facility(14)) + asm volatile(".insn rrf,0xb22b0000,%0,%1,8,0" + : : "d" (skey), "a" (addr)); + else + asm volatile("sske %0,%1" : : "d" (skey), "a" (addr)); +} + +static inline unsigned long set_storage_key_mb(unsigned long addr, + unsigned char skey) +{ + if (!test_facility(8)) + return 0; + + /* As we only have one cpu and no concurrent skey changes, + * we're able to use the non-quescing option (if available) to + * speed things up a little. + */ + if (test_facility(14)) + asm volatile(".insn rrf,0xb22b0000,%[skey],%[addr],9,0" + : [addr] "+a" (addr) : [skey] "d" (skey)); + else + asm volatile(".insn rrf,0xb22b0000,%[skey],%[addr],1,0" + : [addr] "+a" (addr) : [skey] "d" (skey)); + return addr; +} + +static inline unsigned char get_storage_key(unsigned long addr) +{ + unsigned char skey; + + asm volatile("iske %0,%1" : "=d" (skey) : "a" (addr)); + return skey; +} +#endif diff --git a/s390x/Makefile b/s390x/Makefile index e062727..b73031d 100644 --- a/s390x/Makefile +++ b/s390x/Makefile @@ -3,6 +3,7 @@ tests += $(TEST_DIR)/intercept.elf tests += $(TEST_DIR)/emulator.elf tests += $(TEST_DIR)/sieve.elf tests += $(TEST_DIR)/sthyi.elf +tests += $(TEST_DIR)/skey.elf all: directories test_cases diff --git a/s390x/skey.c b/s390x/skey.c new file mode 100644 index 0000000..e33e0e3 --- /dev/null +++ b/s390x/skey.c @@ -0,0 +1,94 @@ +/* + * Storage key tests + * + * Copyright (c) 2017 IBM Corp + * + * Authors: + * Janosch Frank + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU Library General Public License version 2. + */ +#include +#include +#include +#include +#include +#include + + +static uint8_t pagebuf[PAGE_SIZE * 2] __attribute__((aligned(PAGE_SIZE * 2))); +const unsigned long page0 = (unsigned long)pagebuf; +const unsigned long page1 = (unsigned long)(pagebuf + PAGE_SIZE); + +static void test_set_mb(void) +{ + union skey skey, ret1, ret2; + unsigned long addr = 0x10000 - 2 * PAGE_SIZE; + unsigned long end = 0x10000; + + /* Multi block support came with EDAT 1 */ + if (!test_facility(8)) + return; + + skey.val = 0x30; + while (addr < end) + addr = set_storage_key_mb(addr, skey.val); + + ret1.val = get_storage_key(end - PAGE_SIZE); + ret2.val = get_storage_key(end - PAGE_SIZE * 2); + report("multi block", ret1.val == ret2.val && ret1.val == skey.val); +} + +static void test_chg(void) +{ + union skey skey1, skey2; + + skey1.val = 0x30; + set_storage_key(page0, skey1.val, 0); + skey1.val = get_storage_key(page0); + pagebuf[0] = 3; + skey2.val = get_storage_key(page0); + report("chg bit test", !skey1.str.ch && skey2.str.ch); +} + +static void test_set(void) +{ + union skey skey, ret; + + skey.val = 0x30; + ret.val = get_storage_key(page0); + set_storage_key(page0, skey.val, 0); + ret.val = get_storage_key(page0); + report("set key test", skey.val == ret.val); +} + +static void test_priv(void) +{ + union skey skey; + + memset(pagebuf, 0, PAGE_SIZE * 2); + expect_pgm_int(); + enter_pstate(); + set_storage_key(page0, 0x30, 0); + check_pgm_int_code(PGM_INT_CODE_PRIVILEGED_OPERATION); + + skey.val = get_storage_key(page0); + report("skey did not change on exception", skey.str.acc != 3); + + expect_pgm_int(); + enter_pstate(); + get_storage_key(page0); + check_pgm_int_code(PGM_INT_CODE_PRIVILEGED_OPERATION); +} + +int main(void) +{ + report_prefix_push("skey"); + test_priv(); + test_set(); + test_set_mb(); + test_chg(); + report_prefix_pop(); + return report_summary(); +} diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg index 506891a..8321e9b 100644 --- a/s390x/unittests.cfg +++ b/s390x/unittests.cfg @@ -38,3 +38,6 @@ timeout = 600 [sthyi] file = sthyi.elf accel = kvm + +[skey] +file = skey.elf