From patchwork Mon May 29 10:06:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Huth X-Patchwork-Id: 9753061 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 7D6C360249 for ; Mon, 29 May 2017 10:06:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6FB3A2846B for ; Mon, 29 May 2017 10:06:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 646612846F; Mon, 29 May 2017 10:06:42 +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 D2BCC2846B for ; Mon, 29 May 2017 10:06:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750885AbdE2KGj (ORCPT ); Mon, 29 May 2017 06:06:39 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42966 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750846AbdE2KGj (ORCPT ); Mon, 29 May 2017 06:06:39 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 74739C04B316; Mon, 29 May 2017 10:06:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 74739C04B316 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=thuth@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 74739C04B316 Received: from thh440s.redhat.com (ovpn-117-18.ams2.redhat.com [10.36.117.18]) by smtp.corp.redhat.com (Postfix) with ESMTP id 02AA060F8F; Mon, 29 May 2017 10:06:34 +0000 (UTC) From: Thomas Huth To: David Hildenbrand , kvm@vger.kernel.org Cc: Christian Borntraeger , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= Subject: [kvm-unit-tests PATCH] s390x: Interception tests Date: Mon, 29 May 2017 12:06:34 +0200 Message-Id: <1496052394-20389-1-git-send-email-thuth@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 29 May 2017 10:06:38 +0000 (UTC) Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Certain CPU instructions will cause an exit of the virtual machine. Run some of these instructions to check whether they are emulated right by KVM (or QEMU). Signed-off-by: Thomas Huth --- Note: This is the initial framework for running interception tests ... more test will be added later (like testing exceptions once we've got the infrastructure for this in place). For running this test with QEMU TCG, you need to apply the patch for the TEST BLOCK instruction which has not been merged yet: https://lists.gnu.org/archive/html/qemu-devel/2017-05/msg04413.html s390x/Makefile | 1 + s390x/intercept.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 s390x/intercept.c diff --git a/s390x/Makefile b/s390x/Makefile index e80add0..97745a1 100644 --- a/s390x/Makefile +++ b/s390x/Makefile @@ -1,4 +1,5 @@ tests = $(TEST_DIR)/selftest.elf +tests += $(TEST_DIR)/intercept.elf all: directories test_cases diff --git a/s390x/intercept.c b/s390x/intercept.c new file mode 100644 index 0000000..b0057e3 --- /dev/null +++ b/s390x/intercept.c @@ -0,0 +1,99 @@ +/* + * Interception tests - for s390x CPU instruction that cause a VM exit + * + * Copyright (c) 2017 Red Hat Inc + * + * Authors: + * Thomas Huth + * + * 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 + +static uint8_t pagebuf[PAGE_SIZE * 2] __attribute__((aligned(PAGE_SIZE))); + +/* Test the SET PREFIX and STORE PREFIX instructions */ +static void test_prefix(void) +{ + uint32_t old_prefix; + uint32_t new_prefix = (uint32_t)(intptr_t)pagebuf; + + memset(pagebuf, 0, PAGE_SIZE * 2); + + /* + * Temporarily change the prefix page to our buffer, and store + * some facility bits there ... at least some of them should be + * set in our buffer afterwards. + */ + asm volatile ( + " stpx %0\n" + " spx %1\n" + " stfl 0\n" + " spx %0\n" + : "=m"(old_prefix) : "m"(new_prefix) : "memory"); + report("spx + stfl", pagebuf[200] != 0); +} + +/* Test the STORE CPU ADDRESS instruction */ +static void test_stap(void) +{ + uint16_t cpuid; + + cpuid = 0xffff; + asm volatile ("stap %0\n" : "+m"(cpuid)); + report("get cpu id", cpuid != 0xffff); +} + +/* Test the TEST BLOCK instruction */ +static void test_testblock(void) +{ + int cc; + + memset(pagebuf, 0xaa, PAGE_SIZE); + + asm volatile ( + " lghi 0,0\n" + " tb %1\n" + " ipm %0\n" + " srl %0,28\n" + : "=d" (cc) + : "a"(pagebuf + 0x123) + : "memory", "0", "cc"); + report("page cleared", + cc == 0 && pagebuf[0] == 0 && pagebuf[PAGE_SIZE - 1] == 0); +} + +struct { + const char *name; + void (*func)(void); +} tests[] = { + { "prefix", test_prefix }, + { "stap", test_stap }, + { "testblock", test_testblock }, + { NULL, NULL } +}; + +int main(int argc, char **argv) +{ + int all = 0; + int i; + + report_prefix_push("intercept"); + + if (argc < 2 || (argc == 2 && !strcmp(argv[1], "all"))) + all = 1; + + for (i = 0; tests[i].name != NULL; i++) { + report_prefix_push(tests[i].name); + if (all || strcmp(argv[1], tests[i].name) == 0) { + tests[i].func(); + } + report_prefix_pop(); + } + + report_prefix_pop(); + + return report_summary(); +}