Carsten Otte wrote:
This patch makes libkvm build and work on s390. It should be a noop for
all other architectures.

I'm thinking of spending some time eliminate libkvm altogether in the next month or so. Noone seems to be using it for alternative userspaces and the code that interacts with it in QEMU badly needs refactoring.

Dropping the abstraction will probably result in a big drop in lines of code and would probably make it more clear anyway.

Regards,

Anthony Liguori

Signed-off-by: Carsten Otte <[EMAIL PROTECTED]>
---
Index: kvm-userspace/libkvm/config-s390x.mak
===================================================================
--- /dev/null
+++ kvm-userspace/libkvm/config-s390x.mak
@@ -0,0 +1,6 @@
+
+LIBDIR := /lib
+CFLAGS +=
+CFLAGS += -D__s390x__
+
+libkvm-$(ARCH)-objs := libkvm-s390x.o
Index: kvm-userspace/libkvm/libkvm-s390x.c
===================================================================
--- /dev/null
+++ kvm-userspace/libkvm/libkvm-s390x.c
@@ -0,0 +1,98 @@
+/*
+ * This header is for functions & variables that will ONLY be
+ * used inside libkvm for s390x.
+ * THESE ARE NOT EXPOSED TO THE USER AND ARE ONLY FOR USE
+ * WITHIN LIBKVM.
+ *
+ * derived from libkvm-powerpc.c
+ *
+ * Copyright 2008 IBM Corporation
+ * Authors:
+ *     Carsten Otte <[EMAIL PROTECTED]>
+ *
+ * This work is licensed under the GNU LGPL license, version 2.
+ */
+
+#include "libkvm.h"
+#include <errno.h>
+#include <stdio.h>
+#include <inttypes.h>
+
+int handle_dcr(struct kvm_run *run,  kvm_context_t kvm, int vcpu)
+{
+       fprintf(stderr, "%s: Operation not supported\n", __FUNCTION__);
+       return -1;
+}
+
+int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory,
+                               void **vm_mem)
+{
+       fprintf(stderr, "%s: Operation not supported\n", __FUNCTION__);
+       return -1;
+}
+
+void *kvm_create_kernel_phys_mem(kvm_context_t kvm, unsigned long phys_start,
+                                unsigned long len, int log, int writable)
+{
+       fprintf(stderr, "%s: Operation not supported\n", __FUNCTION__);
+       return NULL;
+}
+
+void kvm_show_code(kvm_context_t kvm, int vcpu)
+{
+       fprintf(stderr, "%s: Operation not supported\n", __FUNCTION__);
+}
+
+void kvm_show_regs(kvm_context_t kvm, int vcpu)
+{
+       struct kvm_regs regs;
+       int i;
+
+       if (kvm_get_regs(kvm, vcpu, &regs))
+               return;
+       /*
+       fprintf(stderr,"guest vcpu #%d\n", vcpu);
+       fprintf(stderr,"pc:   %016"PRIx64" msr:  %016"PRIx64"\n",
+               regs.pc, regs.msr);
+       fprintf(stderr,"lr:   %016"PRIx64" ctr:  %016"PRIx64"\n",
+               regs.lr, regs.ctr);
+       fprintf(stderr,"srr0: %016"PRIx64" srr1: %016"PRIx64"\n",
+               regs.srr0, regs.srr1);
+       for (i=0; i<32; i+=4)
+       {
+               fprintf(stderr, "gpr%02d: %016"PRIx64" %016"PRIx64" %016"PRIx64
+                       " %016"PRIx64"\n", i,
+                       regs.gpr[i],
+                       regs.gpr[i+1],
+                       regs.gpr[i+2],
+                       regs.gpr[i+3]);
+       }
+
+       fflush(stdout);
+       */
+}
+
+int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes,
+                        void **vm_mem)
+{
+       return 0;
+}
+
+int kvm_arch_create_default_phys_mem(kvm_context_t kvm,
+                                       unsigned long phys_mem_bytes,
+                                       void **vm_mem)
+{
+       return 0;
+}
+
+int kvm_arch_run(struct kvm_run *run, kvm_context_t kvm, int vcpu)
+{
+       int ret = 0;
+
+       switch (run->exit_reason){
+       default:
+               ret = 1;
+               break;
+       }
+       return ret;
+}
Index: kvm-userspace/Makefile
===================================================================
--- kvm-userspace.orig/Makefile
+++ kvm-userspace/Makefile
@@ -5,7 +5,7 @@ DESTDIR=
rpmrelease = devel -sane-arch = $(subst i386,x86,$(subst x86_64,x86,$(ARCH)))
+sane-arch = $(subst i386,x86,$(subst x86_64,x86,$(subst s390x,s390,$(ARCH))))
.PHONY: kernel user libkvm qemu bios vgabios extboot clean libfdt Index: kvm-userspace/libkvm/kvm-common.h
===================================================================
--- kvm-userspace.orig/libkvm/kvm-common.h
+++ kvm-userspace/libkvm/kvm-common.h
@@ -18,8 +18,15 @@
/* FIXME: share this number with kvm */
 /* FIXME: or dynamically alloc/realloc regions */
+#ifndef __s390x__
 #define KVM_MAX_NUM_MEM_REGIONS 8u
+#define MAX_VCPUS 64
+#else
+#define KVM_MAX_NUM_MEM_REGIONS 1u
 #define MAX_VCPUS 16
+#define LIBKVM_S390_ORIGIN (0UL)
+#endif
+
/* kvm abi verison variable */
 extern int kvm_abi;
Index: kvm-userspace/libkvm/kvm-s390x.h
===================================================================
--- /dev/null
+++ kvm-userspace/libkvm/kvm-s390x.h
@@ -0,0 +1,30 @@
+/*
+ * This header is for functions & variables that will ONLY be
+ * used inside libkvm for s390.
+ * THESE ARE NOT EXPOSED TO THE USER AND ARE ONLY FOR USE
+ * WITHIN LIBKVM.
+ *
+ * Copyright (C) 2006 Qumranet, Inc.
+ *
+ * Authors:
+ *     Avi Kivity   <[EMAIL PROTECTED]>
+ *     Yaniv Kamay  <[EMAIL PROTECTED]>
+ *
+ * Copyright 2008 IBM Corporation.
+ * Authors:
+ *     Carsten Otte <[EMAIL PROTECTED]>
+ *
+ * This work is licensed under the GNU LGPL license, version 2.
+ */
+
+#ifndef KVM_S390X_H
+#define KVM_S390X_H
+
+#include "kvm-common.h"
+
+#define PAGE_SIZE 4096ul
+#define PAGE_MASK (~(PAGE_SIZE - 1))
+
+#define smp_wmb()   asm volatile("" ::: "memory")
+
+#endif
Index: kvm-userspace/libkvm/libkvm.c
===================================================================
--- kvm-userspace.orig/libkvm/libkvm.c
+++ kvm-userspace/libkvm/libkvm.c
@@ -48,6 +48,10 @@
 #include "kvm-powerpc.h"
 #endif
+#if defined(__s390x__)
+#include "kvm-s390x.h"
+#endif
+
 int kvm_abi = EXPECTED_KVM_API_VERSION;
 int kvm_page_size;
@@ -88,7 +92,11 @@ int get_free_slot(kvm_context_t kvm)
        if (tss_ext > 0)
                i = 0;
        else
+#if !defined(__s390x__)
                i = 1;
+#else
+               i = 0;
+#endif
for (; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
                if (!slots[i].len)
@@ -392,7 +400,6 @@ int kvm_create(kvm_context_t kvm, unsign
        return 0;
 }
-
 #ifdef KVM_CAP_USER_MEMORY
void *kvm_create_userspace_phys_mem(kvm_context_t kvm, unsigned long phys_start,
@@ -410,7 +417,12 @@ void *kvm_create_userspace_phys_mem(kvm_
        if (writable)
                prot |= PROT_WRITE;
+#if !defined(__s390x__)
        ptr = mmap(NULL, len, prot, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
+#else
+       ptr = mmap(LIBKVM_S390_ORIGIN, len, prot | PROT_EXEC,
+               MAP_FIXED | MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+#endif
        if (ptr == MAP_FAILED) {
                fprintf(stderr, "create_userspace_phys_mem: %s", 
strerror(errno));
                return 0;


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to