From: "Lendacky, Thomas" <thomas.lendacky@amd.com>
To: devel@edk2.groups.io
Cc: Jordan Justen <jordan.l.justen@intel.com>,
Laszlo Ersek <lersek@redhat.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Michael D Kinney <michael.d.kinney@intel.com>,
Liming Gao <liming.gao@intel.com>,
Eric Dong <eric.dong@intel.com>, Ray Ni <ray.ni@intel.com>,
Brijesh Singh <brijesh.singh@amd.com>
Subject: [PATCH v4 10/40] UefiCpuPkg/CpuExceptionHandler: Support string IO for IOIO_PROT NAE events
Date: Tue, 4 Feb 2020 17:01:14 -0600 [thread overview]
Message-ID: <ca5ccd0aaa07fce3083fc4fc7d5cc5ef8cb41cf6.1580857303.git.thomas.lendacky@amd.com> (raw)
In-Reply-To: <cover.1580857303.git.thomas.lendacky@amd.com>
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198
Add support to the #VC exception handler to handle string IO. This
requires expanding the IO instruction parsing to recognize string based
IO instructions as well as preparing an un-encrypted buffer to be used
to transfer (either to or from the guest) the string contents for the IO
operation. The SW_EXITINFO2 and SW_SCRATCH fields of the GHCB are set
appropriately for the operation. Multiple VMGEXIT invocations may be
needed to complete the string IO operation.
Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
---
.../X64/AMDSevVcCommon.c | 78 ++++++++++++++++---
1 file changed, 68 insertions(+), 10 deletions(-)
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/AMDSevVcCommon.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/AMDSevVcCommon.c
index 48eb5c2358ed..49609c5ef22f 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/AMDSevVcCommon.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/AMDSevVcCommon.c
@@ -321,6 +321,22 @@ IoioExitInfo (
UINT64 ExitInfo = 0;
switch (*(InstructionData->OpCodes)) {
+ // INS opcodes
+ case 0x6C:
+ case 0x6D:
+ ExitInfo |= IOIO_TYPE_INS;
+ ExitInfo |= IOIO_SEG_ES;
+ ExitInfo |= ((Regs->Rdx & 0xffff) << 16);
+ break;
+
+ // OUTS opcodes
+ case 0x6E:
+ case 0x6F:
+ ExitInfo |= IOIO_TYPE_OUTS;
+ ExitInfo |= IOIO_SEG_DS;
+ ExitInfo |= ((Regs->Rdx & 0xffff) << 16);
+ break;
+
// IN immediate opcodes
case 0xE4:
case 0xE5:
@@ -358,6 +374,8 @@ IoioExitInfo (
}
switch (*(InstructionData->OpCodes)) {
+ case 0x6C:
+ case 0x6E:
case 0xE4:
case 0xE6:
case 0xEC:
@@ -404,7 +422,8 @@ IoioExit (
SEV_ES_INSTRUCTION_DATA *InstructionData
)
{
- UINT64 ExitInfo1, Status;
+ UINT64 ExitInfo1, ExitInfo2, Status;
+ BOOLEAN String;
ExitInfo1 = IoioExitInfo (Regs, InstructionData);
if (!ExitInfo1) {
@@ -421,16 +440,55 @@ IoioExit (
Ghcb->SaveArea.Rax = Regs->Rax;
GhcbSetRegValid (Ghcb, GhcbRax);
- Status = VmgExit (Ghcb, SvmExitIoioProt, ExitInfo1, 0);
- if (Status) {
- return Status;
- }
-
- if (ExitInfo1 & IOIO_TYPE_IN) {
- if (!GhcbIsRegValid (Ghcb, GhcbRax)) {
- return UnsupportedExit (Ghcb, Regs, InstructionData);
+ String = (ExitInfo1 & IOIO_TYPE_STR) ? TRUE : FALSE;
+ if (String) {
+ UINTN IoBytes, VmgExitBytes;
+ UINTN GhcbCount, OpCount;
+
+ Status = 0;
+
+ IoBytes = (ExitInfo1 >> 4) & 0x7;
+ GhcbCount = sizeof (Ghcb->SharedBuffer) / IoBytes;
+
+ OpCount = (ExitInfo1 & IOIO_REP) ? Regs->Rcx : 1;
+ while (OpCount) {
+ ExitInfo2 = MIN (OpCount, GhcbCount);
+ VmgExitBytes = ExitInfo2 * IoBytes;
+
+ if (!(ExitInfo1 & IOIO_TYPE_IN)) {
+ CopyMem (Ghcb->SharedBuffer, (VOID *) Regs->Rsi, VmgExitBytes);
+ Regs->Rsi += VmgExitBytes;
+ }
+
+ Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;
+ Status = VmgExit (Ghcb, SvmExitIoioProt, ExitInfo1, ExitInfo2);
+ if (Status) {
+ return Status;
+ }
+
+ if (ExitInfo1 & IOIO_TYPE_IN) {
+ CopyMem ((VOID *) Regs->Rdi, Ghcb->SharedBuffer, VmgExitBytes);
+ Regs->Rdi += VmgExitBytes;
+ }
+
+ if (ExitInfo1 & IOIO_REP) {
+ Regs->Rcx -= ExitInfo2;
+ }
+
+ OpCount -= ExitInfo2;
+ }
+ } else {
+ Status = VmgExit (Ghcb, SvmExitIoioProt, ExitInfo1, 0);
+ if (Status) {
+ return Status;
+ }
+
+ if (ExitInfo1 & IOIO_TYPE_IN) {
+ if (!GhcbIsRegValid (Ghcb, GhcbRax)) {
+ return UnsupportedExit (Ghcb, Regs, InstructionData);
+ }
+ Regs->Rax = Ghcb->SaveArea.Rax;
}
- Regs->Rax = Ghcb->SaveArea.Rax;
}
return 0;
--
2.17.1
next prev parent reply other threads:[~2020-02-04 23:02 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-04 23:01 [PATCH v4 00/40] SEV-ES guest support Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 01/40] MdePkg: Create PCDs to be used in support of SEV-ES Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 02/40] MdePkg: Add the MSR definition for the GHCB register Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 03/40] MdePkg: Add a structure definition for the GHCB Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 04/40] MdeModulePkg/DxeIplPeim: Support GHCB pages when creating page tables Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 05/40] MdePkg/BaseLib: Add support for the XGETBV instruction Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 06/40] MdePkg/BaseLib: Add support for the VMGEXIT instruction Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 07/40] UefiCpuPkg: Implement library support for VMGEXIT Lendacky, Thomas
2020-02-14 0:42 ` [edk2-devel] " Dong, Eric
2020-02-14 17:56 ` Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 08/40] UefiCpuPkg/CpuExceptionHandler: Add base support for the #VC exception Lendacky, Thomas
2020-02-06 8:03 ` [edk2-devel] " Laszlo Ersek
2020-02-07 15:07 ` Lendacky, Thomas
2020-02-10 14:09 ` Laszlo Ersek
2020-02-10 18:13 ` Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 09/40] UefiCpuPkg/CpuExceptionHandler: Add support for IOIO_PROT NAE events Lendacky, Thomas
2020-02-04 23:01 ` Lendacky, Thomas [this message]
2020-02-04 23:01 ` [PATCH v4 11/40] UefiCpuPkg/CpuExceptionHandler: Add support for CPUID " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 12/40] UefiCpuPkg/CpuExceptionHandler: Add support for MSR_PROT " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 13/40] UefiCpuPkg/CpuExceptionHandler: Add support for NPF NAE events (MMIO) Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 14/40] UefiCpuPkg/CpuExceptionHandler: Add support for WBINVD NAE events Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 15/40] UefiCpuPkg/CpuExceptionHandler: Add support for RDTSC " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 16/40] UefiCpuPkg/CpuExceptionHandler: Add support for RDPMC " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 17/40] UefiCpuPkg/CpuExceptionHandler: Add support for INVD " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 18/40] UefiCpuPkg/CpuExceptionHandler: Add support for VMMCALL " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 19/40] UefiCpuPkg/CpuExceptionHandler: Add support for RDTSCP " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 20/40] UefiCpuPkg/CpuExceptionHandler: Add support for MONITOR/MONITORX " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 21/40] UefiCpuPkg/CpuExceptionHandler: Add support for MWAIT/MWAITX " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 22/40] UefiCpuPkg/CpuExceptionHandler: Add support for DR7 Read/Write " Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 23/40] OvmfPkg/MemEncryptSevLib: Add an SEV-ES guest indicator function Lendacky, Thomas
2020-02-06 8:21 ` [edk2-devel] " Laszlo Ersek
2020-02-07 15:29 ` Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 24/40] OvmfPkg: Add support to perform SEV-ES initialization Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 25/40] OvmfPkg: Create a GHCB page for use during Sec phase Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 26/40] OvmfPkg/PlatformPei: Reserve GHCB-related areas if S3 is supported Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 27/40] OvmfPkg: Create GHCB pages for use during Pei and Dxe phase Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 28/40] OvmfPkg/PlatformPei: Move early GDT into ram when SEV-ES is enabled Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 29/40] UefiCpuPkg: Create an SEV-ES workarea PCD Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 30/40] OvmfPkg: Reserve a page in memory for the SEV-ES usage Lendacky, Thomas
2020-02-06 8:43 ` [edk2-devel] " Laszlo Ersek
2020-02-04 23:01 ` [PATCH v4 31/40] OvmfPkg/ResetVector: Add support for a 32-bit SEV check Lendacky, Thomas
2020-02-06 8:51 ` [edk2-devel] " Laszlo Ersek
2020-02-04 23:01 ` [PATCH v4 32/40] OvmfPkg/Sec: Add #VC exception handling for Sec phase Lendacky, Thomas
2020-02-06 9:03 ` [edk2-devel] " Laszlo Ersek
2020-02-04 23:01 ` [PATCH v4 33/40] OvmfPkg/Sec: Enable cache early to speed up booting Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 34/40] OvmfPkg/QemuFlashFvbServicesRuntimeDxe: Bypass flash detection with SEV-ES is enabled Lendacky, Thomas
2020-02-06 9:16 ` [edk2-devel] " Laszlo Ersek
2020-02-04 23:01 ` [PATCH v4 35/40] UefiCpuPkg: Add a 16-bit protected mode code segment descriptor Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 36/40] UefiCpuPkg/MpInitLib: Add a CPU MP data flag to indicate if SEV-ES is enabled Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 37/40] UefiCpuPkg: Allow AP booting under SEV-ES Lendacky, Thomas
2020-02-06 9:35 ` [edk2-devel] " Laszlo Ersek
2020-02-07 15:51 ` Lendacky, Thomas
2020-02-04 23:01 ` [PATCH v4 38/40] OvmfPkg: Use the SEV-ES work area for the SEV-ES AP reset vector Lendacky, Thomas
2020-02-06 9:29 ` [edk2-devel] " Laszlo Ersek
2020-02-04 23:01 ` [PATCH v4 39/40] OvmfPkg: Move the GHCB allocations into reserved memory Lendacky, Thomas
2020-02-05 13:56 ` [PATCH v4 40/40] UefiCpuPkg/MpInitLib: Prepare SEV-ES guest APs for OS use Lendacky, Thomas
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-list 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=ca5ccd0aaa07fce3083fc4fc7d5cc5ef8cb41cf6.1580857303.git.thomas.lendacky@amd.com \
--to=devel@edk2.groups.io \
/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