aboutsummaryrefslogtreecommitdiff
path: root/hw/i386
diff options
context:
space:
mode:
authorYang Zhong <yang.zhong@intel.com>2021-09-10 18:22:56 +0800
committerPaolo Bonzini <pbonzini@redhat.com>2021-09-30 15:30:24 +0200
commit57d874c4c7a0acbaa076a166e3da093b6edbdb0f (patch)
tree1da4da237c64d35d8dcccc32df4d73f5fd9af9f1 /hw/i386
parentc5348c6a163f6956e7f640902b7401a1b4bad8c7 (diff)
downloadqemu-57d874c4c7a0acbaa076a166e3da093b6edbdb0f.zip
qemu-57d874c4c7a0acbaa076a166e3da093b6edbdb0f.tar.gz
qemu-57d874c4c7a0acbaa076a166e3da093b6edbdb0f.tar.bz2
target/i386: Add HMP and QMP interfaces for SGX
The QMP and HMP interfaces can be used by monitor or QMP tools to retrieve the SGX information from VM side when SGX is enabled on Intel platform. Signed-off-by: Yang Zhong <yang.zhong@intel.com> Message-Id: <20210910102258.46648-2-yang.zhong@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hw/i386')
-rw-r--r--hw/i386/sgx-stub.c7
-rw-r--r--hw/i386/sgx.c31
2 files changed, 38 insertions, 0 deletions
diff --git a/hw/i386/sgx-stub.c b/hw/i386/sgx-stub.c
index 483c72b..485e16e 100644
--- a/hw/i386/sgx-stub.c
+++ b/hw/i386/sgx-stub.c
@@ -1,6 +1,13 @@
#include "qemu/osdep.h"
#include "hw/i386/pc.h"
#include "hw/i386/sgx-epc.h"
+#include "hw/i386/sgx.h"
+
+SGXInfo *sgx_get_info(Error **errp)
+{
+ error_setg(errp, "SGX support is not compiled in");
+ return NULL;
+}
void pc_machine_init_sgx_epc(PCMachineState *pcms)
{
diff --git a/hw/i386/sgx.c b/hw/i386/sgx.c
index 8a18cdd..ea75398 100644
--- a/hw/i386/sgx.c
+++ b/hw/i386/sgx.c
@@ -17,6 +17,37 @@
#include "monitor/qdev.h"
#include "qapi/error.h"
#include "exec/address-spaces.h"
+#include "hw/i386/sgx.h"
+
+SGXInfo *sgx_get_info(Error **errp)
+{
+ SGXInfo *info = NULL;
+ X86MachineState *x86ms;
+ PCMachineState *pcms =
+ (PCMachineState *)object_dynamic_cast(qdev_get_machine(),
+ TYPE_PC_MACHINE);
+ if (!pcms) {
+ error_setg(errp, "SGX is only supported on PC machines");
+ return NULL;
+ }
+
+ x86ms = X86_MACHINE(pcms);
+ if (!x86ms->sgx_epc_list) {
+ error_setg(errp, "No EPC regions defined, SGX not available");
+ return NULL;
+ }
+
+ SGXEPCState *sgx_epc = &pcms->sgx_epc;
+ info = g_new0(SGXInfo, 1);
+
+ info->sgx = true;
+ info->sgx1 = true;
+ info->sgx2 = true;
+ info->flc = true;
+ info->section_size = sgx_epc->size;
+
+ return info;
+}
int sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size)
{