All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Price <steven.price@arm.com>
To: Marc Zyngier <maz@kernel.org>
Cc: "Mark Rutland" <mark.rutland@arm.com>,
	kvm@vger.kernel.org, "Radim Krčmář" <rkrcmar@redhat.com>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	"Suzuki K Pouloze" <suzuki.poulose@arm.com>,
	linux-doc@vger.kernel.org, "Russell King" <linux@armlinux.org.uk>,
	linux-kernel@vger.kernel.org, "James Morse" <james.morse@arm.com>,
	"Julien Thierry" <julien.thierry.kdev@gmail.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Will Deacon" <will@kernel.org>,
	kvmarm@lists.cs.columbia.edu,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v7 00/10] arm64: Stolen time support
Date: Wed, 23 Oct 2019 14:50:14 +0100	[thread overview]
Message-ID: <5b3968d8-9a5a-ee9d-70b3-436dc052dd0a@arm.com> (raw)
In-Reply-To: <f0d79362ab994e269680fba75f913044@www.loen.fr>

On 23/10/2019 13:39, Marc Zyngier wrote:
> Hi Steven,
> 
> On 2019-10-21 16:28, Steven Price wrote:
>> 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/v7
> 
> Can 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


WARNING: multiple messages have this Message-ID (diff)
From: Steven Price <steven.price@arm.com>
To: Marc Zyngier <maz@kernel.org>
Cc: kvm@vger.kernel.org, Catalin Marinas <catalin.marinas@arm.com>,
	linux-doc@vger.kernel.org, Russell King <linux@armlinux.org.uk>,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Paolo Bonzini <pbonzini@redhat.com>,
	Will Deacon <will@kernel.org>,
	kvmarm@lists.cs.columbia.edu
Subject: Re: [PATCH v7 00/10] arm64: Stolen time support
Date: Wed, 23 Oct 2019 14:50:14 +0100	[thread overview]
Message-ID: <5b3968d8-9a5a-ee9d-70b3-436dc052dd0a@arm.com> (raw)
In-Reply-To: <f0d79362ab994e269680fba75f913044@www.loen.fr>

On 23/10/2019 13:39, Marc Zyngier wrote:
> Hi Steven,
> 
> On 2019-10-21 16:28, Steven Price wrote:
>> 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/v7
> 
> Can 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

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

WARNING: multiple messages have this Message-ID (diff)
From: Steven Price <steven.price@arm.com>
To: Marc Zyngier <maz@kernel.org>
Cc: "Mark Rutland" <mark.rutland@arm.com>,
	"Radim Krčmář" <rkrcmar@redhat.com>,
	kvm@vger.kernel.org, "Suzuki K Pouloze" <suzuki.poulose@arm.com>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	linux-doc@vger.kernel.org, "Russell King" <linux@armlinux.org.uk>,
	linux-kernel@vger.kernel.org, "James Morse" <james.morse@arm.com>,
	linux-arm-kernel@lists.infradead.org,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Will Deacon" <will@kernel.org>,
	kvmarm@lists.cs.columbia.edu,
	"Julien Thierry" <julien.thierry.kdev@gmail.com>
Subject: Re: [PATCH v7 00/10] arm64: Stolen time support
Date: Wed, 23 Oct 2019 14:50:14 +0100	[thread overview]
Message-ID: <5b3968d8-9a5a-ee9d-70b3-436dc052dd0a@arm.com> (raw)
In-Reply-To: <f0d79362ab994e269680fba75f913044@www.loen.fr>

On 23/10/2019 13:39, Marc Zyngier wrote:
> Hi Steven,
> 
> On 2019-10-21 16:28, Steven Price wrote:
>> 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/v7
> 
> Can 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

  reply	other threads:[~2019-10-23 13:50 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-21 15:28 [PATCH v7 00/10] arm64: Stolen time support Steven Price
2019-10-21 15:28 ` Steven Price
2019-10-21 15:28 ` Steven Price
2019-10-21 15:28 ` [PATCH v7 01/10] KVM: arm64: Document PV-time interface Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28 ` [PATCH v7 02/10] KVM: arm/arm64: Factor out hypercall handling from PSCI code Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28 ` [PATCH v7 03/10] KVM: arm64: Implement PV_TIME_FEATURES call Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28 ` [PATCH v7 04/10] KVM: Implement kvm_put_guest() Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28 ` [PATCH v7 05/10] KVM: arm64: Support stolen time reporting via shared structure Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28 ` [PATCH v7 06/10] KVM: Allow kvm_device_ops to be const Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28 ` [PATCH v7 07/10] KVM: arm64: Provide VCPU attributes for stolen time Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28 ` [PATCH v7 08/10] arm/arm64: Provide a wrapper for SMCCC 1.1 calls Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28 ` [PATCH v7 09/10] arm/arm64: Make use of the SMCCC 1.1 wrapper Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-25 15:50   ` Catalin Marinas
2019-10-25 15:50     ` Catalin Marinas
2019-10-25 15:50     ` Catalin Marinas
2019-10-21 15:28 ` [PATCH v7 10/10] arm64: Retrieve stolen time as paravirtualized guest Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-21 15:28   ` Steven Price
2019-10-25 15:57   ` Catalin Marinas
2019-10-25 15:57     ` Catalin Marinas
2019-10-25 15:57     ` Catalin Marinas
2019-10-21 18:37 ` [PATCH v7 00/10] arm64: Stolen time support Marc Zyngier
2019-10-21 18:37   ` Marc Zyngier
2019-10-21 18:37   ` Marc Zyngier
2019-10-23 12:39 ` Marc Zyngier
2019-10-23 12:39   ` Marc Zyngier
2019-10-23 12:39   ` Marc Zyngier
2019-10-23 13:50   ` Steven Price [this message]
2019-10-23 13:50     ` Steven Price
2019-10-23 13:50     ` Steven Price

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5b3968d8-9a5a-ee9d-70b3-436dc052dd0a@arm.com \
    --to=steven.price@arm.com \
    --cc=catalin.marinas@arm.com \
    --cc=james.morse@arm.com \
    --cc=julien.thierry.kdev@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=mark.rutland@arm.com \
    --cc=maz@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.com \
    --cc=suzuki.poulose@arm.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.