Patchwork [03/12] Switch build system to accompanied kernel headers

login
register
mail settings
Submitter Jan Kiszka
Date June 8, 2011, 2:10 p.m.
Message ID <e7431e8d7e22bc07694bcad0d11508fd48e4173c.1307542247.git.jan.kiszka@siemens.com>
Download mbox | patch
Permalink /patch/99453/
State New
Headers show

Comments

Jan Kiszka - June 8, 2011, 2:10 p.m.
This helps reducing our build-time checks for feature support in the
available Linux kernel headers. And it helps users that do not have
sufficiently recent headers installed on their build machine.

Consequently, the patch removes and build-time checks for kvm and vhost
in configure, the --kerneldir switch, and KVM_CFLAGS. Kernel headers are
supposed to be provided by QEMU only.

s390 needs some extra love as it carries redefinitions from kernel
headers.

CC: Alexander Graf <agraf@suse.de>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 Makefile.target          |    4 +-
 configure                |  151 ++++++----------------------------------------
 target-s390x/cpu.h       |   10 ---
 target-s390x/op_helper.c |    1 +
 4 files changed, 21 insertions(+), 145 deletions(-)
Alexander Graf - June 14, 2011, 11:11 a.m.
On 08.06.2011, at 16:10, Jan Kiszka wrote:

> This helps reducing our build-time checks for feature support in the
> available Linux kernel headers. And it helps users that do not have
> sufficiently recent headers installed on their build machine.
> 
> Consequently, the patch removes and build-time checks for kvm and vhost
> in configure, the --kerneldir switch, and KVM_CFLAGS. Kernel headers are
> supposed to be provided by QEMU only.
> 
> s390 needs some extra love as it carries redefinitions from kernel
> headers.

Yes. I was wondering if we should unconditionally include the kernel headers there. The problem I'm seeing there is that I don't know if that would work fine on non-Linux hosts, as that code definitely gets compiled there, while KVM code is not.
> 
> 

[...]

> diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
> index 4e5c391..b5e587f 100644
> --- a/target-s390x/cpu.h
> +++ b/target-s390x/cpu.h
> @@ -313,16 +313,6 @@ CPUState *s390_cpu_addr2state(uint16_t cpu_addr);
> /* from s390-virtio-bus */
> extern const target_phys_addr_t virtio_size;
> 
> -#ifndef KVM_S390_SIGP_STOP
> -#define KVM_S390_SIGP_STOP              0
> -#define KVM_S390_PROGRAM_INT            0
> -#define KVM_S390_SIGP_SET_PREFIX        0
> -#define KVM_S390_RESTART                0
> -#define KVM_S390_INT_VIRTIO             0
> -#define KVM_S390_INT_SERVICE            0
> -#define KVM_S390_INT_EMERGENCY          0
> -#endif
> -
> #endif
> void cpu_lock(void);
> void cpu_unlock(void);
> diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c
> index db03a79..9429698 100644
> --- a/target-s390x/op_helper.c
> +++ b/target-s390x/op_helper.c
> @@ -23,6 +23,7 @@
> #include "helpers.h"
> #include <string.h>
> #include "kvm.h"
> +#include <linux/kvm.h>

Have you tried to compile this on non-Linux?


