From: Jarkko Sakkinen <jarkko@kernel.org>
To: Kai Huang <kai.huang@intel.com>
Cc: linux-sgx@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org,
seanjc@google.com, luto@kernel.org, dave.hansen@intel.com,
haitao.huang@intel.com, pbonzini@redhat.com, bp@alien8.de,
tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com
Subject: Re: [RFC PATCH v3 06/27] x86/sgx: Introduce virtual EPC for use by KVM guests
Date: Sat, 30 Jan 2021 16:41:16 +0200 [thread overview]
Message-ID: <YBVwDAOYfsDFZ1CY@kernel.org> (raw)
In-Reply-To: <8492ee41e947aa8151007e5ecbd9ef8914dd8827.1611634586.git.kai.huang@intel.com>
On Tue, Jan 26, 2021 at 10:30:21PM +1300, Kai Huang wrote:
> From: Sean Christopherson <sean.j.christopherson@intel.com>
>
> Add a misc device /dev/sgx_vepc to allow userspace to allocate "raw" EPC
> without an associated enclave. The intended and only known use case for
> raw EPC allocation is to expose EPC to a KVM guest, hence the 'vepc'
> moniker, virt.{c,h} files and X86_SGX_KVM Kconfig.
>
> More specifically, to allocate a virtual EPC instance with particular
> size, the userspace hypervisor opens the device node, and uses mmap()
> with the intended size to get an address range of virtual EPC. Then
> it may use the address range to create one KVM memory slot as virtual
> EPC for guest.
>
> Implement the "raw" EPC allocation in the x86 core-SGX subsystem via
> /dev/sgx_vepc rather than in KVM. Doing so has two major advantages:
>
> - Does not require changes to KVM's uAPI, e.g. EPC gets handled as
> just another memory backend for guests.
>
> - EPC management is wholly contained in the SGX subsystem, e.g. SGX
> does not have to export any symbols, changes to reclaim flows don't
> need to be routed through KVM, SGX's dirty laundry doesn't have to
> get aired out for the world to see, and so on and so forth.
>
> The virtual EPC pages allocated to guests are currently not reclaimable.
> Reclaiming EPC page used by enclave requires a special reclaim mechanism
> separate from normal page reclaim, and that mechanism is not supported
> for virutal EPC pages. Due to the complications of handling reclaim
> conflicts between guest and host, reclaiming virtual EPC pages is
> significantly more complex than basic support for SGX virtualization.
>
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> Co-developed-by: Kai Huang <kai.huang@intel.com>
> Signed-off-by: Kai Huang <kai.huang@intel.com>
> ---
> v2->v3:
>
> - Changed from /dev/sgx_virt_epc to /dev/sgx_vepc, per Jarkko. Accordingly,
> renamed 'sgx_virt_epc_xx' to 'sgx_vepc_xx' for various functions and
> structrues.
> - Changed CONFIG_X86_SGX_VIRTUALIZATION to CONFIG_X86_SGX_KVM, per Dave.
>
> v1->v2:
>
> - Added one paragraph to explain fops of virtual EPC, per Jarkko's suggestion.
> - Moved change to sgx_init() out of this patch to a separate patch, as stated
> in cover letter.
> - In sgx_virt_epc_init(), return error if VMX is not supported, or
> CONFIG_KVM_INTEL is not enabled, because there's no point to create
> /dev/sgx_virt_epc if KVM is not supported.
> - Removed 'struct mm_struct *mm' in 'struct sgx_virt_epc', and related logic in
> sgx_virt_epc_open/release/mmap(), per Dave's comment.
> - Renamed 'virtual_epc_zombie_pages' and 'virt_epc_lock' to 'zombie_secs_pages'
> 'zombie_secs_pages_lock', per Dave's suggestion.
> - Changed __sgx_free_epc_page() to sgx_free_epc_page() due to Jarkko's patch
> removes EREMOVE in sgx_free_epc_page().
> - Changed all struct sgx_virt_epc *epc to struct sgx_virt_epc *vepc.
> - In __sgx_virt_epc_fault(), changed comment to use WARN_ON() to make sure
> vepc->lock has already been hold, per Dave's suggestion.
> - In sgx_virt_epc_free_page(), added comments to explain SGX_ENCLAVE_ACT is not
> expected; and changed to use WARN_ONCE() to dump actual error code, per
> Dave's comment.
> - Removed NULL page check in sgx_virt_epc_free_page(), per Dave's comment.
>
> ---
> arch/x86/Kconfig | 12 ++
> arch/x86/kernel/cpu/sgx/Makefile | 1 +
> arch/x86/kernel/cpu/sgx/virt.c | 254 +++++++++++++++++++++++++++++++
> arch/x86/kernel/cpu/sgx/virt.h | 14 ++
> 4 files changed, 281 insertions(+)
> create mode 100644 arch/x86/kernel/cpu/sgx/virt.c
> create mode 100644 arch/x86/kernel/cpu/sgx/virt.h
>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 21f851179ff0..ccb35d14c297 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -1951,6 +1951,18 @@ config X86_SGX
>
> If unsure, say N.
>
> +config X86_SGX_KVM
> + bool "Software Guard eXtensions (SGX) Virtualization"
> + depends on X86_SGX && KVM_INTEL
> + help
> +
> + Enables KVM guests to create SGX enclaves.
> +
> + This includes support to expose "raw" unreclaimable enclave memory to
> + guests via a device node, e.g. /dev/sgx_vepc.
> +
> + If unsure, say N.
> +
> config EFI
> bool "EFI runtime service support"
> depends on ACPI
> diff --git a/arch/x86/kernel/cpu/sgx/Makefile b/arch/x86/kernel/cpu/sgx/Makefile
> index 91d3dc784a29..9c1656779b2a 100644
> --- a/arch/x86/kernel/cpu/sgx/Makefile
> +++ b/arch/x86/kernel/cpu/sgx/Makefile
> @@ -3,3 +3,4 @@ obj-y += \
> encl.o \
> ioctl.o \
> main.o
> +obj-$(CONFIG_X86_SGX_KVM) += virt.o
> diff --git a/arch/x86/kernel/cpu/sgx/virt.c b/arch/x86/kernel/cpu/sgx/virt.c
> new file mode 100644
> index 000000000000..e1ad7856d878
> --- /dev/null
> +++ b/arch/x86/kernel/cpu/sgx/virt.c
> @@ -0,0 +1,254 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright(c) 2016-20 Intel Corporation. */
> +
> +#define pr_fmt(fmt) "SGX virtual EPC: " fmt
Remove this. It's fine to use "sgx:" also for these messages and
easens grepping.
> +
> +#include <linux/miscdevice.h>
> +#include <linux/mm.h>
> +#include <linux/mman.h>
> +#include <linux/sched/mm.h>
> +#include <linux/sched/signal.h>
> +#include <linux/slab.h>
> +#include <linux/xarray.h>
> +#include <asm/sgx.h>
> +#include <uapi/asm/sgx.h>
> +
> +#include "encls.h"
> +#include "sgx.h"
> +#include "virt.h"
> +
> +struct sgx_vepc {
> + struct xarray page_array;
> + struct mutex lock;
> +};
> +
> +static struct mutex zombie_secs_pages_lock;
> +static struct list_head zombie_secs_pages;
> +
> +static int __sgx_vepc_fault(struct sgx_vepc *vepc,
> + struct vm_area_struct *vma, unsigned long addr)
> +{
> + struct sgx_epc_page *epc_page;
> + unsigned long index, pfn;
> + int ret;
> +
> + WARN_ON(!mutex_is_locked(&vepc->lock));
> +
> + /* Calculate index of EPC page in virtual EPC's page_array */
> + index = vma->vm_pgoff + PFN_DOWN(addr - vma->vm_start);
> +
> + epc_page = xa_load(&vepc->page_array, index);
> + if (epc_page)
> + return 0;
> +
> + epc_page = sgx_alloc_epc_page(vepc, false);
> + if (IS_ERR(epc_page))
> + return PTR_ERR(epc_page);
> +
> + ret = xa_err(xa_store(&vepc->page_array, index, epc_page, GFP_KERNEL));
> + if (ret)
> + goto err_free;
> +
> + pfn = PFN_DOWN(sgx_get_epc_phys_addr(epc_page));
> +
> + ret = vmf_insert_pfn(vma, addr, pfn);
> + if (ret != VM_FAULT_NOPAGE) {
> + ret = -EFAULT;
> + goto err_delete;
> + }
> +
> + return 0;
> +
> +err_delete:
> + xa_erase(&vepc->page_array, index);
> +err_free:
> + sgx_free_epc_page(epc_page);
> + return ret;
> +}
> +
> +static vm_fault_t sgx_vepc_fault(struct vm_fault *vmf)
> +{
> + struct vm_area_struct *vma = vmf->vma;
> + struct sgx_vepc *vepc = vma->vm_private_data;
> + int ret;
> +
> + mutex_lock(&vepc->lock);
> + ret = __sgx_vepc_fault(vepc, vma, vmf->address);
> + mutex_unlock(&vepc->lock);
> +
> + if (!ret)
> + return VM_FAULT_NOPAGE;
> +
> + if (ret == -EBUSY && (vmf->flags & FAULT_FLAG_ALLOW_RETRY)) {
> + mmap_read_unlock(vma->vm_mm);
> + return VM_FAULT_RETRY;
> + }
> +
> + return VM_FAULT_SIGBUS;
> +}
> +
> +const struct vm_operations_struct sgx_vepc_vm_ops = {
> + .fault = sgx_vepc_fault,
> +};
> +
> +static int sgx_vepc_mmap(struct file *file, struct vm_area_struct *vma)
> +{
> + struct sgx_vepc *vepc = file->private_data;
> +
> + if (!(vma->vm_flags & VM_SHARED))
> + return -EINVAL;
> +
> + vma->vm_ops = &sgx_vepc_vm_ops;
> + /* Don't copy VMA in fork() */
> + vma->vm_flags |= VM_PFNMAP | VM_IO | VM_DONTDUMP | VM_DONTCOPY;
> + vma->vm_private_data = vepc;
> +
> + return 0;
> +}
> +
> +static int sgx_vepc_free_page(struct sgx_epc_page *epc_page)
> +{
> + int ret;
> +
> + /*
> + * Take a previously guest-owned EPC page and return it to the
> + * general EPC page pool.
> + *
> + * Guests can not be trusted to have left this page in a good
> + * state, so run EREMOVE on the page unconditionally. In the
> + * case that a guest properly EREMOVE'd this page, a superfluous
> + * EREMOVE is harmless.
> + */
> + ret = __eremove(sgx_get_epc_virt_addr(epc_page));
> + if (ret) {
> + /*
> + * Only SGX_CHILD_PRESENT is expected, which is because of
> + * EREMOVE'ing an SECS still with child, in which case it can
> + * be handled by EREMOVE'ing the SECS again after all pages in
> + * virtual EPC have been EREMOVE'd. See comments in below in
> + * sgx_vepc_release().
> + *
> + * The user of virtual EPC (KVM) needs to guarantee there's no
> + * logical processor is still running in the enclave in guest,
> + * otherwise EREMOVE will get SGX_ENCLAVE_ACT which cannot be
> + * handled here.
> + */
> + WARN_ONCE(ret != SGX_CHILD_PRESENT,
> + "EREMOVE (EPC page 0x%lx): unexpected error: %d\n",
> + sgx_get_epc_phys_addr(epc_page), ret);
> + return ret;
> + }
> +
> + sgx_free_epc_page(epc_page);
> + return 0;
> +}
> +
> +static int sgx_vepc_release(struct inode *inode, struct file *file)
> +{
> + struct sgx_vepc *vepc = file->private_data;
> + struct sgx_epc_page *epc_page, *tmp, *entry;
> + unsigned long index;
> +
> + LIST_HEAD(secs_pages);
> +
> + xa_for_each(&vepc->page_array, index, entry) {
> + /*
> + * Remove all normal, child pages. sgx_vepc_free_page()
> + * will fail if EREMOVE fails, but this is OK and expected on
> + * SECS pages. Those can only be EREMOVE'd *after* all their
> + * child pages. Retries below will clean them up.
> + */
> + if (sgx_vepc_free_page(entry))
> + continue;
> +
> + xa_erase(&vepc->page_array, index);
> + }
> +
> + /*
> + * Retry EREMOVE'ing pages. This will clean up any SECS pages that
> + * only had children in this 'epc' area.
> + */
> + xa_for_each(&vepc->page_array, index, entry) {
> + epc_page = entry;
> + /*
> + * An EREMOVE failure here means that the SECS page still
> + * has children. But, since all children in this 'sgx_vepc'
> + * have been removed, the SECS page must have a child on
> + * another instance.
> + */
> + if (sgx_vepc_free_page(epc_page))
> + list_add_tail(&epc_page->list, &secs_pages);
> +
> + xa_erase(&vepc->page_array, index);
> + }
> +
> + /*
> + * SECS pages are "pinned" by child pages, an unpinned once all
> + * children have been EREMOVE'd. A child page in this instance
> + * may have pinned an SECS page encountered in an earlier release(),
> + * creating a zombie. Since some children were EREMOVE'd above,
> + * try to EREMOVE all zombies in the hopes that one was unpinned.
> + */
> + mutex_lock(&zombie_secs_pages_lock);
> + list_for_each_entry_safe(epc_page, tmp, &zombie_secs_pages, list) {
> + /*
> + * Speculatively remove the page from the list of zombies,
> + * if the page is successfully EREMOVE it will be added to
> + * the list of free pages. If EREMOVE fails, throw the page
> + * on the local list, which will be spliced on at the end.
> + */
> + list_del(&epc_page->list);
> +
> + if (sgx_vepc_free_page(epc_page))
> + list_add_tail(&epc_page->list, &secs_pages);
> + }
> +
> + if (!list_empty(&secs_pages))
> + list_splice_tail(&secs_pages, &zombie_secs_pages);
> + mutex_unlock(&zombie_secs_pages_lock);
> +
> + kfree(vepc);
> +
> + return 0;
> +}
> +
> +static int sgx_vepc_open(struct inode *inode, struct file *file)
> +{
> + struct sgx_vepc *vepc;
> +
> + vepc = kzalloc(sizeof(struct sgx_vepc), GFP_KERNEL);
> + if (!vepc)
> + return -ENOMEM;
> + mutex_init(&vepc->lock);
> + xa_init(&vepc->page_array);
> +
> + file->private_data = vepc;
> +
> + return 0;
> +}
> +
> +static const struct file_operations sgx_vepc_fops = {
> + .owner = THIS_MODULE,
> + .open = sgx_vepc_open,
> + .release = sgx_vepc_release,
> + .mmap = sgx_vepc_mmap,
> +};
> +
> +static struct miscdevice sgx_vepc_dev = {
> + .minor = MISC_DYNAMIC_MINOR,
> + .name = "sgx_vepc",
> + .nodename = "sgx_vepc",
> + .fops = &sgx_vepc_fops,
> +};
> +
> +int __init sgx_vepc_init(void)
> +{
> + /* SGX virtualization requires KVM to work */
> + if (!boot_cpu_has(X86_FEATURE_VMX) || !IS_ENABLED(CONFIG_KVM_INTEL))
> + return -ENODEV;
> +
> + INIT_LIST_HEAD(&zombie_secs_pages);
> + mutex_init(&zombie_secs_pages_lock);
> +
> + return misc_register(&sgx_vepc_dev);
> +}
> diff --git a/arch/x86/kernel/cpu/sgx/virt.h b/arch/x86/kernel/cpu/sgx/virt.h
> new file mode 100644
> index 000000000000..44d872380ca1
> --- /dev/null
> +++ b/arch/x86/kernel/cpu/sgx/virt.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
> +#ifndef _ASM_X86_SGX_VIRT_H
> +#define _ASM_X86_SGX_VIRT_H
> +
> +#ifdef CONFIG_X86_SGX_KVM
> +int __init sgx_vepc_init(void);
> +#else
> +static inline int __init sgx_vepc_init(void)
> +{
> + return -ENODEV;
> +}
> +#endif
> +
> +#endif /* _ASM_X86_SGX_VIRT_H */
> --
> 2.29.2
>
>
Other than that, this starts to be in shape.
/Jarkko
next prev parent reply other threads:[~2021-01-30 16:24 UTC|newest]
Thread overview: 156+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-26 10:10 [RFC PATCH v3 00/27] KVM SGX virtualization support Kai Huang
2021-01-26 9:29 ` Kai Huang
2021-01-26 9:30 ` [RFC PATCH v3 01/27] x86/cpufeatures: Add SGX1 and SGX2 sub-features Kai Huang
2021-01-26 15:34 ` Dave Hansen
2021-01-26 23:18 ` Kai Huang
2021-01-30 13:20 ` Jarkko Sakkinen
2021-02-01 0:01 ` Kai Huang
2021-02-02 17:17 ` Jarkko Sakkinen
2021-02-03 1:09 ` Kai Huang
2021-02-02 17:56 ` Paolo Bonzini
2021-02-02 18:00 ` Dave Hansen
2021-02-02 18:03 ` Paolo Bonzini
2021-02-02 18:42 ` Sean Christopherson
2021-02-03 1:05 ` Kai Huang
2021-01-30 13:11 ` Jarkko Sakkinen
2021-01-26 9:30 ` [RFC PATCH v3 02/27] x86/cpufeatures: Make SGX_LC feature bit depend on SGX bit Kai Huang
2021-01-26 15:35 ` Dave Hansen
2021-01-30 13:22 ` Jarkko Sakkinen
2021-02-01 0:08 ` Kai Huang
2021-01-26 9:30 ` [RFC PATCH v3 03/27] x86/sgx: Remove a warn from sgx_free_epc_page() Kai Huang
2021-01-26 15:39 ` Dave Hansen
2021-01-26 16:30 ` Sean Christopherson
2021-01-27 1:08 ` Kai Huang
2021-01-27 1:12 ` Dave Hansen
2021-01-27 1:26 ` Kai Huang
2021-02-01 0:11 ` Kai Huang
2021-02-03 10:03 ` Jarkko Sakkinen
2021-01-26 9:30 ` [RFC PATCH v3 04/27] x86/sgx: Wipe out EREMOVE " Kai Huang
2021-01-26 16:04 ` Dave Hansen
2021-01-27 1:25 ` Kai Huang
2021-02-02 18:00 ` Paolo Bonzini
2021-02-02 19:25 ` Kai Huang
2021-02-02 19:02 ` Dave Hansen
2021-01-26 9:30 ` [RFC PATCH v3 05/27] x86/sgx: Add SGX_CHILD_PRESENT hardware error code Kai Huang
2021-01-26 15:49 ` Dave Hansen
2021-01-27 0:00 ` Kai Huang
2021-01-27 0:21 ` Dave Hansen
2021-01-27 0:52 ` Kai Huang
2021-01-26 9:30 ` [RFC PATCH v3 06/27] x86/sgx: Introduce virtual EPC for use by KVM guests Kai Huang
2021-01-26 16:19 ` Dave Hansen
2021-01-27 0:16 ` Kai Huang
2021-01-27 0:27 ` Dave Hansen
2021-01-27 0:48 ` Kai Huang
2021-01-30 14:41 ` Jarkko Sakkinen [this message]
2021-01-26 9:30 ` [RFC PATCH v3 07/27] x86/cpu/intel: Allow SGX virtualization without Launch Control support Kai Huang
2021-01-26 16:26 ` Dave Hansen
2021-01-26 17:00 ` Sean Christopherson
2021-01-26 23:54 ` Kai Huang
2021-01-26 23:56 ` Kai Huang
2021-01-27 0:18 ` Dave Hansen
2021-01-27 2:02 ` Kai Huang
2021-01-27 17:13 ` Sean Christopherson
2021-01-30 14:42 ` Jarkko Sakkinen
2021-02-01 5:38 ` Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 08/27] x86/sgx: Initialize virtual EPC driver even when SGX driver is disabled Kai Huang
2021-01-26 17:03 ` Dave Hansen
2021-01-26 18:10 ` Andy Lutomirski
2021-01-26 23:25 ` Kai Huang
2021-01-30 14:45 ` Jarkko Sakkinen
2021-02-01 5:40 ` Kai Huang
2021-02-01 15:25 ` Dave Hansen
2021-02-01 17:23 ` Sean Christopherson
2021-02-02 0:12 ` Kai Huang
2021-02-02 23:10 ` Jarkko Sakkinen
2021-02-02 23:07 ` Jarkko Sakkinen
2021-02-02 17:32 ` Jarkko Sakkinen
2021-02-02 18:20 ` Sean Christopherson
2021-02-02 23:16 ` Jarkko Sakkinen
2021-02-03 0:49 ` Kai Huang
2021-02-03 22:02 ` Jarkko Sakkinen
2021-02-03 22:59 ` Sean Christopherson
2021-02-04 1:39 ` Jarkko Sakkinen
2021-02-04 2:59 ` Kai Huang
2021-02-04 3:05 ` Jarkko Sakkinen
2021-02-04 3:09 ` Jarkko Sakkinen
2021-02-04 3:20 ` Kai Huang
2021-02-04 14:51 ` Jarkko Sakkinen
2021-02-04 22:41 ` Dave Hansen
2021-02-04 22:56 ` Kai Huang
2021-02-05 2:08 ` Jarkko Sakkinen
2021-02-05 3:00 ` Huang, Kai
2021-02-02 18:49 ` Kai Huang
2021-02-02 23:17 ` Jarkko Sakkinen
2021-01-26 9:31 ` [RFC PATCH v3 09/27] x86/sgx: Expose SGX architectural definitions to the kernel Kai Huang
2021-01-30 14:46 ` Jarkko Sakkinen
2021-01-26 9:31 ` [RFC PATCH v3 10/27] x86/sgx: Move ENCLS leaf definitions to sgx_arch.h Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 11/27] x86/sgx: Add SGX2 ENCLS leaf definitions (EAUG, EMODPR and EMODT) Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 12/27] x86/sgx: Add encls_faulted() helper Kai Huang
2021-01-30 14:48 ` Jarkko Sakkinen
2021-01-26 9:31 ` [RFC PATCH v3 13/27] x86/sgx: Add helper to update SGX_LEPUBKEYHASHn MSRs Kai Huang
2021-01-30 14:49 ` Jarkko Sakkinen
2021-02-01 1:17 ` Kai Huang
2021-02-01 21:22 ` Dave Hansen
2021-01-26 9:31 ` [RFC PATCH v3 14/27] x86/sgx: Add helpers to expose ECREATE and EINIT to KVM Kai Huang
2021-01-30 14:51 ` Jarkko Sakkinen
2021-02-01 0:17 ` Kai Huang
2021-02-02 17:20 ` Jarkko Sakkinen
2021-02-02 20:35 ` Kai Huang
2021-02-04 3:53 ` Kai Huang
2021-02-05 0:32 ` Sean Christopherson
2021-02-05 1:39 ` Huang, Kai
2021-01-26 9:31 ` [RFC PATCH v3 15/27] x86/sgx: Move provisioning device creation out of SGX driver Kai Huang
2021-01-30 14:52 ` Jarkko Sakkinen
2021-01-26 9:31 ` [RFC PATCH v3 16/27] KVM: VMX: Convert vcpu_vmx.exit_reason to a union Kai Huang
2021-01-30 15:00 ` Jarkko Sakkinen
2021-02-01 0:32 ` Kai Huang
2021-02-02 17:24 ` Jarkko Sakkinen
2021-02-02 19:23 ` Kai Huang
2021-02-02 22:41 ` Jarkko Sakkinen
2021-02-03 0:42 ` Kai Huang
2021-02-01 17:12 ` Sean Christopherson
2021-02-02 22:38 ` Jarkko Sakkinen
2021-01-26 9:31 ` [RFC PATCH v3 17/27] KVM: x86: Export kvm_mmu_gva_to_gpa_{read,write}() for SGX (VMX) Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 18/27] KVM: x86: Define new #PF SGX error code bit Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 19/27] KVM: x86: Add support for reverse CPUID lookup of scattered features Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 20/27] KVM: x86: Add reverse-CPUID lookup support for scattered SGX features Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 21/27] KVM: VMX: Add basic handling of VM-Exit from SGX enclave Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 22/27] KVM: VMX: Frame in ENCLS handler for SGX virtualization Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 23/27] KVM: VMX: Add SGX ENCLS[ECREATE] handler to enforce CPUID restrictions Kai Huang
2021-02-03 0:52 ` Edgecombe, Rick P
2021-02-03 1:36 ` Sean Christopherson
2021-02-03 9:11 ` Kai Huang
2021-02-03 17:07 ` Sean Christopherson
2021-02-03 23:11 ` Kai Huang
2021-02-03 18:47 ` Edgecombe, Rick P
2021-02-03 19:36 ` Sean Christopherson
2021-02-03 23:29 ` Kai Huang
2021-02-03 23:36 ` Sean Christopherson
2021-02-03 23:45 ` Kai Huang
2021-02-03 23:59 ` Sean Christopherson
2021-02-04 0:11 ` Kai Huang
2021-02-04 2:01 ` Sean Christopherson
2021-01-26 9:31 ` [RFC PATCH v3 24/27] KVM: VMX: Add emulation of SGX Launch Control LE hash MSRs Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 25/27] KVM: VMX: Add ENCLS[EINIT] handler to support SGX Launch Control (LC) Kai Huang
2021-01-26 9:31 ` [RFC PATCH v3 26/27] KVM: VMX: Enable SGX virtualization for SGX1, SGX2 and LC Kai Huang
2021-01-26 9:32 ` [RFC PATCH v3 27/27] KVM: x86: Add capability to grant VM access to privileged SGX attribute Kai Huang
2021-02-02 22:21 ` [RFC PATCH v3 00/27] KVM SGX virtualization support Edgecombe, Rick P
2021-02-02 22:33 ` Sean Christopherson
2021-02-02 23:21 ` Dave Hansen
2021-02-02 23:56 ` Sean Christopherson
2021-02-03 0:43 ` Dave Hansen
2021-02-03 15:10 ` Dave Hansen
2021-02-03 17:36 ` Sean Christopherson
2021-02-03 17:43 ` Paolo Bonzini
2021-02-03 17:46 ` Dave Hansen
2021-02-03 23:09 ` Kai Huang
2021-02-03 23:32 ` Sean Christopherson
2021-02-03 23:37 ` Dave Hansen
2021-02-04 0:04 ` Kai Huang
2021-02-04 0:28 ` Sean Christopherson
2021-02-04 3:18 ` Kai Huang
2021-02-04 16:28 ` Sean Christopherson
2021-02-04 16:48 ` Dave Hansen
2021-02-05 12:32 ` Kai Huang
2021-02-05 16:51 ` Sean Christopherson
2021-02-02 22:36 ` Dave Hansen
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=YBVwDAOYfsDFZ1CY@kernel.org \
--to=jarkko@kernel.org \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=haitao.huang@intel.com \
--cc=hpa@zytor.com \
--cc=kai.huang@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-sgx@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--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