From: David Woodhouse <dwmw2@infradead.org>
To: Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
"Paul Durrant" <paul@xen.org>,
"Joao Martins" <joao.m.martins@oracle.com>,
"Ankur Arora" <ankur.a.arora@oracle.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Thomas Huth" <thuth@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Juan Quintela" <quintela@redhat.com>,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
"Claudio Fontana" <cfontana@suse.de>,
"Julien Grall" <julien@xen.org>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
armbru@redhat.com
Subject: [PATCH v10 22/59] i386/xen: handle VCPUOP_register_vcpu_time_info
Date: Wed, 1 Feb 2023 14:31:11 +0000 [thread overview]
Message-ID: <20230201143148.1744093-23-dwmw2@infradead.org> (raw)
In-Reply-To: <20230201143148.1744093-1-dwmw2@infradead.org>
From: Joao Martins <joao.m.martins@oracle.com>
In order to support Linux vdso in Xen.
Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
---
target/i386/cpu.h | 1 +
target/i386/kvm/xen-emu.c | 100 +++++++++++++++++++++++++++++++++-----
target/i386/machine.c | 1 +
3 files changed, 90 insertions(+), 12 deletions(-)
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index 109b2e5669..96c2d0d5cb 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1790,6 +1790,7 @@ typedef struct CPUArchState {
struct kvm_nested_state *nested_state;
uint64_t xen_vcpu_info_gpa;
uint64_t xen_vcpu_info_default_gpa;
+ uint64_t xen_vcpu_time_info_gpa;
#endif
#if defined(CONFIG_HVF)
HVFX86LazyFlags hvf_lflags;
diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c
index 1cec8566ec..0b3bd0b889 100644
--- a/target/i386/kvm/xen-emu.c
+++ b/target/i386/kvm/xen-emu.c
@@ -37,28 +37,41 @@
#define hypercall_compat32(longmode) (false)
#endif
-static int kvm_gva_rw(CPUState *cs, uint64_t gva, void *_buf, size_t sz,
- bool is_write)
+static bool kvm_gva_to_gpa(CPUState *cs, uint64_t gva, uint64_t *gpa,
+ size_t *len, bool is_write)
{
- uint8_t *buf = (uint8_t *)_buf;
- int ret;
-
- while (sz) {
struct kvm_translation tr = {
.linear_address = gva,
};
- size_t len = TARGET_PAGE_SIZE - (tr.linear_address & ~TARGET_PAGE_MASK);
- if (len > sz) {
- len = sz;
+ if (len) {
+ *len = TARGET_PAGE_SIZE - (gva & ~TARGET_PAGE_MASK);
+ }
+
+ if (kvm_vcpu_ioctl(cs, KVM_TRANSLATE, &tr) || !tr.valid ||
+ (is_write && !tr.writeable)) {
+ return false;
}
+ *gpa = tr.physical_address;
+ return true;
+}
+
+static int kvm_gva_rw(CPUState *cs, uint64_t gva, void *_buf, size_t sz,
+ bool is_write)
+{
+ uint8_t *buf = (uint8_t *)_buf;
+ uint64_t gpa;
+ size_t len;
- ret = kvm_vcpu_ioctl(cs, KVM_TRANSLATE, &tr);
- if (ret || !tr.valid || (is_write && !tr.writeable)) {
+ while (sz) {
+ if (!kvm_gva_to_gpa(cs, gva, &gpa, &len, is_write)) {
return -EFAULT;
}
+ if (len > sz) {
+ len = sz;
+ }
- cpu_physical_memory_rw(tr.physical_address, buf, len, is_write);
+ cpu_physical_memory_rw(gpa, buf, len, is_write);
buf += len;
sz -= len;
@@ -146,6 +159,7 @@ int kvm_xen_init_vcpu(CPUState *cs)
env->xen_vcpu_info_gpa = INVALID_GPA;
env->xen_vcpu_info_default_gpa = INVALID_GPA;
+ env->xen_vcpu_time_info_gpa = INVALID_GPA;
return 0;
}
@@ -229,6 +243,17 @@ static void do_set_vcpu_info_gpa(CPUState *cs, run_on_cpu_data data)
env->xen_vcpu_info_gpa);
}
+static void do_set_vcpu_time_info_gpa(CPUState *cs, run_on_cpu_data data)
+{
+ X86CPU *cpu = X86_CPU(cs);
+ CPUX86State *env = &cpu->env;
+
+ env->xen_vcpu_time_info_gpa = data.host_ulong;
+
+ kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO,
+ env->xen_vcpu_time_info_gpa);
+}
+
static void do_vcpu_soft_reset(CPUState *cs, run_on_cpu_data data)
{
X86CPU *cpu = X86_CPU(cs);
@@ -236,8 +261,11 @@ static void do_vcpu_soft_reset(CPUState *cs, run_on_cpu_data data)
env->xen_vcpu_info_gpa = INVALID_GPA;
env->xen_vcpu_info_default_gpa = INVALID_GPA;
+ env->xen_vcpu_time_info_gpa = INVALID_GPA;
kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, INVALID_GPA);
+ kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO,
+ INVALID_GPA);
}
static int xen_set_shared_info(uint64_t gfn)
@@ -453,6 +481,42 @@ static int vcpuop_register_vcpu_info(CPUState *cs, CPUState *target,
return 0;
}
+static int vcpuop_register_vcpu_time_info(CPUState *cs, CPUState *target,
+ uint64_t arg)
+{
+ struct vcpu_register_time_memory_area tma;
+ uint64_t gpa;
+ size_t len;
+
+ /* No need for 32/64 compat handling */
+ qemu_build_assert(sizeof(tma) == 8);
+ qemu_build_assert(sizeof(struct vcpu_time_info) == 32);
+
+ if (!target) {
+ return -ENOENT;
+ }
+
+ if (kvm_copy_from_gva(cs, arg, &tma, sizeof(tma))) {
+ return -EFAULT;
+ }
+
+ /*
+ * Xen actually uses the GVA and does the translation through the guest
+ * page tables each time. But Linux/KVM uses the GPA, on the assumption
+ * that guests only ever use *global* addresses (kernel virtual addresses)
+ * for it. If Linux is changed to redo the GVA→GPA translation each time,
+ * it will offer a new vCPU attribute for that, and we'll use it instead.
+ */
+ if (!kvm_gva_to_gpa(cs, tma.addr.p, &gpa, &len, false) ||
+ len < sizeof(struct vcpu_time_info)) {
+ return -EFAULT;
+ }
+
+ async_run_on_cpu(target, do_set_vcpu_time_info_gpa,
+ RUN_ON_CPU_HOST_ULONG(gpa));
+ return 0;
+}
+
static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu,
int cmd, int vcpu_id, uint64_t arg)
{
@@ -461,6 +525,9 @@ static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu,
int err;
switch (cmd) {
+ case VCPUOP_register_vcpu_time_memory_area:
+ err = vcpuop_register_vcpu_time_info(cs, dest, arg);
+ break;
case VCPUOP_register_vcpu_info:
err = vcpuop_register_vcpu_info(cs, dest, arg);
break;
@@ -654,6 +721,15 @@ int kvm_put_xen_state(CPUState *cs)
}
}
+ gpa = env->xen_vcpu_time_info_gpa;
+ if (gpa != INVALID_GPA) {
+ ret = kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO,
+ gpa);
+ if (ret < 0) {
+ return ret;
+ }
+ }
+
return 0;
}
diff --git a/target/i386/machine.c b/target/i386/machine.c
index 1215e616c8..eb657907ca 100644
--- a/target/i386/machine.c
+++ b/target/i386/machine.c
@@ -1272,6 +1272,7 @@ static const VMStateDescription vmstate_xen_vcpu = {
.fields = (VMStateField[]) {
VMSTATE_UINT64(env.xen_vcpu_info_gpa, X86CPU),
VMSTATE_UINT64(env.xen_vcpu_info_default_gpa, X86CPU),
+ VMSTATE_UINT64(env.xen_vcpu_time_info_gpa, X86CPU),
VMSTATE_END_OF_LIST()
}
};
--
2.39.0
next prev parent reply other threads:[~2023-02-01 14:35 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-01 14:30 [PATCH v10 00/59] Xen HVM support under KVM David Woodhouse
2023-02-01 14:30 ` [PATCH v10 01/59] include: import Xen public headers to hw/xen/interface David Woodhouse
2023-02-01 14:30 ` [PATCH v10 02/59] xen: add CONFIG_XEN_BUS and CONFIG_XEN_EMU options for Xen emulation David Woodhouse
2023-02-01 14:30 ` [PATCH v10 03/59] xen: Add XEN_DISABLED mode and make it default David Woodhouse
2023-02-01 14:30 ` [PATCH v10 04/59] i386/kvm: Add xen-version KVM accelerator property and init KVM Xen support David Woodhouse
2023-02-01 14:30 ` [PATCH v10 05/59] i386/kvm: handle Xen HVM cpuid leaves David Woodhouse
2023-02-01 14:30 ` [PATCH v10 06/59] i386/hvm: Set Xen vCPU ID in KVM David Woodhouse
2023-02-01 14:30 ` [PATCH v10 07/59] xen-platform: exclude vfio-pci from the PCI platform unplug David Woodhouse
2023-02-01 14:30 ` [PATCH v10 08/59] xen-platform: allow its creation with XEN_EMULATE mode David Woodhouse
2023-02-01 14:30 ` [PATCH v10 09/59] i386/xen: handle guest hypercalls David Woodhouse
2023-02-01 14:30 ` [PATCH v10 10/59] i386/xen: implement HYPERVISOR_xen_version David Woodhouse
2023-02-01 14:31 ` [PATCH v10 11/59] i386/xen: implement HYPERVISOR_sched_op, SCHEDOP_shutdown David Woodhouse
2023-02-01 14:31 ` [PATCH v10 12/59] i386/xen: Implement SCHEDOP_poll and SCHEDOP_yield David Woodhouse
2023-02-01 14:31 ` [PATCH v10 13/59] hw/xen: Add xen_overlay device for emulating shared xenheap pages David Woodhouse
2023-02-01 14:31 ` [PATCH v10 14/59] xen: Permit --xen-domid argument when accel is KVM David Woodhouse
2023-02-01 14:31 ` [PATCH v10 15/59] i386/xen: add pc_machine_kvm_type to initialize XEN_EMULATE mode David Woodhouse
2023-02-01 14:31 ` [PATCH v10 16/59] i386/xen: manage and save/restore Xen guest long_mode setting David Woodhouse
2023-02-01 14:31 ` [PATCH v10 17/59] i386/xen: implement HYPERVISOR_memory_op David Woodhouse
2023-02-01 14:31 ` [PATCH v10 18/59] i386/xen: implement XENMEM_add_to_physmap_batch David Woodhouse
2023-02-01 14:31 ` [PATCH v10 19/59] i386/xen: implement HYPERVISOR_hvm_op David Woodhouse
2023-02-01 14:31 ` [PATCH v10 20/59] i386/xen: implement HYPERVISOR_vcpu_op David Woodhouse
2023-02-01 14:31 ` [PATCH v10 21/59] i386/xen: handle VCPUOP_register_vcpu_info David Woodhouse
2023-02-01 14:31 ` David Woodhouse [this message]
2023-02-01 14:31 ` [PATCH v10 23/59] i386/xen: handle VCPUOP_register_runstate_memory_area David Woodhouse
2023-02-01 14:31 ` [PATCH v10 24/59] i386/xen: implement HYPERVISOR_event_channel_op David Woodhouse
2023-02-01 14:31 ` [PATCH v10 25/59] i386/xen: implement HVMOP_set_evtchn_upcall_vector David Woodhouse
2023-02-01 14:31 ` [PATCH v10 26/59] i386/xen: implement HVMOP_set_param David Woodhouse
2023-02-01 14:31 ` [PATCH v10 27/59] hw/xen: Add xen_evtchn device for event channel emulation David Woodhouse
2023-02-01 14:31 ` [PATCH v10 28/59] i386/xen: Add support for Xen event channel delivery to vCPU David Woodhouse
2023-02-01 14:31 ` [PATCH v10 29/59] hw/xen: Implement EVTCHNOP_status David Woodhouse
2023-02-01 14:31 ` [PATCH v10 30/59] hw/xen: Implement EVTCHNOP_close David Woodhouse
2023-02-10 13:25 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 31/59] hw/xen: Implement EVTCHNOP_unmask David Woodhouse
2023-02-10 13:33 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 32/59] hw/xen: Implement EVTCHNOP_bind_virq David Woodhouse
2023-02-10 13:48 ` Paul Durrant
2023-02-15 13:08 ` David Woodhouse
2023-02-01 14:31 ` [PATCH v10 33/59] hw/xen: Implement EVTCHNOP_bind_ipi David Woodhouse
2023-02-10 13:55 ` Paul Durrant
2023-02-10 14:15 ` David Woodhouse
2023-02-10 14:25 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 34/59] hw/xen: Implement EVTCHNOP_send David Woodhouse
2023-02-10 13:58 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 35/59] hw/xen: Implement EVTCHNOP_alloc_unbound David Woodhouse
2023-02-10 14:13 ` Paul Durrant
2023-02-10 14:17 ` David Woodhouse
2023-02-10 14:28 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 36/59] hw/xen: Implement EVTCHNOP_bind_interdomain David Woodhouse
2023-02-10 14:30 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 37/59] hw/xen: Implement EVTCHNOP_bind_vcpu David Woodhouse
2023-02-10 14:36 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 38/59] hw/xen: Implement EVTCHNOP_reset David Woodhouse
2023-02-10 14:44 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 39/59] i386/xen: add monitor commands to test event injection David Woodhouse
2023-02-10 14:54 ` Paul Durrant
2023-02-10 15:05 ` David Woodhouse
2023-02-10 15:12 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 40/59] hw/xen: Support HVM_PARAM_CALLBACK_TYPE_GSI callback David Woodhouse
2023-02-10 15:24 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 41/59] hw/xen: Support HVM_PARAM_CALLBACK_TYPE_PCI_INTX callback David Woodhouse
2023-02-10 16:47 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 42/59] kvm/i386: Add xen-gnttab-max-frames property David Woodhouse
2023-02-13 15:17 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 43/59] hw/xen: Add xen_gnttab device for grant table emulation David Woodhouse
2023-02-13 15:21 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 44/59] hw/xen: Support mapping grant frames David Woodhouse
2023-02-13 15:31 ` Paul Durrant
2023-02-14 15:35 ` David Woodhouse
2023-02-14 15:40 ` Paul Durrant
2023-02-14 15:41 ` David Woodhouse
2023-02-01 14:31 ` [PATCH v10 45/59] i386/xen: Implement HYPERVISOR_grant_table_op and GNTTABOP_[gs]et_verson David Woodhouse
2023-02-14 9:59 ` Paul Durrant
2023-02-14 15:33 ` David Woodhouse
2023-02-01 14:31 ` [PATCH v10 46/59] hw/xen: Implement GNTTABOP_query_size David Woodhouse
2023-02-14 10:00 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 47/59] i386/xen: handle PV timer hypercalls David Woodhouse
2023-02-14 10:10 ` Paul Durrant
2023-02-14 15:37 ` David Woodhouse
2023-02-15 13:43 ` David Woodhouse
2023-02-01 14:31 ` [PATCH v10 48/59] i386/xen: Reserve Xen special pages for console, xenstore rings David Woodhouse
2023-02-14 15:35 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 49/59] i386/xen: handle HVMOP_get_param David Woodhouse
2023-02-14 15:47 ` Paul Durrant
2023-02-14 15:50 ` David Woodhouse
2023-02-01 14:31 ` [PATCH v10 50/59] hw/xen: Add backend implementation of interdomain event channel support David Woodhouse
2023-02-14 15:53 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 51/59] hw/xen: Add xen_xenstore device for xenstore emulation David Woodhouse
2023-02-14 15:55 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 52/59] hw/xen: Add basic ring handling to xenstore David Woodhouse
2023-02-14 16:02 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 53/59] hw/xen: Automatically add xen-platform PCI device for emulated Xen guests David Woodhouse
2023-02-14 16:04 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 54/59] i386/xen: Implement HYPERVISOR_physdev_op David Woodhouse
2023-02-14 16:06 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 55/59] hw/xen: Implement emulated PIRQ hypercall support David Woodhouse
2023-02-14 16:10 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 56/59] hw/xen: Support GSI mapping to PIRQ David Woodhouse
2023-02-14 16:12 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 57/59] hw/xen: Support MSI " David Woodhouse
2023-02-14 16:14 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 58/59] kvm/i386: Add xen-evtchn-max-pirq property David Woodhouse
2023-02-14 16:16 ` Paul Durrant
2023-02-01 14:31 ` [PATCH v10 59/59] i386/xen: Document Xen HVM emulation David Woodhouse
2023-02-14 16:20 ` Paul Durrant
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=20230201143148.1744093-23-dwmw2@infradead.org \
--to=dwmw2@infradead.org \
--cc=alex.bennee@linaro.org \
--cc=ankur.a.arora@oracle.com \
--cc=armbru@redhat.com \
--cc=cfontana@suse.de \
--cc=dgilbert@redhat.com \
--cc=joao.m.martins@oracle.com \
--cc=julien@xen.org \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=paul@xen.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=thuth@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).