Alex
Jan Kiszka - June 14, 2011, 11:21 a.m.
On 2011-06-14 13:11, Alexander Graf wrote:
> 
> On 08.06.2011, at 16:10, Jan Kiszka wrote:
> 
> This helps reducing our build-time checks for feature support in the
> available Linux kernel headers. And it helps users that do not have
> sufficiently recent headers installed on their build machine.
> 
> Consequently, the patch removes and build-time checks for kvm and vhost
> in configure, the --kerneldir switch, and KVM_CFLAGS. Kernel headers are
> supposed to be provided by QEMU only.
> 
> s390 needs some extra love as it carries redefinitions from kernel
> headers.
> 
> Yes. I was wondering if we should unconditionally include the kernel headers there. The problem I'm seeing there is that I don't know if that would work fine on non-Linux hosts, as that code definitely gets compiled there, while KVM code is not.
> 
> 
> 
> [...]
> 
> diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
> index 4e5c391..b5e587f 100644
> --- a/target-s390x/cpu.h
> +++ b/target-s390x/cpu.h
> @@ -313,16 +313,6 @@ CPUState *s390_cpu_addr2state(uint16_t cpu_addr);
> /* from s390-virtio-bus */
> extern const target_phys_addr_t virtio_size;
> 
> -#ifndef KVM_S390_SIGP_STOP
> -#define KVM_S390_SIGP_STOP              0
> -#define KVM_S390_PROGRAM_INT            0
> -#define KVM_S390_SIGP_SET_PREFIX        0
> -#define KVM_S390_RESTART                0
> -#define KVM_S390_INT_VIRTIO             0
> -#define KVM_S390_INT_SERVICE            0
> -#define KVM_S390_INT_EMERGENCY          0
> -#endif
> -
> #endif
> void cpu_lock(void);
> void cpu_unlock(void);
> diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c
> index db03a79..9429698 100644
> --- a/target-s390x/op_helper.c
> +++ b/target-s390x/op_helper.c
> @@ -23,6 +23,7 @@
> #include "helpers.h"
> #include <string.h>
> #include "kvm.h"
> +#include <linux/kvm.h>
> 
> Have you tried to compile this on non-Linux?

Sorry, I don't have "non-Linux" around. :) Do you expect build problems
with that header? Why?

BTW, if you depend on KVM_* constants for non-KVM builds, that looks a
bit fishy to me. Why is that code built at all in that setup?

Jan
Alexander Graf - June 14, 2011, 11:28 a.m.
On 14.06.2011, at 13:21, Jan Kiszka wrote:

> On 2011-06-14 13:11, Alexander Graf wrote:
>> 
>> On 08.06.2011, at 16:10, Jan Kiszka wrote:
>> 
>> This helps reducing our build-time checks for feature support in the
>> available Linux kernel headers. And it helps users that do not have
>> sufficiently recent headers installed on their build machine.
>> 
>> Consequently, the patch removes and build-time checks for kvm and vhost
>> in configure, the --kerneldir switch, and KVM_CFLAGS. Kernel headers are
>> supposed to be provided by QEMU only.
>> 
>> s390 needs some extra love as it carries redefinitions from kernel
>> headers.
>> 
>> Yes. I was wondering if we should unconditionally include the kernel headers there. The problem I'm seeing there is that I don't know if that would work fine on non-Linux hosts, as that code definitely gets compiled there, while KVM code is not.
>> 
>> 
>> 
>> [...]
>> 
>> diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
>> index 4e5c391..b5e587f 100644
>> --- a/target-s390x/cpu.h
>> +++ b/target-s390x/cpu.h
>> @@ -313,16 +313,6 @@ CPUState *s390_cpu_addr2state(uint16_t cpu_addr);
>> /* from s390-virtio-bus */
>> extern const target_phys_addr_t virtio_size;
>> 
>> -#ifndef KVM_S390_SIGP_STOP
>> -#define KVM_S390_SIGP_STOP              0
>> -#define KVM_S390_PROGRAM_INT            0
>> -#define KVM_S390_SIGP_SET_PREFIX        0
>> -#define KVM_S390_RESTART                0
>> -#define KVM_S390_INT_VIRTIO             0
>> -#define KVM_S390_INT_SERVICE            0
>> -#define KVM_S390_INT_EMERGENCY          0
>> -#endif
>> -
>> #endif
>> void cpu_lock(void);
>> void cpu_unlock(void);
>> diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c
>> index db03a79..9429698 100644
>> --- a/target-s390x/op_helper.c
>> +++ b/target-s390x/op_helper.c
>> @@ -23,6 +23,7 @@
>> #include "helpers.h"
>> #include <string.h>
>> #include "kvm.h"
>> +#include <linux/kvm.h>
>> 
>> Have you tried to compile this on non-Linux?
> 
> Sorry, I don't have "non-Linux" around. :) Do you expect build problems
> with that header? Why?

Do you have a git tree handy? I can give a Mac build a try then.

> BTW, if you depend on KVM_* constants for non-KVM builds, that looks a
> bit fishy to me. Why is that code built at all in that setup?

The reason for that is that I didn't want to clutter the emulation code with #ifdefs:

