From: Michael Roth <michael.roth@amd.com>
To: linux-kselftest@vger.kernel.org
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
x86@kernel.org, Nathan Tempelman <natet@google.com>,
Marc Orr <marcorr@google.com>,
Steve Rutherford <srutherford@google.com>,
Sean Christopherson <seanjc@google.com>,
Mingwei Zhang <mizhang@google.com>,
Brijesh Singh <brijesh.singh@amd.com>,
Tom Lendacky <thomas.lendacky@amd.com>,
Varad Gautam <varad.gautam@suse.com>,
Shuah Khan <shuah@kernel.org>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
David Woodhouse <dwmw@amazon.co.uk>,
Ricardo Koller <ricarkol@google.com>,
Jim Mattson <jmattson@google.com>,
Wanpeng Li <wanpengli@tencent.com>,
Joerg Roedel <joro@8bytes.org>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
"H . Peter Anvin" <hpa@zytor.com>
Subject: [RFC 14/16] KVM: selftests: add helpers for SEV-SNP-related instructions/exits
Date: Tue, 5 Oct 2021 18:44:57 -0500 [thread overview]
Message-ID: <20211005234459.430873-15-michael.roth@amd.com> (raw)
In-Reply-To: <20211005234459.430873-1-michael.roth@amd.com>
Extend the existing sev_exitlib with helpers for handling pvalidate
instructions and issuing page-state changes via the GHCB MSR protocol.
Subsequent SEV-SNP-related tests will make use of these in guest code.
Signed-off-by: Michael Roth <michael.roth@amd.com>
---
.../kvm/include/x86_64/sev_exitlib.h | 6 ++
.../selftests/kvm/lib/x86_64/sev_exitlib.c | 77 +++++++++++++++++++
2 files changed, 83 insertions(+)
diff --git a/tools/testing/selftests/kvm/include/x86_64/sev_exitlib.h b/tools/testing/selftests/kvm/include/x86_64/sev_exitlib.h
index 4b67b4004dfa..5c7356f9e925 100644
--- a/tools/testing/selftests/kvm/include/x86_64/sev_exitlib.h
+++ b/tools/testing/selftests/kvm/include/x86_64/sev_exitlib.h
@@ -8,7 +8,13 @@
#ifndef SELFTEST_KVM_SEV_EXITLIB_H
#define SELFTEST_KVM_SEV_EXITLIB_H
+#define PVALIDATE_NO_UPDATE 255
+
int sev_es_handle_vc(void *ghcb, u64 ghcb_gpa, struct ex_regs *regs);
void sev_es_terminate(int reason);
+void snp_register_ghcb(u64 ghcb_gpa);
+void snp_psc_set_shared(u64 gpa);
+void snp_psc_set_private(u64 gpa);
+int snp_pvalidate(void *ptr, bool rmp_psize, bool validate);
#endif /* SELFTEST_KVM_SEV_EXITLIB_H */
diff --git a/tools/testing/selftests/kvm/lib/x86_64/sev_exitlib.c b/tools/testing/selftests/kvm/lib/x86_64/sev_exitlib.c
index b3f7b0297e5b..546b402d5015 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/sev_exitlib.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/sev_exitlib.c
@@ -51,6 +51,19 @@
#define GHCB_REG_GPA_RESP(resp) ((resp) & GENMASK_ULL(11, 0))
#define GHCB_REG_GPA_RESP_VAL(resp) ((resp) >> 12)
+/* GHCB MSR protocol for Page State Change */
+#define GHCB_PSC_REQ_PRIVATE 1
+#define GHCB_PSC_REQ_SHARED 2
+#define GHCB_PSC_REQ_PSMASH 3
+#define GHCB_PSC_REQ_UNSMASH 4
+#define GHCB_PSC_REQ_CODE 0x14UL
+#define GHCB_PSC_REQ(gfn, op) \
+ (((unsigned long)((op) & 0xf) << 52) | \
+ ((unsigned long)((gfn) & ~(1ULL << 40)) << 12) | \
+ GHCB_PSC_REQ_CODE)
+#define GHCB_PSC_RESP_CODE 0x15UL
+#define GHCB_PSC_RESP(resp) ((resp) & GENMASK_ULL(11, 0))
+
/* GHCB format/accessors */
struct ghcb {
@@ -247,3 +260,67 @@ int sev_es_handle_vc(void *ghcb, u64 ghcb_gpa, struct ex_regs *regs)
return handle_vc_cpuid(ghcb, ghcb_gpa, regs);
}
+
+void snp_register_ghcb(u64 ghcb_gpa)
+{
+ u64 gfn = ghcb_gpa >> PAGE_SHIFT;
+ u64 resp;
+
+ sev_es_wrmsr_ghcb(GHCB_REG_GPA_REQ(gfn));
+ VMGEXIT();
+
+ resp = sev_es_rdmsr_ghcb();
+ if (GHCB_REG_GPA_RESP(resp) != GHCB_REG_GPA_RESP_CODE ||
+ GHCB_REG_GPA_RESP_VAL(resp) != gfn)
+ sev_es_terminate(GHCB_TERMINATE_REASON_UNSPEC);
+}
+
+static void snp_psc_request(u64 gfn, int op)
+{
+ u64 resp;
+
+ sev_es_wrmsr_ghcb(GHCB_PSC_REQ(gfn, op));
+ VMGEXIT();
+
+ resp = sev_es_rdmsr_ghcb();
+ if (GHCB_PSC_RESP(resp) != GHCB_PSC_RESP_CODE)
+ sev_es_terminate(GHCB_TERMINATE_REASON_UNSPEC);
+}
+
+void snp_psc_set_shared(u64 gpa)
+{
+ snp_psc_request(gpa >> PAGE_SHIFT, GHCB_PSC_REQ_SHARED);
+}
+
+void snp_psc_set_private(u64 gpa)
+{
+ snp_psc_request(gpa >> PAGE_SHIFT, GHCB_PSC_REQ_PRIVATE);
+}
+
+/* From arch/x86/include/asm/asm.h */
+#ifdef __GCC_ASM_FLAG_OUTPUTS__
+# define CC_SET(c) "\n\t/* output condition code " #c "*/\n"
+# define CC_OUT(c) "=@cc" #c
+#else
+# define CC_SET(c) "\n\tset" #c " %[_cc_" #c "]\n"
+# define CC_OUT(c) [_cc_ ## c] "=qm"
+#endif
+
+int snp_pvalidate(void *ptr, bool rmp_psize, bool validate)
+{
+ uint64_t gva = (uint64_t)ptr;
+ bool no_rmpupdate;
+ int rc;
+
+ /* "pvalidate" mnemonic support in binutils 2.36 and newer */
+ asm volatile(".byte 0xF2, 0x0F, 0x01, 0xFF\n\t"
+ CC_SET(c)
+ : CC_OUT(c) (no_rmpupdate), "=a"(rc)
+ : "a"(gva), "c"(rmp_psize), "d"(validate)
+ : "memory", "cc");
+
+ if (no_rmpupdate)
+ return PVALIDATE_NO_UPDATE;
+
+ return rc;
+}
--
2.25.1
next prev parent reply other threads:[~2021-10-05 23:46 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-05 23:44 [RFC 00/16] KVM: selftests: Add tests for SEV, SEV-ES, and SEV-SNP guests Michael Roth
2021-10-05 23:44 ` [RFC 01/16] KVM: selftests: move vm_phy_pages_alloc() earlier in file Michael Roth
2021-10-18 15:00 ` Mingwei Zhang
2021-10-21 3:45 ` Michael Roth
2021-10-21 15:20 ` Paolo Bonzini
2021-10-26 15:52 ` Mingwei Zhang
2021-11-01 17:43 ` Mingwei Zhang
2021-10-05 23:44 ` [RFC 02/16] KVM: selftests: add hooks for managing encrypted guest memory Michael Roth
2021-10-13 2:20 ` Krish Sadhukhan
2021-10-13 15:07 ` Michael Roth
2021-10-21 15:22 ` Paolo Bonzini
2021-10-18 15:00 ` Mingwei Zhang
2021-10-21 3:37 ` Michael Roth
2021-10-21 15:22 ` Paolo Bonzini
2021-10-26 15:48 ` Mingwei Zhang
2021-11-01 17:44 ` Mingwei Zhang
2021-10-05 23:44 ` [RFC 03/16] KVM: selftests: handle encryption bits in page tables Michael Roth
2021-10-21 15:26 ` Paolo Bonzini
2021-10-24 16:49 ` Michael Roth
2021-10-25 7:34 ` Paolo Bonzini
2021-10-25 14:14 ` Michael Roth
2021-10-05 23:44 ` [RFC 09/16] KVM: selftests: account for error code in #VC exception frame Michael Roth
2021-10-05 23:44 ` [RFC 10/16] KVM: selftests: add support for creating SEV-ES guests Michael Roth
2021-10-05 23:44 ` [RFC 11/16] KVM: selftests: add library for handling SEV-ES-related exits Michael Roth
2021-10-05 23:44 ` [RFC 12/16] KVM: selftests: add SEV-ES boot tests Michael Roth
2021-10-05 23:44 ` [RFC 13/16] KVM: selftests: add support for creating SEV-SNP guests Michael Roth
2021-10-05 23:44 ` Michael Roth [this message]
2021-10-05 23:44 ` [RFC 15/16] KVM: selftests: add SEV-SNP boot tests Michael Roth
2021-10-05 23:44 ` [RFC 16/16] KVM: selftests: add SEV-SNP tests for page-state changes Michael Roth
2021-10-06 20:28 ` [RFC 04/16] KVM: selftests: add library for creating/interacting with SEV guests Michael Roth
2021-10-06 20:59 ` Michael Roth
2021-10-06 20:36 ` [RFC 04/16] KVM: selftests: set CPUID before setting sregs in vcpu creation Michael Roth
2021-10-08 19:03 ` Nathan Tempelman
2021-10-13 1:45 ` Krish Sadhukhan
2021-10-13 15:05 ` Michael Roth
2021-10-21 15:29 ` Paolo Bonzini
2021-10-06 20:36 ` [RFC 05/16] KVM: selftests: add support for encrypted vm_vaddr_* allocations Michael Roth
2021-10-06 20:37 ` [RFC 06/16] KVM: selftests: add library for creating/interacting with SEV guests Michael Roth
2021-10-11 3:17 ` Marc Orr
2021-10-12 1:15 ` Michael Roth
2021-10-12 12:55 ` Michael Roth
2021-10-21 15:43 ` Paolo Bonzini
2021-11-04 5:25 ` Mingwei Zhang
2021-11-04 13:44 ` Tom Lendacky
2021-10-14 1:26 ` Krish Sadhukhan
2021-10-16 2:56 ` Krish Sadhukhan
2021-10-21 15:39 ` Paolo Bonzini
2021-10-25 3:58 ` Michael Roth
2021-10-06 20:37 ` [RFC 07/16] KVM: selftests: add SEV boot tests Michael Roth
2021-10-16 2:55 ` Krish Sadhukhan
2021-10-21 3:35 ` Michael Roth
2021-10-06 20:37 ` [RFC 08/16] KVM: SVM: include CR3 in initial VMSA state for SEV-ES guests Michael Roth
2021-10-21 16:43 ` Paolo Bonzini
2021-10-25 3:59 ` Michael Roth
2021-10-21 16:48 ` [RFC 00/16] KVM: selftests: Add tests for SEV, SEV-ES, and SEV-SNP guests Paolo Bonzini
2021-10-25 4:27 ` Michael Roth
2021-10-25 7:35 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211005234459.430873-15-michael.roth@amd.com \
--to=michael.roth@amd.com \
--cc=bp@alien8.de \
--cc=brijesh.singh@amd.com \
--cc=dwmw@amazon.co.uk \
--cc=hpa@zytor.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=marcorr@google.com \
--cc=mingo@redhat.com \
--cc=mizhang@google.com \
--cc=natet@google.com \
--cc=ricarkol@google.com \
--cc=seanjc@google.com \
--cc=shuah@kernel.org \
--cc=srutherford@google.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=varad.gautam@suse.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox