File S390-qemu-kvm.patch of Package kvm
Index: qemu-kvm-0.12.3/hw/msix.h
===================================================================
--- qemu-kvm-0.12.3.orig/hw/msix.h
+++ qemu-kvm-0.12.3/hw/msix.h
@@ -4,33 +4,33 @@
#include "qemu-common.h"
#include "pci.h"
-int msix_init(PCIDevice *pdev, unsigned short nentries,
- unsigned bar_nr, unsigned bar_size);
+static int msix_init(PCIDevice *pdev, unsigned short nentries,
+ unsigned bar_nr, unsigned bar_size) { return 0; }
-void msix_write_config(PCIDevice *pci_dev, uint32_t address,
- uint32_t val, int len);
+static void msix_write_config(PCIDevice *pci_dev, uint32_t address,
+ uint32_t val, int len) { }
-void msix_mmio_map(PCIDevice *pci_dev, int region_num,
- pcibus_t addr, pcibus_t size, int type);
+static void msix_mmio_map(PCIDevice *pci_dev, int region_num,
+ pcibus_t addr, pcibus_t size, int type) { }
-int msix_uninit(PCIDevice *d);
+static int msix_uninit(PCIDevice *d) { return 0; }
-void msix_save(PCIDevice *dev, QEMUFile *f);
-void msix_load(PCIDevice *dev, QEMUFile *f);
+static void msix_save(PCIDevice *dev, QEMUFile *f) { }
+static void msix_load(PCIDevice *dev, QEMUFile *f) { }
-int msix_enabled(PCIDevice *dev);
-int msix_present(PCIDevice *dev);
+static int msix_enabled(PCIDevice *dev) { return 0; }
+static int msix_present(PCIDevice *dev) { return 0; }
-uint32_t msix_bar_size(PCIDevice *dev);
+static uint32_t msix_bar_size(PCIDevice *dev) { return 0; }
-int msix_vector_use(PCIDevice *dev, unsigned vector);
-void msix_vector_unuse(PCIDevice *dev, unsigned vector);
-void msix_unuse_all_vectors(PCIDevice *dev);
+static int msix_vector_use(PCIDevice *dev, unsigned vector) { return 0; }
+static void msix_vector_unuse(PCIDevice *dev, unsigned vector) { }
+static void msix_unuse_all_vectors(PCIDevice *dev) { }
-void msix_notify(PCIDevice *dev, unsigned vector);
+static void msix_notify(PCIDevice *dev, unsigned vector) { }
-void msix_reset(PCIDevice *dev);
+static void msix_reset(PCIDevice *dev) { }
-extern int msix_supported;
+//static int msix_supported = 0;
#endif
Index: qemu-kvm-0.12.3/hw/s390-virtio.c
===================================================================
--- qemu-kvm-0.12.3.orig/hw/s390-virtio.c
+++ qemu-kvm-0.12.3/hw/s390-virtio.c
@@ -186,7 +186,7 @@ static void s390_init(ram_addr_t ram_siz
exit(1);
}
- cpu_synchronize_state(env);
+ //cpu_synchronize_state(env);
env->psw.addr = KERN_IMAGE_START;
env->psw.mask = 0x0000000180000000ULL;
}
@@ -247,6 +247,8 @@ static void s390_init(ram_addr_t ram_siz
qdev_prop_set_drive(dev, "drive", dinfo);
qdev_init_nofail(dev);
}
+
+ kvm_arch_load_regs(env);
}
static QEMUMachine s390_machine = {
Index: qemu-kvm-0.12.3/kvm/include/linux/kvm.h
===================================================================
--- qemu-kvm-0.12.3.orig/kvm/include/linux/kvm.h
+++ qemu-kvm-0.12.3/kvm/include/linux/kvm.h
@@ -211,7 +211,7 @@ struct kvm_run {
__u64 data_offset; /* relative to kvm_run start */
} io;
struct {
- struct kvm_debug_exit_arch arch;
+ //struct kvm_debug_exit_arch arch;
} debug;
/* KVM_EXIT_MMIO */
struct {
@@ -375,7 +375,7 @@ struct kvm_s390_interrupt {
struct kvm_guest_debug {
__u32 control;
__u32 pad;
- struct kvm_guest_debug_arch arch;
+ //struct kvm_guest_debug_arch arch;
};
enum {
Index: qemu-kvm-0.12.3/Makefile.target
===================================================================
--- qemu-kvm-0.12.3.orig/Makefile.target
+++ qemu-kvm-0.12.3/Makefile.target
@@ -51,7 +51,7 @@ libobj-$(CONFIG_NOSOFTFLOAT) += fpu/soft
libobj-y += op_helper.o helper.o
libobj-$(CONFIG_NEED_MMU) += mmu.o
-libobj-$(CONFIG_KVM) += kvm-tpr-opt.o
+#libobj-$(CONFIG_KVM) += kvm-tpr-opt.o
libobj-$(CONFIG_KVM) += qemu-kvm-helper.o
libobj-$(TARGET_ARM) += neon_helper.o iwmmxt_helper.o
@@ -170,7 +170,7 @@ obj-y += virtio-blk.o virtio-balloon.o v
obj-$(CONFIG_KVM) += kvm.o kvm-all.o
# MSI-X depends on kvm for interrupt injection,
# so moved it from Makefile.hw to Makefile.target for now
-obj-y += msix.o
+# obj-y += msix.o
obj-$(CONFIG_ISA_MMIO) += isa_mmio.o
LIBS+=-lz
Index: qemu-kvm-0.12.3/qemu-kvm.c
===================================================================
--- qemu-kvm-0.12.3.orig/qemu-kvm.c
+++ qemu-kvm-0.12.3/qemu-kvm.c
@@ -66,7 +66,7 @@ pthread_cond_t qemu_pause_cond = PTHREAD
pthread_cond_t qemu_work_cond = PTHREAD_COND_INITIALIZER;
__thread CPUState *current_env;
-static int qemu_system_ready;
+int qemu_system_ready;
#define SIG_IPI (SIGRTMIN+4)
@@ -157,7 +157,7 @@ static void init_slots(void)
static int get_free_slot(kvm_context_t kvm)
{
- int i;
+ int i = 0;
int tss_ext;
#if defined(KVM_CAP_SET_TSS_ADDR) && !defined(__s390__)
@@ -171,14 +171,21 @@ static int get_free_slot(kvm_context_t k
* slot 0 to hold the extended memory, as the vmx will use the last 3
* pages of this slot.
*/
+#if 0
if (tss_ext > 0)
i = 0;
else
i = 1;
+#endif
- for (; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
- if (!slots[i].len)
+ for (; i < KVM_MAX_NUM_MEM_REGIONS; ++i) {
+ DPRINTF("slot[%d].len = %#lx\n", i, slots[i].len);
+ if (!slots[i].len) {
return i;
+ }
+ DPRINTF("slot[%d] skipped\n", i, slots[i].len);
+ }
+
return -1;
}
@@ -451,6 +458,12 @@ static void kvm_create_vcpu(CPUState *en
env->kvm_fd = r;
env->kvm_state = kvm_state;
+ r = kvm_vcpu_ioctl(env, KVM_S390_INITIAL_RESET, 0);
+ if (r < 0) {
+ fprintf(stderr, "kvm_s390_initial_reset: %m\n");
+ exit(1);
+ }
+
mmap_size = kvm_ioctl(kvm_state, KVM_GET_VCPU_MMAP_SIZE, 0);
if (mmap_size < 0) {
fprintf(stderr, "get vcpu mmap size: %m\n");
@@ -943,12 +956,11 @@ int kvm_run(CPUState *env)
}
#endif
-#if !defined(__s390__)
if (r == -1) {
r = handle_io_window(kvm);
goto more;
}
-#endif
+
if (1) {
switch (run->exit_reason) {
case KVM_EXIT_UNKNOWN:
@@ -986,7 +998,7 @@ int kvm_run(CPUState *env)
case KVM_EXIT_SHUTDOWN:
r = handle_shutdown(kvm, env);
break;
-#if defined(__s390__)
+#if 0
case KVM_EXIT_S390_SIEIC:
r = kvm_s390_handle_intercept(kvm, env, run);
break;
@@ -1132,7 +1144,7 @@ int kvm_destroy_memory_region_works(kvm_
return ret;
}
-int kvm_reinject_control(kvm_context_t kvm, int pit_reinject)
+static int kvm_reinject_control(kvm_context_t kvm, int pit_reinject)
{
#ifdef KVM_CAP_REINJECT_CONTROL
int r;
@@ -1632,7 +1644,7 @@ static void kvm_do_save_mpstate(void *_e
CPUState *env = _env;
kvm_arch_save_mpstate(env);
-#ifdef KVM_CAP_MP_STATE
+#if 0
if (kvm_irqchip_in_kernel())
env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
#endif
@@ -2303,11 +2315,13 @@ void kvm_set_phys_mem(target_phys_addr_t
return;
#endif
while (size > 0) {
+#if 0
p = find_mapping(start_addr);
if (p) {
kvm_unregister_memory_area(kvm_context, p->phys, p->len);
drop_mapping(p->phys);
}
+#endif
start_addr += TARGET_PAGE_SIZE;
if (size > TARGET_PAGE_SIZE) {
size -= TARGET_PAGE_SIZE;
Index: qemu-kvm-0.12.3/qemu-kvm.h
===================================================================
--- qemu-kvm-0.12.3.orig/qemu-kvm.h
+++ qemu-kvm-0.12.3/qemu-kvm.h
@@ -670,6 +670,7 @@ int kvm_enable_vapic(CPUState *env, uint
#endif
+#if 0
#if defined(__s390__)
int kvm_s390_initial_reset(kvm_context_t kvm, int slot);
int kvm_s390_interrupt(kvm_context_t kvm, int slot,
@@ -677,6 +678,7 @@ int kvm_s390_interrupt(kvm_context_t kvm
int kvm_s390_set_initial_psw(kvm_context_t kvm, int slot, psw_t psw);
int kvm_s390_store_status(kvm_context_t kvm, int slot, unsigned long addr);
#endif
+#endif
#ifdef KVM_CAP_DEVICE_ASSIGNMENT
/*!
Index: qemu-kvm-0.12.3/qemu-kvm-helper.c
===================================================================
--- qemu-kvm-0.12.3.orig/qemu-kvm-helper.c
+++ qemu-kvm-0.12.3/qemu-kvm-helper.c
@@ -30,7 +30,7 @@ void qemu_kvm_call_with_env(void (*func)
static void call_helper_cpuid(void *junk)
{
- helper_cpuid();
+ //helper_cpuid();
}
void qemu_kvm_cpuid_on_env(CPUState *env)
Index: qemu-kvm-0.12.3/target-s390x/kvm.c
===================================================================
--- qemu-kvm-0.12.3.orig/target-s390x/kvm.c
+++ qemu-kvm-0.12.3/target-s390x/kvm.c
@@ -70,10 +70,12 @@
#define SCLP_CMDW_READ_SCP_INFO 0x00020001
#define SCLP_CMDW_READ_SCP_INFO_FORCED 0x00120001
+#ifdef KVM_UPSTREAM
int kvm_arch_init(KVMState *s, int smp_cpus)
{
return 0;
}
+#endif
int kvm_arch_init_vcpu(CPUState *env)
{
@@ -86,17 +88,33 @@ int kvm_arch_init_vcpu(CPUState *env)
return ret;
}
+#ifdef KVM_UPSTREAM
void kvm_arch_reset_vcpu(CPUState *env)
+#else
+void kvm_arch_cpu_reset(CPUState *env)
+#endif
{
/* FIXME: add code to reset vcpu. */
}
+#ifdef KVM_UPSTREAM
int kvm_arch_put_registers(CPUState *env)
+#else
+int _kvm_arch_load_regs(CPUState *env);
+
+void kvm_arch_load_regs(CPUState *env)
+{
+ _kvm_arch_load_regs(env);
+}
+
+int _kvm_arch_load_regs(CPUState *env)
+#endif
{
struct kvm_regs regs;
int ret;
int i;
+ dprintf("put regs!\n");
ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, ®s);
if (ret < 0) {
return ret;
@@ -117,14 +135,27 @@ int kvm_arch_put_registers(CPUState *env
return ret;
}
+#ifdef KVM_UPSTREAM
int kvm_arch_get_registers(CPUState *env)
+#else
+int _kvm_arch_save_regs(CPUState *env);
+
+void kvm_arch_save_regs(CPUState *env)
+{
+ _kvm_arch_save_regs(env);
+}
+
+int _kvm_arch_save_regs(CPUState *env)
+#endif
{
uint32_t ret;
struct kvm_regs regs;
int i;
+ dprintf("get regs!\n");
ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, ®s);
if (ret < 0) {
+ dprintf("OH NOEZ!\n");
return ret;
}
@@ -180,6 +211,10 @@ static void kvm_s390_interrupt_internal(
{
struct kvm_s390_interrupt kvmint;
int r;
+ extern int qemu_system_ready;
+
+ if (!qemu_system_ready)
+ return;
if (!env->kvm_state) {
return;
@@ -459,10 +494,14 @@ static int handle_intercept(CPUState *en
break;
}
- return r;
+ return 0; //r;
}
+#ifdef KVM_UPSTREAM
int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)
+#else
+static int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)
+#endif
{
int ret = 0;
@@ -476,8 +515,77 @@ int kvm_arch_handle_exit(CPUState *env,
break;
default:
fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason);
+ ret = -1;
break;
}
return ret;
}
+
+int kvm_arch_run(CPUState *env)
+{
+ return kvm_arch_handle_exit(env, env->kvm_run);
+}
+
+#ifndef KVM_UPSTREAM
+void kvm_arch_save_mpstate(CPUState *env)
+{
+}
+
+void kvm_arch_load_mpstate(CPUState *env)
+{
+}
+
+int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes,
+ void **vm_mem)
+{
+ return 0;
+}
+
+int kvm_arch_qemu_create_context(void)
+{
+ return 0;
+}
+
+void kvm_show_regs(CPUState *env)
+{
+ struct kvm_regs regs;
+ int i, r;
+
+ r = kvm_vcpu_ioctl(env, KVM_GET_REGS, ®s);
+ if (r < 0) {
+ perror("KVM_GET_REGS");
+ return;
+ }
+
+ for (i = 0; i < 16; i++) {
+ fprintf(stderr, "R%02d=%016lx", i, regs.gprs[i]);
+ if ((i % 4) == 3) {
+ fprintf(stderr, "\n");
+ } else {
+ fprintf(stderr, " ");
+ }
+ }
+
+ fprintf(stderr, "PSW=mask %016lx addr %016lx\n", env->kvm_run->psw_addr, env->kvm_run->psw_mask);
+ fprintf(stderr, "ENV PSW=mask %016lx addr %016lx\n", env->psw.addr, env->psw.mask);
+}
+
+int kvm_arch_halt(CPUState *env)
+{
+ return 1;
+}
+
+void kvm_show_code(CPUState *env)
+{
+}
+
+int kvm_arch_has_work(CPUState *env)
+{
+ return 1;
+}
+
+void kvm_arch_process_irqchip_events(CPUState *env)
+{
+}
+#endif
Index: qemu-kvm-0.12.3/target-s390x/libkvm.h
===================================================================
--- /dev/null
+++ qemu-kvm-0.12.3/target-s390x/libkvm.h
@@ -0,0 +1,26 @@
+/*
+ * This header is for functions & variables that will ONLY be
+ * used inside libkvm for x86.
+ * THESE ARE NOT EXPOSED TO THE USER AND ARE ONLY FOR USE
+ * WITHIN LIBKVM.
+ *
+ * derived from libkvm.c
+ *
+ * Copyright (C) 2006 Qumranet, Inc.
+ *
+ * Authors:
+ * Avi Kivity <avi@qumranet.com>
+ * Yaniv Kamay <yaniv@qumranet.com>
+ *
+ * This work is licensed under the GNU LGPL license, version 2.
+ */
+
+#ifndef KVM_X86_H
+#define KVM_X86_H
+
+#define PAGE_SIZE 4096ul
+#define PAGE_MASK (~(PAGE_SIZE - 1))
+
+#define smp_wmb() asm volatile("" ::: "memory")
+
+#endif