static void program_interrupt(CPUState *env, uint32_t code, int ilc)
{
    qemu_log("program interrupt at %#" PRIx64 "\n", env->psw.addr);

    if (kvm_enabled()) {
        kvm_s390_interrupt(env, KVM_S390_PROGRAM_INT, code);
    } else {
        env->int_pgm_code = code;
        env->int_pgm_ilc = ilc;
        env->exception_index = EXCP_PGM;
        cpu_loop_exit();
    }
}

This breaks compilation when KVM_S390_PROGRAM_INT is not defined. I'm very open to suggestions on how to improve this though :).


Alex
Jan Kiszka - June 14, 2011, 11:32 a.m.
On 2011-06-14 13:28, Alexander Graf wrote:
> 
> On 14.06.2011, at 13:21, Jan Kiszka wrote:
> 
>> On 2011-06-14 13:11, Alexander Graf wrote:
>>>
>>> On 08.06.2011, at 16:10, Jan Kiszka wrote:
>>>
>>> This helps reducing our build-time checks for feature support in the
>>> available Linux kernel headers. And it helps users that do not have
>>> sufficiently recent headers installed on their build machine.
>>>
>>> Consequently, the patch removes and build-time checks for kvm and vhost
>>> in configure, the --kerneldir switch, and KVM_CFLAGS. Kernel headers are
>>> supposed to be provided by QEMU only.
>>>
>>> s390 needs some extra love as it carries redefinitions from kernel
>>> headers.
>>>
>>> Yes. I was wondering if we should unconditionally include the kernel headers there. The problem I'm seeing there is that I don't know if that would work fine on non-Linux hosts, as that code definitely gets compiled there, while KVM code is not.
>>>
>>>
>>>
>>> [...]
>>>
>>> diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
>>> index 4e5c391..b5e587f 100644
>>> --- a/target-s390x/cpu.h
>>> +++ b/target-s390x/cpu.h
>>> @@ -313,16 +313,6 @@ CPUState *s390_cpu_addr2state(uint16_t cpu_addr);
>>> /* from s390-virtio-bus */
>>> extern const target_phys_addr_t virtio_size;
>>>
>>> -#ifndef KVM_S390_SIGP_STOP
>>> -#define KVM_S390_SIGP_STOP              0
>>> -#define KVM_S390_PROGRAM_INT            0
>>> -#define KVM_S390_SIGP_SET_PREFIX        0
>>> -#define KVM_S390_RESTART                0
>>> -#define KVM_S390_INT_VIRTIO             0
>>> -#define KVM_S390_INT_SERVICE            0
>>> -#define KVM_S390_INT_EMERGENCY          0
>>> -#endif
>>> -
>>> #endif
>>> void cpu_lock(void);
>>> void cpu_unlock(void);
>>> diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c
>>> index db03a79..9429698 100644
>>> --- a/target-s390x/op_helper.c
>>> +++ b/target-s390x/op_helper.c
>>> @@ -23,6 +23,7 @@
>>> #include "helpers.h"
>>> #include <string.h>
>>> #include "kvm.h"
>>> +#include <linux/kvm.h>
>>>
>>> Have you tried to compile this on non-Linux?
>>
>> Sorry, I don't have "non-Linux" around. :) Do you expect build problems
>> with that header? Why?
> 
> Do you have a git tree handy? I can give a Mac build a try then.

Try git://git.kiszka.org/qemu-kvm.git queues/kvm-upstream

> 
>> BTW, if you depend on KVM_* constants for non-KVM builds, that looks a
>> bit fishy to me. Why is that code built at all in that setup?
> 
> The reason for that is that I didn't want to clutter the emulation code with #ifdefs:
> 
> static void program_interrupt(CPUState *env, uint32_t code, int ilc)
> {
>     qemu_log("program interrupt at %#" PRIx64 "\n", env->psw.addr);
> 
>     if (kvm_enabled()) {
>         kvm_s390_interrupt(env, KVM_S390_PROGRAM_INT, code);
>     } else {
>         env->int_pgm_code = code;
>         env->int_pgm_ilc = ilc;
>         env->exception_index = EXCP_PGM;
>         cpu_loop_exit();
>     }
> }
> 
> This breaks compilation when KVM_S390_PROGRAM_INT is not defined. I'm very open to suggestions on how to improve this though :).

Callbacks? See cpu_interrupt_handler e.g.

Jan
Stefan Weil - June 22, 2011, 8:51 p.m.
Am 08.06.2011 16:10, schrieb Jan Kiszka:
> This helps reducing our build-time checks for feature support in the
> available Linux kernel headers. And it helps users that do not have
> sufficiently recent headers installed on their build machine.
>
> Consequently, the patch removes and build-time checks for kvm and vhost
> in configure, the --kerneldir switch, and KVM_CFLAGS. Kernel headers are
> supposed to be provided by QEMU only.
>
> s390 needs some extra love as it carries redefinitions from kernel
> headers.
>
> CC: Alexander Graf <agraf@suse.de>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
> Makefile.target | 4 +-
> configure | 151 ++++++----------------------------------------
> target-s390x/cpu.h | 10 ---
> target-s390x/op_helper.c | 1 +
> 4 files changed, 21 insertions(+), 145 deletions(-)
>
> diff --git a/Makefile.target b/Makefile.target
> index 5c22df8..be9c0e8 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -14,7 +14,7 @@ endif
>
> TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
> $(call set-vpath, $(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw)
> -QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
> +QEMU_CFLAGS+= -I.. -I../linux-headers -I$(TARGET_PATH) -DNEED_CPU_H
>
> include $(SRC_PATH)/Makefile.objs
>
> @@ -37,8 +37,6 @@ ifndef CONFIG_HAIKU
> LIBS+=-lm
> endif
>
> -kvm.o kvm-all.o vhost.o vhost_net.o kvmclock.o: 
> QEMU_CFLAGS+=$(KVM_CFLAGS)
> -
> config-target.h: config-target.h-timestamp
> config-target.h-timestamp: config-target.mak
>
> diff --git a/configure b/configure
> index d38b952..0e1dc46 100755
> --- a/configure
> +++ b/configure
> @@ -113,8 +113,7 @@ curl=""
> curses=""
> docs=""
> fdt=""
> -kvm=""
> -kvm_para=""
> +kvm="yes"
> nptl=""

Are you planning to add kvm support for all platforms which don't 
support it today?
If not, kvm="yes" should be restricted to platforms with kvm support.

Otherwise, QEMU builds will fail very early:

  ERROR: Host kernel lacks signalfd() support,
  but KVM depends on it when the IO thread is disabled.

Of course, users of those non-kvm platforms can set --disable-kvm,
but I don't think that is the correct solution.

Even with kvm disabled, builds still fail for non-kvm systems:

  In file included from /qemu/hw/kvmclock.c:21:
  /qemu/linux-headers/linux/kvm_para.h:26:26: warning: asm/kvm_para.h: 
No such file or directory

Cheers,

Stefan

Patch

diff --git a/Makefile.target b/Makefile.target
index 5c22df8..be9c0e8 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -14,7 +14,7 @@  endif
 
 TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
 $(call set-vpath, $(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw)
-QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
+QEMU_CFLAGS+= -I.. -I../linux-headers -I$(TARGET_PATH) -DNEED_CPU_H
 
 include $(SRC_PATH)/Makefile.objs
 
@@ -37,8 +37,6 @@  ifndef CONFIG_HAIKU
 LIBS+=-lm
 endif
 
-kvm.o kvm-all.o vhost.o vhost_net.o kvmclock.o: QEMU_CFLAGS+=$(KVM_CFLAGS)
-
 config-target.h: config-target.h-timestamp
 config-target.h-timestamp: config-target.mak
 
diff --git a/configure b/configure
index d38b952..0e1dc46 100755
--- a/configure
+++ b/configure
@@ -113,8 +113,7 @@  curl=""
 curses=""
 docs=""
 fdt=""
-kvm=""
-kvm_para=""
+kvm="yes"
 nptl=""
 sdl=""
 vnc="yes"
@@ -130,7 +129,7 @@  xen=""
 xen_ctrl_version=""
 linux_aio=""
 attr=""
-vhost_net=""
+vhost_net="yes"
 xfs=""
 
 gprof="no"
@@ -165,7 +164,6 @@  guest_base=""
 uname_release=""
 io_thread="no"
 mixemu="no"
-kerneldir=""
 aix="no"
 blobs="yes"
 pkgversion=""
@@ -712,8 +710,6 @@  for opt do
   ;;
   --disable-blobs) blobs="no"
   ;;
-  --kerneldir=*) kerneldir="$optarg"
-  ;;
   --with-pkgversion=*) pkgversion=" ($optarg)"
   ;;
   --disable-docs) docs="no"
