[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 10/62] i386/xen: implement HYPERVISOR_xen_version
From: |
Paolo Bonzini |
Subject: |
[PULL 10/62] i386/xen: implement HYPERVISOR_xen_version |
Date: |
Thu, 2 Mar 2023 13:29:37 +0100 |
From: Joao Martins <joao.m.martins@oracle.com>
This is just meant to serve as an example on how we can implement
hypercalls. xen_version specifically since Qemu does all kind of
feature controllability. So handling that here seems appropriate.
Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
[dwmw2: Implement kvm_gva_rw() safely]
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
---
target/i386/kvm/xen-emu.c | 86 +++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c
index 476f464ee2f5..56b80a788049 100644
--- a/target/i386/kvm/xen-emu.c
+++ b/target/i386/kvm/xen-emu.c
@@ -14,9 +14,55 @@
#include "sysemu/kvm_int.h"
#include "sysemu/kvm_xen.h"
#include "kvm/kvm_i386.h"
+#include "exec/address-spaces.h"
#include "xen-emu.h"
#include "trace.h"
+#include "hw/xen/interface/version.h"
+
+static int kvm_gva_rw(CPUState *cs, uint64_t gva, void *_buf, size_t sz,
+ 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;
+ }
+
+ ret = kvm_vcpu_ioctl(cs, KVM_TRANSLATE, &tr);
+ if (ret || !tr.valid || (is_write && !tr.writeable)) {
+ return -EFAULT;
+ }
+
+ cpu_physical_memory_rw(tr.physical_address, buf, len, is_write);
+
+ buf += len;
+ sz -= len;
+ gva += len;
+ }
+
+ return 0;
+}
+
+static inline int kvm_copy_from_gva(CPUState *cs, uint64_t gva, void *buf,
+ size_t sz)
+{
+ return kvm_gva_rw(cs, gva, buf, sz, false);
+}
+
+static inline int kvm_copy_to_gva(CPUState *cs, uint64_t gva, void *buf,
+ size_t sz)
+{
+ return kvm_gva_rw(cs, gva, buf, sz, true);
+}
+
int kvm_xen_init(KVMState *s, uint32_t hypercall_msr)
{
const int required_caps = KVM_XEN_HVM_CONFIG_HYPERCALL_MSR |
@@ -87,6 +133,43 @@ uint32_t kvm_xen_get_caps(void)
return kvm_state->xen_caps;
}
+static bool kvm_xen_hcall_xen_version(struct kvm_xen_exit *exit, X86CPU *cpu,
+ int cmd, uint64_t arg)
+{
+ int err = 0;
+
+ switch (cmd) {
+ case XENVER_get_features: {
+ struct xen_feature_info fi;
+
+ /* No need for 32/64 compat handling */
+ qemu_build_assert(sizeof(fi) == 8);
+
+ err = kvm_copy_from_gva(CPU(cpu), arg, &fi, sizeof(fi));
+ if (err) {
+ break;
+ }
+
+ fi.submap = 0;
+ if (fi.submap_idx == 0) {
+ fi.submap |= 1 << XENFEAT_writable_page_tables |
+ 1 << XENFEAT_writable_descriptor_tables |
+ 1 << XENFEAT_auto_translated_physmap |
+ 1 << XENFEAT_supervisor_mode_kernel;
+ }
+
+ err = kvm_copy_to_gva(CPU(cpu), arg, &fi, sizeof(fi));
+ break;
+ }
+
+ default:
+ return false;
+ }
+
+ exit->u.hcall.result = err;
+ return true;
+}
+
static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit)
{
uint16_t code = exit->u.hcall.input;
@@ -97,6 +180,9 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct
kvm_xen_exit *exit)
}
switch (code) {
+ case __HYPERVISOR_xen_version:
+ return kvm_xen_hcall_xen_version(exit, cpu, exit->u.hcall.params[0],
+ exit->u.hcall.params[1]);
default:
return false;
}
--
2.39.1
- [PULL 00/62] i386, misc changes for QEMU 8.0 soft freeze, Paolo Bonzini, 2023/03/02
- [PULL 02/62] xen: add CONFIG_XEN_BUS and CONFIG_XEN_EMU options for Xen emulation, Paolo Bonzini, 2023/03/02
- [PULL 03/62] xen: Add XEN_DISABLED mode and make it default, Paolo Bonzini, 2023/03/02
- [PULL 05/62] i386/kvm: handle Xen HVM cpuid leaves, Paolo Bonzini, 2023/03/02
- [PULL 04/62] i386/kvm: Add xen-version KVM accelerator property and init KVM Xen support, Paolo Bonzini, 2023/03/02
- [PULL 01/62] include: import Xen public headers to hw/xen/interface, Paolo Bonzini, 2023/03/02
- [PULL 06/62] i386/kvm: Set Xen vCPU ID in KVM, Paolo Bonzini, 2023/03/02
- [PULL 07/62] xen-platform: exclude vfio-pci from the PCI platform unplug, Paolo Bonzini, 2023/03/02
- [PULL 08/62] xen-platform: allow its creation with XEN_EMULATE mode, Paolo Bonzini, 2023/03/02
- [PULL 09/62] i386/xen: handle guest hypercalls, Paolo Bonzini, 2023/03/02
- [PULL 10/62] i386/xen: implement HYPERVISOR_xen_version,
Paolo Bonzini <=
- [PULL 11/62] i386/xen: implement HYPERVISOR_sched_op, SCHEDOP_shutdown, Paolo Bonzini, 2023/03/02
- [PULL 12/62] i386/xen: Implement SCHEDOP_poll and SCHEDOP_yield, Paolo Bonzini, 2023/03/02
- [PULL 13/62] hw/xen: Add xen_overlay device for emulating shared xenheap pages, Paolo Bonzini, 2023/03/02
- [PULL 15/62] i386/xen: add pc_machine_kvm_type to initialize XEN_EMULATE mode, Paolo Bonzini, 2023/03/02
- [PULL 14/62] xen: Permit --xen-domid argument when accel is KVM, Paolo Bonzini, 2023/03/02
- [PULL 16/62] i386/xen: manage and save/restore Xen guest long_mode setting, Paolo Bonzini, 2023/03/02
- [PULL 19/62] i386/xen: implement HYPERVISOR_hvm_op, Paolo Bonzini, 2023/03/02
- [PULL 21/62] i386/xen: handle VCPUOP_register_vcpu_info, Paolo Bonzini, 2023/03/02
- [PULL 25/62] i386/xen: implement HVMOP_set_evtchn_upcall_vector, Paolo Bonzini, 2023/03/02
- [PULL 26/62] i386/xen: implement HVMOP_set_param, Paolo Bonzini, 2023/03/02