From patchwork Tue May 3 14:05:37 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 93797 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 49F731007D1 for ; Wed, 4 May 2011 00:06:03 +1000 (EST) Received: from localhost ([::1]:47345 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHGEh-0006y8-Rt for incoming@patchwork.ozlabs.org; Tue, 03 May 2011 10:05:59 -0400 Received: from eggs.gnu.org ([140.186.70.92]:39990) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHGEV-0006y2-JA for qemu-devel@nongnu.org; Tue, 03 May 2011 10:05:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QHGEP-0002W2-KL for qemu-devel@nongnu.org; Tue, 03 May 2011 10:05:47 -0400 Received: from thoth.sbs.de ([192.35.17.2]:23255) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHGEP-0002Vb-4D for qemu-devel@nongnu.org; Tue, 03 May 2011 10:05:41 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by thoth.sbs.de (8.13.6/8.13.6) with ESMTP id p43E5b8K016967; Tue, 3 May 2011 16:05:37 +0200 Received: from mchn199C.mchp.siemens.de ([139.25.109.49]) by mail1.siemens.de (8.13.6/8.13.6) with ESMTP id p43E5bVf029689; Tue, 3 May 2011 16:05:37 +0200 Message-ID: <4DC00BB1.7000008@siemens.com> Date: Tue, 03 May 2011 16:05:37 +0200 From: Jan Kiszka User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: qemu-devel X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Received-From: 192.35.17.2 Cc: Anthony Liguori , Marcelo Tosatti , Avi Kivity , kvm , Alexander Graf Subject: [Qemu-devel] [RFC][PATCH] Import Linux headers for KVM and vhost X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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. Header upstate is triggered via 'make update-linux-headers', optionally specifying a kernel directory as source via 'LINUX='. --- I'm sure this is not yet perfect from technical POV (e.g. the patch to Makefile.target looks like a hack to me, better ideas welcome), therefore RFC and no SOB. But it should demonstrate the plan. The workflow for adding a new KVM feature support would be first a 'make update-linux-header LINUX=/my/local/linux' + git commit, and then the commit of the kvm, vhost, whatever changes. A patch to actually add the result of the header update would be posted separately. Same for the now possible massive cleanups of kvm sources. Makefile | 17 +++++++ Makefile.target | 2 +- configure | 127 ++++++++----------------------------------------------- 3 files changed, 36 insertions(+), 110 deletions(-) diff --git a/Makefile b/Makefile index 67c0268..6ca065b 100644 --- a/Makefile +++ b/Makefile @@ -341,3 +341,20 @@ tarbin: # Include automatically generated dependency files -include $(wildcard *.d audio/*.d slirp/*.d block/*.d net/*.d ui/*.d) + +update-linux-headers: + for arch in x86 powerpc s390; do \ + $(MAKE) -C $(LINUX) INSTALL_HDR_PATH=`pwd`/.tmp-hdrs SRCARCH="$$arch" headers_install; \ + rm -rf $(SRC_PATH)/include/asm-"$$arch"/*; \ + for header in kvm.h kvm_para.h; do \ + cp .tmp-hdrs/include/asm/$$header $(SRC_PATH)/include/asm-"$$arch"; \ + done; \ + if test $$arch == x86; then \ + cp .tmp-hdrs/include/asm/hyperv.h $(SRC_PATH)/include/asm-x86; \ + fi \ + done + rm -rf $(SRC_PATH)/include/linux/* + for header in kvm.h kvm_para.h vhost.h virtio_config.h virtio_ring.h; do \ + cp .tmp-hdrs/include/linux/$$header $(SRC_PATH)/include/linux; \ + done + rm -rf .tmp-hdrs diff --git a/Makefile.target b/Makefile.target index 89280c6..b0fe021 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../include -I$(TARGET_PATH) -DNEED_CPU_H include $(SRC_PATH)/Makefile.objs diff --git a/configure b/configure index 3239fbb..792e4c2 100755 --- a/configure +++ b/configure @@ -113,8 +113,7 @@ curl="" curses="" docs="" fdt="" -kvm="" -kvm_para="" +kvm="yes" nptl="" sdl="" vnc="yes" @@ -129,7 +128,7 @@ vnc_thread="no" xen="" linux_aio="" attr="" -vhost_net="" +vhost_net="yes" xfs="" gprof="no" @@ -1695,109 +1694,6 @@ EOF fi ########################################## -# kvm probe -if test "$kvm" != "no" ; then - cat > $TMPC < -#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 <> $TMPC </dev/null` - fi - if compile_prog "$kvm_cflags" "" ; then - kvm=yes - cat > $TMPC < -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 vhost net - -if test "$vhost_net" != "no"; then - if test "$kvm" != "no"; then - cat > $TMPC < - 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" @@ -3251,9 +3147,7 @@ case "$target_arch2" in \( "$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 @@ -3449,6 +3343,21 @@ if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then esac fi +# use included Linux headers +includes="-I\$(SRC_PATH)/include $includes" +mkdir -p include +case "$cpu" in +i386|x86_64) + symlink $source_path/include/asm-x86 include/asm + ;; +ppcemb|ppc|ppc64) + symlink $source_path/include/asm-x86 include/asm + ;; +s390x) + symlink $source_path/include/asm-s390 include/asm + ;; +esac + echo "LDFLAGS+=$ldflags" >> $config_target_mak echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak echo "QEMU_INCLUDES+=$includes" >> $config_target_mak