From: Jean-Philippe Brucker <[email protected]> Once the Realm descriptor has been created, tell KVM to transfer runtime images (kernel, DT, and rootfs) from guest memory to Realm memory.
Signed-off-by: Jean-Philippe Brucker <[email protected]> Signed-off-by: Mathieu Poirier <[email protected]> --- target/arm/kvm-rme.c | 56 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/target/arm/kvm-rme.c b/target/arm/kvm-rme.c index 97ec7c8934c9..58669f4a50f1 100644 --- a/target/arm/kvm-rme.c +++ b/target/arm/kvm-rme.c @@ -44,12 +44,68 @@ OBJECT_DEFINE_SIMPLE_TYPE_WITH_INTERFACES(RmeGuest, rme_guest, RME_GUEST, static RmeGuest *rme_guest; +static int rme_populate_range(const RmeRamRegion *region, bool measure, + Error **errp) +{ + int ret; + void *host_ua; + hwaddr size = region->size; + hwaddr base = region->base; + hwaddr start = QEMU_ALIGN_DOWN(base, RME_PAGE_SIZE); + hwaddr end = QEMU_ALIGN_UP(base + size, RME_PAGE_SIZE); + struct kvm_arm_rmi_populate populate_args; + + host_ua = address_space_map(region->as, base, &size, false, + MEMTXATTRS_UNSPECIFIED); + + populate_args = (struct kvm_arm_rmi_populate) { + .base = start, + .size = end - start, + .source_uaddr = (uintptr_t)host_ua, + .flags = measure ? KVM_ARM_RMI_POPULATE_FLAGS_MEASURE : 0, + }; + + while (populate_args.size > 0) { + ret = kvm_vm_ioctl(kvm_state, KVM_ARM_RMI_POPULATE, &populate_args, 0); + if (ret) { + error_setg_errno(errp, -ret, + "failed to populate realm [0x%"HWADDR_PRIx", 0x%"HWADDR_PRIx")", + start, end); + break; + } + } + + address_space_unmap(region->as, host_ua, size, false, 0); + + return ret; +} + +static void rme_populate_ram_region(gpointer data, gpointer err) +{ + Error **errp = err; + const RmeRamRegion *region = data; + + if (*errp) { + return; + } + + rme_populate_range(region, /* measure */ true, errp); +} + static void rme_vm_state_change(void *opaque, bool running, RunState state) { + Error *errp = NULL; + if (!running) { return; } + g_slist_foreach(rme_guest->ram_regions, rme_populate_ram_region, &errp); + g_slist_free_full(g_steal_pointer(&rme_guest->ram_regions), g_free); + if (errp) { + return; + } + kvm_mark_guest_state_protected(); } -- 2.43.0
