@@ -2186,25 +2186,16 @@ static int kvm_init(MachineState *ms)
* if memory encryption object is specified then initialize the memory
* encryption context.
*/
- if (ms->memory_encryption) {
- Object *obj = object_resolve_path_component(object_get_objects_root(),
- ms->memory_encryption);
-
- if (object_dynamic_cast(obj, TYPE_HOST_TRUST_LIMITATION)) {
- HostTrustLimitation *htl = HOST_TRUST_LIMITATION(obj);
- HostTrustLimitationClass *htlc
- = HOST_TRUST_LIMITATION_GET_CLASS(htl);
-
- ret = htlc->kvm_init(htl);
- if (ret < 0) {
- goto err;
- }
+ if (ms->htl) {
+ HostTrustLimitationClass *htlc =
+ HOST_TRUST_LIMITATION_GET_CLASS(ms->htl);
- kvm_state->htl = htl;
- } else {
- ret = -1;
+ ret = htlc->kvm_init(ms->htl);
+ if (ret < 0) {
goto err;
}
+
+ kvm_state->htl = ms->htl;
}
ret = kvm_arch_init(ms, s);
@@ -27,6 +27,7 @@
#include "hw/pci/pci.h"
#include "hw/mem/nvdimm.h"
#include "migration/vmstate.h"
+#include "exec/host-trust-limitation.h"
GlobalProperty hw_compat_5_0[] = {
{ "virtio-balloon-device", "page-poison", "false" },
@@ -422,16 +423,37 @@ static char *machine_get_memory_encryption(Object *obj, Error **errp)
{
MachineState *ms = MACHINE(obj);
- return g_strdup(ms->memory_encryption);
+ if (ms->htl) {
+ return g_strdup(object_get_canonical_path_component(OBJECT(ms->htl)));
+ }
+
+ return NULL;
}
static void machine_set_memory_encryption(Object *obj, const char *value,
Error **errp)
{
- MachineState *ms = MACHINE(obj);
+ Object *htl =
+ object_resolve_path_component(object_get_objects_root(), value);
+
+ if (!htl) {
+ error_setg(errp, "No such memory encryption object '%s'", value);
+ return;
+ }
- g_free(ms->memory_encryption);
- ms->memory_encryption = g_strdup(value);
+ object_property_set_link(obj, "host-trust-limitation", htl, errp);
+}
+
+static void machine_check_host_trust_limitation(const Object *obj,
+ const char *name,
+ Object *new_target,
+ Error **errp)
+{
+ /*
+ * So far the only constraint is that the target has the
+ * TYPE_HOST_TRUST_LIMITATION interface, and that's checked by the
+ * QOM core
+ */
}
static bool machine_get_nvdimm(Object *obj, Error **errp)
@@ -852,6 +874,15 @@ static void machine_class_init(ObjectClass *oc, void *data)
object_class_property_set_description(oc, "enforce-config-section",
"Set on to enforce configuration section migration");
+ object_class_property_add_link(oc, "host-trust-limitation",
+ TYPE_HOST_TRUST_LIMITATION,
+ offsetof(MachineState, htl),
+ machine_check_host_trust_limitation,
+ OBJ_PROP_LINK_STRONG);
+ object_class_property_set_description(oc, "host-trust-limitation",
+ "Set host trust limitation object to use");
+
+ /* For compatibility */
object_class_property_add_str(oc, "memory-encryption",
machine_get_memory_encryption, machine_set_memory_encryption);
object_class_property_set_description(oc, "memory-encryption",
@@ -1123,7 +1154,7 @@ void machine_run_board_init(MachineState *machine)
}
}
- if (machine->memory_encryption) {
+ if (machine->htl) {
/*
* With host trust limitation, the host can't see the real
* contents of RAM, so there's no point in it trying to merge
@@ -278,7 +278,7 @@ struct MachineState {
bool suppress_vmdesc;
bool enforce_config_section;
bool enable_graphics;
- char *memory_encryption;
+ HostTrustLimitation *htl;
char *ram_memdev_id;
/*
* convenience alias to ram_memdev_id backend memory region