From patchwork Thu Mar 16 00:31:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ackerley Tng X-Patchwork-Id: 13176861 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id EAA4AC6FD1D for ; Thu, 16 Mar 2023 00:31:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 39EA46B0095; Wed, 15 Mar 2023 20:31:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2FF4E6B0098; Wed, 15 Mar 2023 20:31:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 12B546B0099; Wed, 15 Mar 2023 20:31:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 0436C6B0095 for ; Wed, 15 Mar 2023 20:31:35 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id CE30E81379 for ; Thu, 16 Mar 2023 00:31:34 +0000 (UTC) X-FDA: 80572882908.10.12201C8 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) by imf23.hostedemail.com (Postfix) with ESMTP id 1649414000B for ; Thu, 16 Mar 2023 00:31:32 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=W0G3AmVB; spf=pass (imf23.hostedemail.com: domain of 3Y2MSZAsKCJo46E8LF8SNHAAIIAF8.6IGFCHOR-GGEP46E.ILA@flex--ackerleytng.bounces.google.com designates 209.85.215.201 as permitted sender) smtp.mailfrom=3Y2MSZAsKCJo46E8LF8SNHAAIIAF8.6IGFCHOR-GGEP46E.ILA@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1678926693; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=YxU1hhaZ4SyfL9lxoIcMNBPPAq0yfPS0xuipesTDclo=; b=t0G81g6n571N+jm1rDy+b5jYvgZpkB4dSj2lFUxpp3rzJyXFko+AnkGfjlJXZ3G8EAtEzX ZnUKipl4LpXxdWL5YhM2aWQNQx29u/BKmrvIq1+cXzMyqk313bhvt9x5InMlbUe4hZX6ON i48d9bfyrAQXrlwA+jgcFX3pWggHwNo= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=W0G3AmVB; spf=pass (imf23.hostedemail.com: domain of 3Y2MSZAsKCJo46E8LF8SNHAAIIAF8.6IGFCHOR-GGEP46E.ILA@flex--ackerleytng.bounces.google.com designates 209.85.215.201 as permitted sender) smtp.mailfrom=3Y2MSZAsKCJo46E8LF8SNHAAIIAF8.6IGFCHOR-GGEP46E.ILA@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1678926693; a=rsa-sha256; cv=none; b=SgafrMq39RNiTrw5//4FOreSN/r8P8z1TYkzYzoK9fS+tOKui5Kv9AfntEKc65zj/9T+h4 ploIh9R/I7x3bBvjdCjKWT/nx9ltkvo5BUQXmhR8N6uKsoMwqwbooQ/xPoJocSecuVD+zX xYFA0/Goy1zKSmWLugUKBzAjDRbFeYI= Received: by mail-pg1-f201.google.com with SMTP id m12-20020a6562cc000000b0050bdfabc8e2so15878pgv.9 for ; Wed, 15 Mar 2023 17:31:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; t=1678926692; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=YxU1hhaZ4SyfL9lxoIcMNBPPAq0yfPS0xuipesTDclo=; b=W0G3AmVBhmaEPW1mzeOzfktEstHk/ayT4Fca4WpYB+uqnQXqFONecZpHfNEM3EVkI8 dMoU+aBolGRnKrvqkSWbCeJFkilUlbcTqWcVH0y2O7kmHEk9EOK0BEV0KFKuPFrnCkbs QOotzJYDWHJggJes5/KIvM96osSnaCvae3qKB3LUHRBB+uNwEOmmHmd8zvTbRGoEVjUL rVFdyBsTEprlo4ciiWa3+M8yKhD16Tn+oY0bqfI0h7Rz5RgpgT08FQynab2lujb51lp7 x7X7TlFctPEGFqxyshGyufJ1XL1Zen+FPj5jvwOG/5BAnYWpY1i72h9z5SjlNs7jYsNa hwdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678926692; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YxU1hhaZ4SyfL9lxoIcMNBPPAq0yfPS0xuipesTDclo=; b=YV9V9aYkTmxzHWlrsruRNaMM0VmWOEvzp2VCES3Awuc4jL5u5k6UW3mp2oS/+F+zCX Ggi4lWFW7i3tlWm0ZicpfgvZ05Q2YNAM41M2PxHtTtK4S0seCgluLQTgA2PODnhofzWM CzbkjfkAlhyVtcMkv5aIglELqOnL/sYgkZZqASh6DDlPRjuTujkLvUuryGIPl6ukR/Lp NU6rGYD4tJ/H/pehvAgnyL+KoYiG+QnQ6uFEfaz88chZzMa32mslJorLEX8caGKk3RAY JvCXG7+uOIAi9GC5MdnSBXDqljOSuxiRDZHt0Lq4/4YsYQQ1qQHe2xA4dI6msHSpQv8v ZXeg== X-Gm-Message-State: AO0yUKX5jHsfVzthOh0HRaISl6sCde/n9pSHSCjrYV33O+U+OYLPHN9z Iw4IWH4ZOvHgr6VhlhaRB+ccADLh1nwcCzwgfQ== X-Google-Smtp-Source: AK7set/r1L80ZGqvN1Jqjj7ZwUbt+f+1AOqGwiuE9AJvattpTxM2ZIa1Wyqx7LP6pavKwLlYqhK3jR4rdgiNHjRokg== X-Received: from ackerleytng-cloudtop.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:1f5f]) (user=ackerleytng job=sendgmr) by 2002:a65:530d:0:b0:502:fd12:83ce with SMTP id m13-20020a65530d000000b00502fd1283cemr347381pgq.5.1678926691968; Wed, 15 Mar 2023 17:31:31 -0700 (PDT) Date: Thu, 16 Mar 2023 00:31:03 +0000 In-Reply-To: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.40.0.rc2.332.ga46443480c-goog Message-ID: <90aaa4ab85fa5e3d5641793e2a4873282eb16556.1678926164.git.ackerleytng@google.com> Subject: [RFC PATCH 10/10] KVM: selftests: Test KVM exit behavior for private memory/access From: Ackerley Tng To: kvm@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, qemu-devel@nongnu.org Cc: aarcange@redhat.com, ak@linux.intel.com, akpm@linux-foundation.org, arnd@arndb.de, bfields@fieldses.org, bp@alien8.de, chao.p.peng@linux.intel.com, corbet@lwn.net, dave.hansen@intel.com, david@redhat.com, ddutile@redhat.com, dhildenb@redhat.com, hpa@zytor.com, hughd@google.com, jlayton@kernel.org, jmattson@google.com, joro@8bytes.org, jun.nakajima@intel.com, kirill.shutemov@linux.intel.com, linmiaohe@huawei.com, luto@kernel.org, mail@maciej.szmigiero.name, mhocko@suse.com, michael.roth@amd.com, mingo@redhat.com, naoya.horiguchi@nec.com, pbonzini@redhat.com, qperret@google.com, rppt@kernel.org, seanjc@google.com, shuah@kernel.org, steven.price@arm.com, tabba@google.com, tglx@linutronix.de, vannapurve@google.com, vbabka@suse.cz, vkuznets@redhat.com, wanpengli@tencent.com, wei.w.wang@intel.com, x86@kernel.org, yu.c.zhang@linux.intel.com, Ackerley Tng X-Stat-Signature: 6jurbcj4iubpf9czxipu71c14wf4z5db X-Rspam-User: X-Rspamd-Queue-Id: 1649414000B X-Rspamd-Server: rspam06 X-HE-Tag: 1678926692-853810 X-HE-Meta: U2FsdGVkX19+xahzLbphql5kCFCLSFiSdXv/WeRYB5gbwGIf5ivARP9OFYMX68jYRZtalMSFijlKMGnmmrjj1BZnYas+Co4LGTe+rme8Cy7iQkNQpvQAhmug811tosxV2he3AsB9VRcojFO08lnHvHgV/tN1eRlvIjWjJKT22hVEDCZBJz7/XOFJRCTEi4wzE+5I6jzCcRWu5tvV0FATMnIYcCAnI6jOm5cMZPwqa8lHNRkXD26t5PBXt68KEsLroku8e+YmmFrVYeweESRN0pW8h/vUHCOx6Uhtj3t5ypZYd/24q1ytGQBHafXRb0RatdadxbvLNK28MJSo1nFL5sXVRzOyR68afAnncSWyrGUdcfVID+jMvDp0x+/T6Y5WLSr7TDW45OROeS07sZBsHl8CNR/b06U3fK784fPb9xKMYWWvED7VsyculxSS5pOVF0AVg01Q+8GoFNMcmj55fQ74dbAQlBjFYR9wXAdihpQD3NH2gBjkYX6H6gtb5QfbkYsoBTguVMONh5jg90TYAO/6g8pAKW1Gi3mMJOcJ76UbcRiiWTTevfzFSXWGf8flPWpfPQucOMnH4CIZ2iqeuRV3Mz8SaUJXfR7qcfjk5iHuG4VC0QjWwgjDFGcsE6oWcPRH+BAH9JpG4YBqMVCYtxHaHQgF8zGMBQs+HRmi7zlk6Z2jf/rSepH2itKZNUhrY8HST72FygjykmeBz9xXJ1jh9LUMI+7gd6+GO5cHO7V0cIauNK5BJmW+G3rS0ER7pYbToMM32TR0/fqfEt4U5bpcPgcQ1u1ULxhCoLSsVOkC22LamfSQoLk7h836ktj489OcgBe9yDyYdk5zEAZltGp1zQ/zrD9rMSay3YNKgNpfqnvt12s5PmgYXzAK8syuajXDJQxsYZnGxe19yCVNjNmgG6uHmW7sBBBBTh37LbZcz9W0nxD+252g3kkKY+nF6AOVbObW+iRtTJgs960 iTdAegOn lQDmeIAsXavvUR2lOLJB6+TWiuqFAf0Aad+zyzURNqiMOhv60SG0Tzn6TwMiKE6ESz8YHDgxUfH2MUbvzIllOIIBXZXMwajDWeN5vqPKEZkvapDX7TnIjdLfMuUYpc1Obn15NXvLwWoy//n3qULhas/dfJezD6q0dAjHZdqXKN7Edj59Ho6UFatfMT9x9jPERqwgws2SmdziVW1kl+jMBf/j2OJnnQzkIHgyVqXoPTpLP2Gi8Ti0QL4FE0Tr+bq/C8FdWBkcMYohTcAWpBXl4sZFCg0GINOM65VIohlrIWSE67xwcU9GPLbsrKen8oNzdRMXsZVsO8HZgkmihwnTN2G82u3J/cteuiI1q7HRi+50zdn6mdWnd+A2gdV0Do4JhzmZm88s5A3pZuWqhuNNrmDsF8vK79CpTIQKmQS9O3rdsoWj73zSUlfm5ZYMt79QO1m/MCOvopVjksB191BgUnzehhaEmZq2YFj1kny+YMfgIAc9+sH47jcxAUFS4KJIPwbxaZ1uy8O99z+WsbXkK5P4uebzLClLfzuqZJtvMj+AFGq4ozePJvBltiHvYtwIdw/T7RGhN8jIYca1CmlPDc6lr1RE8ENfjqva/NSb7yQXbRkAYaGUkp8/K0w3D+4C3gWY7v0dMbsbOhtidrwZKhMr8hKUA40/vxweG X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: "Testing private access when memslot gets deleted" tests the behavior of KVM when a private memslot gets deleted while the VM is using the private memslot. When KVM looks up the deleted (slot = NULL) memslot, KVM should exit to userspace with KVM_EXIT_MEMORY_FAULT. In the second test, upon a private access to non-private memslot, KVM should also exit to userspace with KVM_EXIT_MEMORY_FAULT. Signed-off-by: Ackerley Tng --- tools/testing/selftests/kvm/Makefile | 1 + .../kvm/x86_64/private_mem_kvm_exits_test.c | 124 ++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index bafee3c43b2e..0ad588852a1d 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -80,6 +80,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/nested_exceptions_test TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test TEST_GEN_PROGS_x86_64 += x86_64/pmu_event_filter_test TEST_GEN_PROGS_x86_64 += x86_64/private_mem_conversions_test +TEST_GEN_PROGS_x86_64 += x86_64/private_mem_kvm_exits_test TEST_GEN_PROGS_x86_64 += x86_64/set_boot_cpu_id TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test TEST_GEN_PROGS_x86_64 += x86_64/smaller_maxphyaddr_emulation_test diff --git a/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c b/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c new file mode 100644 index 000000000000..c8667dfbbf0a --- /dev/null +++ b/tools/testing/selftests/kvm/x86_64/private_mem_kvm_exits_test.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2022, Google LLC. + */ +#include "kvm_util_base.h" +#include +#include +#include +#include "kvm_util.h" +#include "processor.h" +#include "test_util.h" + +/* Arbitrarily selected to avoid overlaps with anything else */ +#define EXITS_TEST_GVA 0xc0000000 +#define EXITS_TEST_GPA EXITS_TEST_GVA +#define EXITS_TEST_NPAGES 1 +#define EXITS_TEST_SIZE (EXITS_TEST_NPAGES * PAGE_SIZE) +#define EXITS_TEST_SLOT 10 + +static uint64_t guest_repeatedly_read(void) +{ + volatile uint64_t value; + + while (true) + value = *((uint64_t *) EXITS_TEST_GVA); + + return value; +} + +static uint32_t run_vcpu_get_exit_reason(struct kvm_vcpu *vcpu) +{ + vcpu_run(vcpu); + + return vcpu->run->exit_reason; +} + +const struct vm_shape protected_vm_shape = { + .mode = VM_MODE_DEFAULT, + .type = KVM_X86_PROTECTED_VM, +}; + +static void test_private_access_memslot_deleted(void) +{ + struct kvm_vm *vm; + struct kvm_vcpu *vcpu; + pthread_t vm_thread; + void *thread_return; + uint32_t exit_reason; + + vm = vm_create_shape_with_one_vcpu(protected_vm_shape, &vcpu, + guest_repeatedly_read); + + vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, + EXITS_TEST_GPA, EXITS_TEST_SLOT, + EXITS_TEST_NPAGES, + KVM_MEM_PRIVATE); + + virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); + + /* Request to access page privately */ + vm_mem_map_shared_or_private(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE, false); + + pr_info("Testing private access when memslot gets deleted\n"); + + pthread_create(&vm_thread, NULL, + (void *(*)(void *))run_vcpu_get_exit_reason, + (void *)vcpu); + + vm_mem_region_delete(vm, EXITS_TEST_SLOT); + + pthread_join(vm_thread, &thread_return); + exit_reason = (uint32_t)(uint64_t)thread_return; + + ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); + ASSERT_EQ(vcpu->run->memory.flags, KVM_MEMORY_EXIT_FLAG_PRIVATE); + ASSERT_EQ(vcpu->run->memory.gpa, EXITS_TEST_GPA); + ASSERT_EQ(vcpu->run->memory.size, EXITS_TEST_SIZE); + + pr_info("\t ... PASSED\n"); + + kvm_vm_free(vm); +} + +static void test_private_access_memslot_not_private(void) +{ + struct kvm_vm *vm; + struct kvm_vcpu *vcpu; + uint32_t exit_reason; + + vm = vm_create_shape_with_one_vcpu(protected_vm_shape, &vcpu, + guest_repeatedly_read); + + /* Add a non-private memslot (flags = 0) */ + vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, + EXITS_TEST_GPA, EXITS_TEST_SLOT, + EXITS_TEST_NPAGES, 0); + + virt_map(vm, EXITS_TEST_GVA, EXITS_TEST_GPA, EXITS_TEST_NPAGES); + + /* Request to access page privately */ + vm_set_memory_attributes(vm, EXITS_TEST_GPA, EXITS_TEST_SIZE, + KVM_MEMORY_ATTRIBUTE_PRIVATE); + + pr_info("Testing private access to non-private memslot\n"); + + exit_reason = run_vcpu_get_exit_reason(vcpu); + + ASSERT_EQ(exit_reason, KVM_EXIT_MEMORY_FAULT); + ASSERT_EQ(vcpu->run->memory.flags, KVM_MEMORY_EXIT_FLAG_PRIVATE); + ASSERT_EQ(vcpu->run->memory.gpa, EXITS_TEST_GPA); + ASSERT_EQ(vcpu->run->memory.size, EXITS_TEST_SIZE); + + pr_info("\t ... PASSED\n"); + + kvm_vm_free(vm); +} + +int main(int argc, char *argv[]) +{ + TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_PROTECTED_VM)); + + test_private_access_memslot_deleted(); + test_private_access_memslot_not_private(); +}