@@ -1001,7 +997,6 @@  echo "  --disable-attr           disables attr and xattr support"
 echo "  --enable-attr            enable attr and xattr support"
 echo "  --enable-io-thread       enable IO thread"
 echo "  --disable-blobs          disable installing provided firmware blobs"
-echo "  --kerneldir=PATH         look for kernel includes in PATH"
 echo "  --enable-docs            enable documentation build"
 echo "  --disable-docs           disable documentation build"
 echo "  --disable-vhost-net      disable vhost-net acceleration support"
@@ -1766,124 +1761,6 @@  EOF
 fi
 
 ##########################################
-# kvm probe
-if test "$kvm" != "no" ; then
-    cat > $TMPC <<EOF
-#include <linux/kvm.h>
-#if !defined(KVM_API_VERSION) || KVM_API_VERSION < 12 || KVM_API_VERSION > 12
-#error Invalid KVM version
-#endif
-EOF
-    must_have_caps="KVM_CAP_USER_MEMORY \
-                    KVM_CAP_DESTROY_MEMORY_REGION_WORKS \
-                    KVM_CAP_COALESCED_MMIO \
-                    KVM_CAP_SYNC_MMU \
-                   "
-    if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) ; then
-      must_have_caps="$caps \
-                      KVM_CAP_SET_TSS_ADDR \
-                      KVM_CAP_EXT_CPUID \
-                      KVM_CAP_CLOCKSOURCE \
-                      KVM_CAP_NOP_IO_DELAY \
-                      KVM_CAP_PV_MMU \
-                      KVM_CAP_MP_STATE \
-                      KVM_CAP_USER_NMI \
-                     "
-    fi
-    for c in $must_have_caps ; do
-      cat >> $TMPC <<EOF
-#if !defined($c)
-#error Missing KVM capability $c
-#endif
-EOF
-    done
-    cat >> $TMPC <<EOF
-int main(void) { return 0; }
-EOF
-  if test "$kerneldir" != "" ; then
-      kvm_cflags=-I"$kerneldir"/include
-      if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) \
-         -a -d "$kerneldir/arch/x86/include" ; then
-            kvm_cflags="$kvm_cflags -I$kerneldir/arch/x86/include"
-	elif test "$cpu" = "ppc" -a -d "$kerneldir/arch/powerpc/include" ; then
-	    kvm_cflags="$kvm_cflags -I$kerneldir/arch/powerpc/include"
-	elif test "$cpu" = "s390x" -a -d "$kerneldir/arch/s390/include" ; then
-	    kvm_cflags="$kvm_cflags -I$kerneldir/arch/s390/include"
-        elif test -d "$kerneldir/arch/$cpu/include" ; then
-            kvm_cflags="$kvm_cflags -I$kerneldir/arch/$cpu/include"
-      fi
-  else
-    kvm_cflags=`$pkg_config --cflags kvm-kmod 2>/dev/null`
-  fi
-  if compile_prog "$kvm_cflags" "" ; then
-    kvm=yes
-    cat > $TMPC <<EOF
-#include <linux/kvm_para.h>
-int main(void) { return 0; }
-EOF
-    if compile_prog "$kvm_cflags" "" ; then
-      kvm_para=yes
-    fi
-  else
-    if test "$kvm" = "yes" ; then
-      if has awk && has grep; then
-        kvmerr=`LANG=C $cc $QEMU_CFLAGS -o $TMPE $kvm_cflags $TMPC 2>&1 \
-	| grep "error: " \
-	| awk -F "error: " '{if (NR>1) printf(", "); printf("%s",$2);}'`
-        if test "$kvmerr" != "" ; then
-          echo -e "${kvmerr}\n\
-NOTE: To enable KVM support, update your kernel to 2.6.29+ or install \
-recent kvm-kmod from http://sourceforge.net/projects/kvm."
-        fi
-      fi
-      feature_not_found "kvm"
-    fi
-    kvm=no
-  fi
-fi
-
-##########################################
-# test for ppc kvm pvr setting
-
-if test "$kvm" = "yes" && test "$cpu" = "ppc" -o "$cpu" = "ppc64"; then
-            cat > $TMPC <<EOF
-    #include <asm/kvm.h>
-    int main(void) { struct kvm_sregs s; s.pvr = 0; return 0; }
-EOF
-    if compile_prog "$kvm_cflags" "" ; then
-        kvm_ppc_pvr=yes
-    else
-        kvm_ppc_pvr=no
-    fi
-fi
-
-##########################################
-# test for vhost net
-
-if test "$vhost_net" != "no"; then
-    if test "$kvm" != "no"; then
-            cat > $TMPC <<EOF
-    #include <linux/vhost.h>
-    int main(void) { return 0; }
-EOF
-            if compile_prog "$kvm_cflags" "" ; then
-                vhost_net=yes
-            else
-                if test "$vhost_net" = "yes" ; then
-                    feature_not_found "vhost-net"
-                fi
-                vhost_net=no
-            fi
-    else
-            if test "$vhost_net" = "yes" ; then
-                echo "NOTE: vhost-net feature requires KVM (--enable-kvm)."
-                feature_not_found "vhost-net"
-            fi
-            vhost_net=no
-    fi
-fi
-
-##########################################
 # pthread probe
 PTHREADLIBS_LIST="-lpthread -lpthreadGC2"
 
