Re: [PATCH v7 00/10] arm64: Stolen time support
From: Steven Price <steven.price@arm.com>
Date: 2019-10-23 13:50:43
Also in:
kvm, kvmarm, linux-doc, lkml
Subsystem:
kernel build + files below scripts/ (unless maintained elsewhere), the rest · Maintainers:
Nathan Chancellor, Nicolas Schier, Linus Torvalds
On 23/10/2019 13:39, Marc Zyngier wrote:
Hi Steven, On 2019-10-21 16:28, Steven Price wrote:quoted
This series add support for paravirtualized time for arm64 guests and KVM hosts following the specification in Arm's document DEN 0057A: https://developer.arm.com/docs/den0057/a It implements support for stolen time, allowing the guest to identify time when it is forcibly not executing. Note that Live Physical Time (LPT) which was previously part of the above specification has now been removed. Also available as a git tree: git://linux-arm.org/linux-sp.git stolen_time/v7Can you please point me to userspace patches that I could apply to kvmtool? I'd like to give this series a go as part of my normal testing.
I don't have a proper patch yet, but the below is what I've been testing with (this breaks with kernels without PV-time). Steve ----8<---- From 8f6540cfbe2842f3ee422c07fbd1f590534cc90a Mon Sep 17 00:00:00 2001 From: Steven Price <steven.price@arm.com> Date: Thu, 8 Nov 2018 13:43:56 +0000 Subject: [PATCH kvmtool] ARM PV time support Signed-off-by: Steven Price <steven.price@arm.com> --- Makefile | 2 +- arm/kvm-cpu.c | 4 ++++ arm/pvtime.c | 47 ++++++++++++++++++++++++++++++++++++++++ include/kvm/arm-pvtime.h | 6 +++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 arm/pvtime.c create mode 100644 include/kvm/arm-pvtime.h
diff --git a/Makefile b/Makefile
index 3862112..a79956b 100644
--- a/Makefile
+++ b/Makefile@@ -158,7 +158,7 @@ endif # ARM OBJS_ARM_COMMON := arm/fdt.o arm/gic.o arm/gicv2m.o arm/ioport.o \ arm/kvm.o arm/kvm-cpu.o arm/pci.o arm/timer.o \ - arm/pmu.o + arm/pmu.o arm/pvtime.o HDRS_ARM_COMMON := arm/include ifeq ($(ARCH), arm) DEFINES += -DCONFIG_ARM
diff --git a/arm/kvm-cpu.c b/arm/kvm-cpu.c
index 7780251..c903b05 100644
--- a/arm/kvm-cpu.c
+++ b/arm/kvm-cpu.c@@ -1,5 +1,6 @@ #include "kvm/kvm.h" #include "kvm/kvm-cpu.h" +#include "kvm/arm-pvtime.h" static int debug_fd;
@@ -122,6 +123,9 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id) vcpu->cpu_compatible = target->compatible; vcpu->is_running = true; + if (pvtime_vcpu_init(vcpu)) + die("Unable to initialise pvtime"); + return vcpu; }
diff --git a/arm/pvtime.c b/arm/pvtime.c
new file mode 100644
index 0000000..fc152d3
--- /dev/null
+++ b/arm/pvtime.c@@ -0,0 +1,47 @@ +#include "kvm/kvm.h" +#include "kvm/kvm-cpu.h" +#include "kvm/arm-pvtime.h" + +#define PVTIME_BASE 0x10000000 + +#define KVM_ARM_VCPU_PVTIME_CTRL 2 +#define KVM_ARM_VCPU_PVTIME_IPA 0 + +static int pvtime_init(struct kvm *kvm) +{ + char *mem; + int size = ALIGN(64 * kvm->cfg.nrcpus, PAGE_SIZE); + + mem = mmap(NULL, size, PROT_RW, MAP_ANON_NORESERVE, -1, 0); + if (mem == MAP_FAILED) + return -ENOMEM; + + if (kvm__register_dev_mem(kvm, PVTIME_BASE, size, mem)) + return -EINVAL; + + return 0; +} + +base_init(pvtime_init); + +int pvtime_vcpu_init(struct kvm_cpu *vcpu) +{ + int err; + u64 st_paddr = PVTIME_BASE; + + st_paddr += vcpu->cpu_id * 64; + + struct kvm_device_attr st_base = { + .group = KVM_ARM_VCPU_PVTIME_CTRL, + .attr = KVM_ARM_VCPU_PVTIME_IPA, + .addr = (u64)&st_paddr + }; + + err = ioctl(vcpu->vcpu_fd, KVM_SET_DEVICE_ATTR, &st_base); + if (err) { + perror("ioctl st_base failed"); + return err; + } + + return 0; +}
diff --git a/include/kvm/arm-pvtime.h b/include/kvm/arm-pvtime.h
new file mode 100644
index 0000000..f5db286
--- /dev/null
+++ b/include/kvm/arm-pvtime.h@@ -0,0 +1,6 @@ +#ifndef ARM_PVTIME_H +#define ARM_PVTIME_H + +int pvtime_vcpu_init(struct kvm_cpu *vcpu); + +#endif
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel