[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL v4 32/43] sgx-epc: Add the reset interface for sgx-epc virt device
From: |
Paolo Bonzini |
Subject: |
[PULL v4 32/43] sgx-epc: Add the reset interface for sgx-epc virt device |
Date: |
Wed, 8 Sep 2021 12:04:15 +0200 |
From: Yang Zhong <yang.zhong@intel.com>
If the VM is reset, we need make sure sgx virt epc in clean status.
Once the VM is reset, and sgx epc virt device will be reseted by
reset callback registered by qemu_register_reset(). Since this epc
virt device depend on backend, this reset will call backend reset
interface to re-mmap epc to guest.
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
Message-Id: <20210719112136.57018-24-yang.zhong@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/i386/sgx-epc.c | 94 ++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 81 insertions(+), 13 deletions(-)
diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c
index 924dea22f0..9880d832d5 100644
--- a/hw/i386/sgx-epc.c
+++ b/hw/i386/sgx-epc.c
@@ -18,6 +18,9 @@
#include "qapi/visitor.h"
#include "target/i386/cpu.h"
#include "exec/address-spaces.h"
+#include "sysemu/reset.h"
+
+uint32_t epc_num;
static Property sgx_epc_properties[] = {
DEFINE_PROP_UINT64(SGX_EPC_ADDR_PROP, SGXEPCDevice, addr, 0),
@@ -47,12 +50,84 @@ static void sgx_epc_init(Object *obj)
NULL, NULL, NULL);
}
+static void sgx_epc_del_subregion(DeviceState *dev)
+{
+ PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
+ SGXEPCState *sgx_epc = &pcms->sgx_epc;
+ SGXEPCDevice *epc = SGX_EPC(dev);
+
+ /* del subregion and related operations */
+ memory_region_del_subregion(&sgx_epc->mr,
+ host_memory_backend_get_memory(epc->hostmem));
+ host_memory_backend_set_mapped(epc->hostmem, false);
+ g_free(sgx_epc->sections);
+ sgx_epc->sections = NULL;
+
+ /* multiple epc devices, only zero the first time */
+ if (epc_num == sgx_epc->nr_sections) {
+ sgx_epc->size = 0;
+ sgx_epc->nr_sections = 0;
+ }
+}
+
+static void sgx_epc_initialization(DeviceState *dev)
+{
+ PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
+ SGXEPCState *sgx_epc = &pcms->sgx_epc;
+ MemoryDeviceState *md = MEMORY_DEVICE(dev);
+ SGXEPCDevice *epc = SGX_EPC(dev);
+ Error *errp = NULL;
+
+ if (!epc->hostmem) {
+ error_setg(&errp, "'" SGX_EPC_MEMDEV_PROP "' property is not set");
+ return;
+ }
+
+ epc->addr = sgx_epc->base + sgx_epc->size;
+
+ memory_region_add_subregion(&sgx_epc->mr, epc->addr - sgx_epc->base,
+ host_memory_backend_get_memory(epc->hostmem));
+
+ host_memory_backend_set_mapped(epc->hostmem, true);
+
+ sgx_epc->sections = g_renew(SGXEPCDevice *, sgx_epc->sections,
+ sgx_epc->nr_sections + 1);
+ sgx_epc->sections[sgx_epc->nr_sections++] = epc;
+
+ sgx_epc->size += memory_device_get_region_size(md, &errp);
+}
+
+static void sgx_epc_reset(void *opaque)
+{
+ DeviceState *dev = opaque;
+ SGXEPCDevice *epc = SGX_EPC(dev);
+ Error *errp = NULL;
+ int fd;
+
+ if (!epc->hostmem) {
+ error_setg(&errp, "'" SGX_EPC_MEMDEV_PROP "' property is not set");
+ return;
+ }
+
+ /* delete subregion and related operations */
+ sgx_epc_del_subregion(dev);
+
+ /* reset sgx backend */
+ fd = memory_region_get_fd(host_memory_backend_get_memory(epc->hostmem));
+ sgx_memory_backend_reset(epc->hostmem, fd, &errp);
+ if (errp) {
+ error_setg(&errp, "failed to call sgx_memory_backend_reset");
+ return;
+ }
+
+ /* re-add subregion and related operations */
+ sgx_epc_initialization(dev);
+}
+
static void sgx_epc_realize(DeviceState *dev, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
X86MachineState *x86ms = X86_MACHINE(pcms);
- MemoryDeviceState *md = MEMORY_DEVICE(dev);
- SGXEPCState *sgx_epc = &pcms->sgx_epc;
SGXEPCDevice *epc = SGX_EPC(dev);
const char *path;
@@ -71,18 +146,11 @@ static void sgx_epc_realize(DeviceState *dev, Error **errp)
return;
}
- epc->addr = sgx_epc->base + sgx_epc->size;
+ sgx_epc_initialization(dev);
+ epc_num++;
- memory_region_add_subregion(&sgx_epc->mr, epc->addr - sgx_epc->base,
- host_memory_backend_get_memory(epc->hostmem));
-
- host_memory_backend_set_mapped(epc->hostmem, true);
-
- sgx_epc->sections = g_renew(SGXEPCDevice *, sgx_epc->sections,
- sgx_epc->nr_sections + 1);
- sgx_epc->sections[sgx_epc->nr_sections++] = epc;
-
- sgx_epc->size += memory_device_get_region_size(md, errp);
+ /* register the reset callback for sgx reset */
+ qemu_register_reset(sgx_epc_reset, dev);
}
static void sgx_epc_unrealize(DeviceState *dev)
--
2.31.1
- Re: [PULL v4 13/43] vl: Add sgx compound properties to expose SGX EPC sections to guest, (continued)
- [PULL v4 18/43] i386: Add get/set/migrate support for SGX_LEPUBKEYHASH MSRs, Paolo Bonzini, 2021/09/08
- [PULL v4 24/43] Adjust min CPUID level to 0x12 when SGX is enabled, Paolo Bonzini, 2021/09/08
- [PULL v4 12/43] i386: Add 'sgx-epc' device to expose EPC sections to guest, Paolo Bonzini, 2021/09/08
- [PULL v4 21/43] i386: Update SGX CPUID info according to hardware/KVM/user input, Paolo Bonzini, 2021/09/08
- [PULL v4 22/43] i386: kvm: Add support for exposing PROVISIONKEY to guest, Paolo Bonzini, 2021/09/08
- [PULL v4 19/43] fw_cfg: add etc/msr_feature_control, Paolo Bonzini, 2021/09/08
- [PULL v4 27/43] i386/pc: Add e820 entry for SGX EPC section(s), Paolo Bonzini, 2021/09/08
- [PULL v4 32/43] sgx-epc: Add the reset interface for sgx-epc virt device,
Paolo Bonzini <=
- [PULL v4 15/43] i386: Add SGX CPUID leaf FEAT_SGX_12_0_EAX, Paolo Bonzini, 2021/09/08
- [PULL v4 36/43] sgx-epc: Add the fill_device_info() callback support, Paolo Bonzini, 2021/09/08
- [PULL v4 40/43] docs/system: move x86 CPU configuration to a separate document, Paolo Bonzini, 2021/09/08
- [PULL v4 39/43] docs/system: standardize man page sections to --- with overline, Paolo Bonzini, 2021/09/08
- [PULL v4 23/43] i386: Propagate SGX CPUID sub-leafs to KVM, Paolo Bonzini, 2021/09/08
- [PULL v4 25/43] hw/i386/fw_cfg: Set SGX bits in feature control fw_cfg accordingly, Paolo Bonzini, 2021/09/08
- [PULL v4 28/43] i386: acpi: Add SGX EPC entry to ACPI tables, Paolo Bonzini, 2021/09/08
- [PULL v4 26/43] hw/i386/pc: Account for SGX EPC sections when calculating device memory, Paolo Bonzini, 2021/09/08
- [PULL v4 29/43] q35: Add support for SGX EPC, Paolo Bonzini, 2021/09/08