@@ -3341,16 +3218,11 @@  case "$target_arch2" in
       \( "$target_arch2" = "x86_64" -a "$cpu" = "i386"   \) -o \
       \( "$target_arch2" = "i386"   -a "$cpu" = "x86_64" \) \) ; then
       echo "CONFIG_KVM=y" >> $config_target_mak
-      echo "KVM_CFLAGS=$kvm_cflags" >> $config_target_mak
-      if test "$kvm_para" = "yes"; then
-        echo "CONFIG_KVM_PARA=y" >> $config_target_mak
-      fi
+      echo "CONFIG_KVM_PARA=y" >> $config_target_mak
       if test $vhost_net = "yes" ; then
         echo "CONFIG_VHOST_NET=y" >> $config_target_mak
       fi
-      if test "$kvm_ppc_pvr" = "yes" ; then
-        echo "CONFIG_KVM_PPC_PVR=y" >> $config_target_mak
-      fi
+      echo "CONFIG_KVM_PPC_PVR=y" >> $config_target_mak
     fi
 esac
 if test "$target_bigendian" = "yes" ; then
@@ -3541,6 +3413,21 @@  if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
   esac
 fi
 
+# use included Linux headers
+includes="-I\$(SRC_PATH)/linux-headers $includes"
+mkdir -p linux-headers
+case "$cpu" in
+i386|x86_64)
+  symlink $source_path/linux-headers/asm-x86 linux-headers/asm
+  ;;
+ppcemb|ppc|ppc64)
+  symlink $source_path/linux-headers/asm-x86 linux-headers/asm
+  ;;
+s390x)
+  symlink $source_path/linux-headers/asm-s390 linux-headers/asm
+  ;;
+esac
+
 echo "LDFLAGS+=$ldflags" >> $config_target_mak
 echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
 echo "QEMU_INCLUDES+=$includes" >> $config_target_mak
diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
index 4e5c391..b5e587f 100644
--- a/target-s390x/cpu.h
+++ b/target-s390x/cpu.h
@@ -313,16 +313,6 @@  CPUState *s390_cpu_addr2state(uint16_t cpu_addr);
 /* from s390-virtio-bus */
 extern const target_phys_addr_t virtio_size;
 
-#ifndef KVM_S390_SIGP_STOP
-#define KVM_S390_SIGP_STOP              0
-#define KVM_S390_PROGRAM_INT            0
-#define KVM_S390_SIGP_SET_PREFIX        0
-#define KVM_S390_RESTART                0
-#define KVM_S390_INT_VIRTIO             0
-#define KVM_S390_INT_SERVICE            0
-#define KVM_S390_INT_EMERGENCY          0
-#endif
-
 #endif
 void cpu_lock(void);
 void cpu_unlock(void);
diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c
index db03a79..9429698 100644
--- a/target-s390x/op_helper.c
+++ b/target-s390x/op_helper.c
@@ -23,6 +23,7 @@ 
 #include "helpers.h"
 #include <string.h>
 #include "kvm.h"
+#include <linux/kvm.h>
 #include "qemu-timer.h"
 
 /*****************************************************************************/