summaryrefslogtreecommitdiff
path: root/app-emulation
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss123next@list.ru>2011-08-13 21:03:22 +0300
committerGluzskiy Alexandr <sss123next@list.ru>2011-08-13 21:03:22 +0300
commitb34f9b0a262e47c787951b8eed2526d679c30ce0 (patch)
tree3d1e846f57bdd200e2db3f38a417fb192ef935a7 /app-emulation
parent66a513fa35fc9160027a03ab5be9202f35385ed4 (diff)
new file: app-emulation/qemu-kvm/files/qemu-0.11.0-mips64-user-fix.patch
new file: app-emulation/qemu-kvm/files/qemu-kvm new file: app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch new file: app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-include-madvise-defines.patch new file: app-emulation/qemu-kvm/files/qemu-kvm-guest-hang-on-usb-add.patch new file: app-emulation/qemu-kvm/files/qemu.patch new file: app-emulation/qemu-kvm/qemu-kvm-9999-r1.ebuild
Diffstat (limited to 'app-emulation')
-rw-r--r--app-emulation/qemu-kvm/files/qemu-0.11.0-mips64-user-fix.patch11
-rw-r--r--app-emulation/qemu-kvm/files/qemu-kvm2
-rw-r--r--app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch145
-rw-r--r--app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-include-madvise-defines.patch12
-rw-r--r--app-emulation/qemu-kvm/files/qemu-kvm-guest-hang-on-usb-add.patch100
-rw-r--r--app-emulation/qemu-kvm/files/qemu.patch99
-rw-r--r--app-emulation/qemu-kvm/qemu-kvm-9999-r1.ebuild273
7 files changed, 642 insertions, 0 deletions
diff --git a/app-emulation/qemu-kvm/files/qemu-0.11.0-mips64-user-fix.patch b/app-emulation/qemu-kvm/files/qemu-0.11.0-mips64-user-fix.patch
new file mode 100644
index 0000000..c069f89
--- /dev/null
+++ b/app-emulation/qemu-kvm/files/qemu-0.11.0-mips64-user-fix.patch
@@ -0,0 +1,11 @@
+--- qemu-0.11.0.orig/linux-user/main.c 2009-10-23 02:19:57.000000000 +0200
++++ qemu-0.11.0/linux-user/main.c 2009-10-23 02:47:09.000000000 +0200
+@@ -1469,6 +1469,8 @@
+
+ #ifdef TARGET_MIPS
+
++#define TARGET_QEMU_ESIGRETURN 255
++
+ #define MIPS_SYS(name, args) args,
+
+ static const uint8_t mips_syscall_args[] = {
diff --git a/app-emulation/qemu-kvm/files/qemu-kvm b/app-emulation/qemu-kvm/files/qemu-kvm
new file mode 100644
index 0000000..844147d
--- /dev/null
+++ b/app-emulation/qemu-kvm/files/qemu-kvm
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec /usr/bin/qemu-system-x86_64 --enable-kvm "$@"
diff --git a/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch b/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch
new file mode 100644
index 0000000..909dead
--- /dev/null
+++ b/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-fix-crash-with-sdl.patch
@@ -0,0 +1,145 @@
+From ff5414990645653bf43bf64adfc1ca77ffb9edcb Mon Sep 17 00:00:00 2001
+From: malc <av1474@comtv.ru>
+Date: Sun, 17 Jan 2010 00:25:29 +0300
+Subject: [PATCH] Revert "sdlaudio: make it suck less"
+
+This reverts commit 4839abe78fd466a3cf06faa7c362154afd5404f1.
+
+The commit was badly broken, Gentoo has sdl as the default driver,
+consequently 5 gentoo users have hit the breakage and were kind enough
+to report, so thank you:
+
+Claes Gyllenswrd
+vekin
+Chris
+
+But above all thanks to Toralf Foerster who actually provied enough
+information to pinpoint the breakage to sdlaudio.
+
+http://bugs.gentoo.org/show_bug.cgi?id=294269
+---
+ audio/sdlaudio.c | 80 +++++++++++++++++++++++++++++++++--------------------
+ 1 files changed, 50 insertions(+), 30 deletions(-)
+
+diff --git a/audio/sdlaudio.c b/audio/sdlaudio.c
+index aa39c33..8e7e5cb 100644
+--- a/audio/sdlaudio.c
++++ b/audio/sdlaudio.c
+@@ -41,8 +41,8 @@
+ typedef struct SDLVoiceOut {
+ HWVoiceOut hw;
+ int live;
++ int rpos;
+ int decr;
+- int pending;
+ } SDLVoiceOut;
+
+ static struct {
+@@ -225,10 +225,6 @@ static void sdl_callback (void *opaque, Uint8 *buf, int len)
+ HWVoiceOut *hw = &sdl->hw;
+ int samples = len >> hw->info.shift;
+
+- if (sdl_lock (s, "sdl_callback")) {
+- return;
+- }
+-
+ if (s->exit) {
+ return;
+ }
+@@ -236,34 +232,49 @@ static void sdl_callback (void *opaque, Uint8 *buf, int len)
+ while (samples) {
+ int to_mix, decr;
+
+- while (!sdl->pending) {
+- if (sdl_unlock (s, "sdl_callback")) {
+- return;
+- }
+-
+- sdl_wait (s, "sdl_callback");
+- if (s->exit) {
+- return;
+- }
+-
+- if (sdl_lock (s, "sdl_callback")) {
+- return;
+- }
+- sdl->pending += sdl->live;
+- sdl->live = 0;
++ /* dolog ("in callback samples=%d\n", samples); */
++ sdl_wait (s, "sdl_callback");
++ if (s->exit) {
++ return;
++ }
++
++ if (sdl_lock (s, "sdl_callback")) {
++ return;
++ }
++
++ if (audio_bug (AUDIO_FUNC, sdl->live < 0 || sdl->live > hw->samples)) {
++ dolog ("sdl->live=%d hw->samples=%d\n",
++ sdl->live, hw->samples);
++ return;
++ }
++
++ if (!sdl->live) {
++ goto again;
+ }
+
+- to_mix = audio_MIN (samples, sdl->pending);
+- decr = audio_pcm_hw_clip_out (hw, buf, to_mix, 0);
+- buf += decr << hw->info.shift;
++ /* dolog ("in callback live=%d\n", live); */
++ to_mix = audio_MIN (samples, sdl->live);
++ decr = to_mix;
++ while (to_mix) {
++ int chunk = audio_MIN (to_mix, hw->samples - hw->rpos);
++ struct st_sample *src = hw->mix_buf + hw->rpos;
++
++ /* dolog ("in callback to_mix %d, chunk %d\n", to_mix, chunk); */
++ hw->clip (buf, src, chunk);
++ sdl->rpos = (sdl->rpos + chunk) % hw->samples;
++ to_mix -= chunk;
++ buf += chunk << hw->info.shift;
++ }
+ samples -= decr;
++ sdl->live -= decr;
+ sdl->decr += decr;
+- sdl->pending -= decr;
+- }
+
+- if (sdl_unlock (s, "sdl_callback")) {
+- return;
++ again:
++ if (sdl_unlock (s, "sdl_callback")) {
++ return;
++ }
+ }
++ /* dolog ("done len=%d\n", len); */
+ }
+
+ static int sdl_write_out (SWVoiceOut *sw, void *buf, int len)
+@@ -281,9 +292,18 @@ static int sdl_run_out (HWVoiceOut *hw, int live)
+ return 0;
+ }
+
+- sdl->live = live;
+- decr = sdl->decr;
+- sdl->decr = 0;
++ if (sdl->decr > live) {
++ ldebug ("sdl->decr %d live %d sdl->live %d\n",
++ sdl->decr,
++ live,
++ sdl->live);
++ }
++
++ decr = audio_MIN (sdl->decr, live);
++ sdl->decr -= decr;
++
++ sdl->live = live - decr;
++ hw->rpos = sdl->rpos;
+
+ if (sdl->live > 0) {
+ sdl_unlock_and_post (s, "sdl_run_out");
+--
+1.7.0.4
+
diff --git a/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-include-madvise-defines.patch b/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-include-madvise-defines.patch
new file mode 100644
index 0000000..c50c717
--- /dev/null
+++ b/app-emulation/qemu-kvm/files/qemu-kvm-0.12.3-include-madvise-defines.patch
@@ -0,0 +1,12 @@
+--- exec.c 2010-02-26 03:34:00.000000000 +0100
++++ exec.c.new 2010-04-03 15:31:53.000000000 +0200
+@@ -22,6 +22,9 @@
+ #else
+ #include <sys/types.h>
+ #include <sys/mman.h>
++#ifndef MADV_MERGEABLE
++#include <asm/mman.h>
++#endif
+ #endif
+ #include <stdlib.h>
+ #include <stdio.h>
diff --git a/app-emulation/qemu-kvm/files/qemu-kvm-guest-hang-on-usb-add.patch b/app-emulation/qemu-kvm/files/qemu-kvm-guest-hang-on-usb-add.patch
new file mode 100644
index 0000000..3f2abef
--- /dev/null
+++ b/app-emulation/qemu-kvm/files/qemu-kvm-guest-hang-on-usb-add.patch
@@ -0,0 +1,100 @@
+From 485b75728884a052b74d5458199ad45f0acbf190 Mon Sep 17 00:00:00 2001
+From: Timothy Jones <one.timothy.jones@gmail.com>
+Date: Mon, 28 Jun 2010 10:38:18 -0400
+Subject: [PATCH v2] Guest OS hangs on usb_add
+
+This is a small patch to sligtly "intelligentify" usb device and
+config descriptor parsing and to handle bug with certain usb
+device (URC MX-950) reporting device desriptor length as 0x18
+instead of 18 with added vendor_id/product_id check
+---
+ hw/usb.h | 5 +++++
+ usb-linux.c | 37 ++++++++++++++++++++++---------------
+ 2 files changed, 27 insertions(+), 15 deletions(-)
+
+diff --git a/hw/usb.h b/hw/usb.h
+index 00d2802..5c3528f 100644
+--- a/hw/usb.h
++++ b/hw/usb.h
+@@ -117,6 +117,11 @@
+ #define USB_DT_INTERFACE 0x04
+ #define USB_DT_ENDPOINT 0x05
+
++#define USB_DT_DEVICE_LEN 18
++#define USB_DT_CONFIG_LEN 9
++#define USB_DT_INTERFACE_LEN 9
++#define USB_DT_ENDPOINT_LEN 7
++
+ #define USB_ENDPOINT_XFER_CONTROL 0
+ #define USB_ENDPOINT_XFER_ISOC 1
+ #define USB_ENDPOINT_XFER_BULK 2
+diff --git a/usb-linux.c b/usb-linux.c
+index 88273ff..2ac6562 100644
+--- a/usb-linux.c
++++ b/usb-linux.c
+@@ -288,7 +288,7 @@ static void async_cancel(USBPacket *unused, void *opaque)
+
+ static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
+ {
+- int dev_descr_len, config_descr_len;
++ int dev_descr_len, config_descr_total_len;
+ int interface, nb_interfaces;
+ int ret, i;
+
+@@ -297,32 +297,39 @@ static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
+
+ DPRINTF("husb: claiming interfaces. config %d\n", configuration);
+
+- i = 0;
+ dev_descr_len = dev->descr[0];
+- if (dev_descr_len > dev->descr_len) {
++ if (dev_descr_len == 0x18 && dev->descr[ 8] == 0x47 && dev->descr[ 9] == 0x46
++ && dev->descr[10] == 0x00 && dev->descr[11] == 0x30)
++ dev_descr_len = USB_DT_DEVICE_LEN; /* for buggy MX-950 remote reporting len in hex */
++
++ if (dev_descr_len > dev->descr_len || dev_descr_len < USB_DT_DEVICE_LEN || dev->descr[1] != USB_DT_DEVICE) {
++ fprintf(stderr, "husb: invalid device descriptor\n");
+ goto fail;
+ }
+
+- i += dev_descr_len;
+- while (i < dev->descr_len) {
++ for (i = dev_descr_len; i < dev->descr_len; ) {
+ DPRINTF("husb: i is %d, descr_len is %d, dl %d, dt %d\n",
+ i, dev->descr_len,
+ dev->descr[i], dev->descr[i+1]);
+
+- if (dev->descr[i+1] != USB_DT_CONFIG) {
+- i += dev->descr[i];
+- continue;
++ if (dev->descr[i] < 2) {
++ fprintf(stderr, "husb: invalid descriptor\n");
++ goto fail;
+ }
+- config_descr_len = dev->descr[i];
++ if (dev->descr[i+1] == USB_DT_CONFIG) {
++ config_descr_total_len = dev->descr[i+2] + (dev->descr[i+3] << 8);
+
+- printf("husb: config #%d need %d\n", dev->descr[i + 5], configuration);
++ printf("husb: config #%d need %d\n", dev->descr[i + 5], configuration);
+
+- if (configuration < 0 || configuration == dev->descr[i + 5]) {
+- configuration = dev->descr[i + 5];
+- break;
+- }
++ if (configuration < 0 || configuration == dev->descr[i + 5]) {
++ configuration = dev->descr[i + 5];
++ break;
++ }
+
+- i += config_descr_len;
++ i += config_descr_total_len;
++ }
++ else
++ i += dev->descr[i];
+ }
+
+ if (i >= dev->descr_len) {
+--
+1.7.1
+
diff --git a/app-emulation/qemu-kvm/files/qemu.patch b/app-emulation/qemu-kvm/files/qemu.patch
new file mode 100644
index 0000000..3180fa5
--- /dev/null
+++ b/app-emulation/qemu-kvm/files/qemu.patch
@@ -0,0 +1,99 @@
+diff --git a/error.h b/error.h
+index 6361f40..d55e207 100644
+--- a/error.h
++++ b/error.h
+@@ -9,8 +9,8 @@
+ * This work is licensed under the terms of the GNU LGPL, version 2. See
+ * the COPYING.LIB file in the top-level directory.
+ */
+-#ifndef ERROR_H
+-#define ERROR_H
++#ifndef ERROR_QAPI_H
++#define ERROR_QAPI_H
+
+ #include "compiler.h"
+ #include <stdbool.h>
+diff --git a/hw/qxl.c b/hw/qxl.c
+index db7ae7a..c91a398 100644
+--- a/hw/qxl.c
++++ b/hw/qxl.c
+@@ -1189,7 +1189,7 @@ async_common:
+ }
+ d->current_async = orig_io_port;
+ qemu_mutex_unlock(&d->async_lock);
+- dprint(d, 2, "start async %d (%d)\n", io_port, val);
++ dprint(d, 2, "start async %d (%d)\n", (int)io_port, (int)val);
+ break;
+ default:
+ break;
+@@ -1306,7 +1306,7 @@ async_common:
+ }
+ case QXL_IO_FLUSH_SURFACES_ASYNC:
+ dprint(d, 1, "QXL_IO_FLUSH_SURFACES_ASYNC (%d) (%s, s#=%d, res#=%d)\n",
+- val, qxl_mode_to_string(d->mode), d->guest_surfaces.count,
++ (int)val, qxl_mode_to_string(d->mode), d->guest_surfaces.count,
+ d->num_free_res);
+ qxl_spice_flush_surfaces_async(d);
+ break;
+diff --git a/qapi/qapi-types-core.h b/qapi/qapi-types-core.h
+index a79bc2b..64d85fc 100644
+--- a/qapi/qapi-types-core.h
++++ b/qapi/qapi-types-core.h
+@@ -15,6 +15,6 @@
+ #define QAPI_TYPES_CORE_H
+
+ #include "qemu-common.h"
+-#include "error.h"
++#include "../error.h"
+
+ #endif
+diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
+index 5584693..d024120 100644
+--- a/qapi/qmp-dispatch.c
++++ b/qapi/qmp-dispatch.c
+@@ -10,7 +10,7 @@
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+-
++#include "../error.h"
+ #include "qemu-objects.h"
+ #include "qapi/qmp-core.h"
+ #include "json-parser.h"
+diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c
+index 3fe8866..2640437 100644
+--- a/qapi/qmp-registry.c
++++ b/qapi/qmp-registry.c
+@@ -11,7 +11,7 @@
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+-
++#include "../error.h"
+ #include "qapi/qmp-core.h"
+
+ static QTAILQ_HEAD(, QmpCommand) qmp_commands =
+diff --git a/qemu-objects.h b/qemu-objects.h
+index c53fbaa..3fbece1 100644
+--- a/qemu-objects.h
++++ b/qemu-objects.h
+@@ -13,6 +13,7 @@
+ #ifndef QEMU_OBJECTS_H
+ #define QEMU_OBJECTS_H
+
++#include "error.h"
+ #include "qobject.h"
+ #include "qint.h"
+ #include "qfloat.h"
+diff --git a/qga/guest-agent-core.h b/qga/guest-agent-core.h
+index e42b91d..b81eaba 100644
+--- a/qga/guest-agent-core.h
++++ b/qga/guest-agent-core.h
+@@ -10,6 +10,7 @@
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
++#include "../error.h"
+ #include "qapi/qmp-core.h"
+ #include "qemu-common.h"
+
diff --git a/app-emulation/qemu-kvm/qemu-kvm-9999-r1.ebuild b/app-emulation/qemu-kvm/qemu-kvm-9999-r1.ebuild
new file mode 100644
index 0000000..3574f5a
--- /dev/null
+++ b/app-emulation/qemu-kvm/qemu-kvm-9999-r1.ebuild
@@ -0,0 +1,273 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/app-emulation/qemu-kvm/qemu-kvm-0.14.1-r1.ebuild,v 1.1 2011/05/31 15:53:45 cardoe Exp $
+
+BACKPORTS=1
+
+EAPI="2"
+
+if [[ ${PV} = *9999* ]]; then
+ EGIT_REPO_URI="git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git"
+ GIT_ECLASS="git"
+fi
+
+inherit eutils flag-o-matic ${GIT_ECLASS} linux-info toolchain-funcs multilib
+
+if [[ ${PV} = *9999* ]]; then
+ SRC_URI=""
+ KEYWORDS=""
+else
+ SRC_URI="mirror://sourceforge/kvm/${PN}/${P}.tar.gz
+ ${BACKPORTS:+http://dev.gentoo.org/~cardoe/distfiles/${P}-backports-${BACKPORTS}.tar.bz2}"
+ KEYWORDS="~amd64 ~ppc ~ppc64 ~x86"
+fi
+
+DESCRIPTION="QEMU + Kernel-based Virtual Machine userland tools"
+HOMEPAGE="http://www.linux-kvm.org"
+
+LICENSE="GPL-2"
+SLOT="0"
+# xen is disabled until the deps are fixed
+IUSE="+aio alsa bluetooth brltty curl debug esd fdt hardened jpeg ncurses \
+png pulseaudio qemu-ifup rbd sasl sdl spice ssl static threads vde \
+vhost-net xen"
+
+COMMON_TARGETS="i386 x86_64 arm cris m68k microblaze mips mipsel ppc ppc64 sh4 sh4eb sparc sparc64"
+IUSE_SOFTMMU_TARGETS="${COMMON_TARGETS} mips64 mips64el ppcemb"
+IUSE_USER_TARGETS="${COMMON_TARGETS} alpha armeb ppc64abi32 sparc32plus"
+
+for target in ${IUSE_SOFTMMU_TARGETS}; do
+ IUSE="${IUSE} +qemu_softmmu_targets_${target}"
+done
+
+for target in ${IUSE_USER_TARGETS}; do
+ IUSE="${IUSE} +qemu_user_targets_${target}"
+done
+
+RESTRICT="test"
+
+RDEPEND="
+ !app-emulation/kqemu
+ !app-emulation/qemu
+ !app-emulation/qemu-softmmu
+ !app-emulation/qemu-user
+ !app-emulation/qemu-kvm-spice
+ sys-apps/pciutils
+ >=sys-apps/util-linux-2.16.0
+ sys-libs/zlib
+ aio? ( dev-libs/libaio )
+ alsa? ( >=media-libs/alsa-lib-1.0.13 )
+ bluetooth? ( net-wireless/bluez )
+ brltty? ( app-accessibility/brltty )
+ curl? ( net-misc/curl )
+ esd? ( media-sound/esound )
+ fdt? ( >=sys-apps/dtc-1.2.0 )
+ jpeg? ( virtual/jpeg )
+ ncurses? ( sys-libs/ncurses )
+ png? ( media-libs/libpng )
+ pulseaudio? ( media-sound/pulseaudio )
+ qemu-ifup? ( sys-apps/iproute2 net-misc/bridge-utils )
+ rbd? ( sys-cluster/ceph )
+ sasl? ( dev-libs/cyrus-sasl )
+ sdl? ( >=media-libs/libsdl-1.2.11[X] )
+ spice? ( app-emulation/spice )
+ ssl? ( net-libs/gnutls )
+ vde? ( net-misc/vde )
+ xen? ( app-emulation/xen )
+"
+
+DEPEND="${RDEPEND}
+ app-text/texi2html
+ >=sys-kernel/linux-headers-2.6.35
+ ssl? ( dev-util/pkgconfig )
+"
+
+kvm_kern_warn() {
+ eerror "Please enable KVM support in your kernel, found at:"
+ eerror
+ eerror " Virtualization"
+ eerror " Kernel-based Virtual Machine (KVM) support"
+ eerror
+}
+
+pkg_setup() {
+ use qemu_softmmu_targets_x86_64 || ewarn "You disabled default target QEMU_SOFTMMU_TARGETS=x86_64"
+
+ if kernel_is lt 2 6 25; then
+ eerror "This version of KVM requres a host kernel of 2.6.25 or higher."
+ eerror "Either upgrade your kernel"
+ else
+ if ! linux_config_exists; then
+ eerror "Unable to check your kernel for KVM support"
+ kvm_kern_warn
+ elif ! linux_chkconfig_present KVM; then
+ kvm_kern_warn
+ fi
+ if use vhost-net && ! linux_chkconfig_present VHOST_NET ; then
+ ewarn "You have to enable CONFIG_VHOST_NET in the kernel"
+ ewarn "to have vhost-net support."
+ fi
+ fi
+
+ enewgroup kvm
+}
+
+src_prepare() {
+ # prevent docs to get automatically installed
+ sed -i '/$(DESTDIR)$(docdir)/d' Makefile || die
+ # Alter target makefiles to accept CFLAGS set via flag-o
+ sed -i 's/^\(C\|OP_C\|HELPER_C\)FLAGS=/\1FLAGS+=/' \
+ Makefile Makefile.target || die
+ # append CFLAGS while linking
+ sed -i 's/$(LDFLAGS)/$(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS)/' rules.mak || die
+
+ # remove part to make udev happy
+ sed -e 's~NAME="%k", ~~' -i kvm/scripts/65-kvm.rules || die
+
+ # ${PN}-guest-hang-on-usb-add.patch was sent by Timothy Jones
+ # to the qemu-devel ml - bug 337988
+ epatch "${FILESDIR}/qemu-0.11.0-mips64-user-fix.patch"
+
+ epatch "${FILESDIR}/qemu.patch"
+
+# [[ -n ${BACKPORTS} ]] && \
+# EPATCH_FORCE=yes EPATCH_SUFFIX="patch" EPATCH_SOURCE="${S}/patches" \
+# epatch
+}
+
+src_configure() {
+ local conf_opts audio_opts user_targets
+
+ for target in ${IUSE_SOFTMMU_TARGETS} ; do
+ use "qemu_softmmu_targets_${target}" && \
+ softmmu_targets="${softmmu_targets} ${target}-softmmu"
+ done
+
+ for target in ${IUSE_USER_TARGETS} ; do
+ use "qemu_user_targets_${target}" && \
+ user_targets="${user_targets} ${target}-linux-user"
+ done
+
+ if [ -z "${softmmu_targets}" ]; then
+ conf_opts="${conf_opts} --disable-system"
+ else
+ einfo "Building the following softmmu targets: ${softmmu_targets}"
+ fi
+
+ if [ ! -z "${user_targets}" ]; then
+ einfo "Building the following user targets: ${user_targets}"
+ conf_opts="${conf_opts} --enable-linux-user"
+ else
+ conf_opts="${conf_opts} --disable-linux-user"
+ fi
+
+ # Fix QA issues. QEMU needs executable heaps and we need to mark it as such
+ conf_opts="${conf_opts} --extra-ldflags=-Wl,-z,execheap"
+
+ # Add support for static builds
+ use static && conf_opts="${conf_opts} --static"
+
+ # Support debug USE flag
+ use debug && conf_opts="${conf_opts} --enable-debug"
+
+ # Fix the $(prefix)/etc issue
+ conf_opts="${conf_opts} --sysconfdir=/etc"
+
+ #config options
+ conf_opts="${conf_opts} $(use_enable aio linux-aio)"
+ conf_opts="${conf_opts} $(use_enable bluetooth bluez)"
+ conf_opts="${conf_opts} $(use_enable brltty brlapi)"
+ conf_opts="${conf_opts} $(use_enable curl)"
+ conf_opts="${conf_opts} $(use_enable debug strip)"
+ conf_opts="${conf_opts} $(use_enable debug debug-tcg)"
+ conf_opts="${conf_opts} $(use_enable fdt)"
+ conf_opts="${conf_opts} $(use_enable hardened user-pie)"
+ conf_opts="${conf_opts} $(use_enable jpeg vnc-jpeg)"
+ conf_opts="${conf_opts} $(use_enable ncurses curses)"
+ conf_opts="${conf_opts} $(use_enable png vnc-png)"
+ conf_opts="${conf_opts} $(use_enable rbd)"
+ conf_opts="${conf_opts} $(use_enable sasl vnc-sasl)"
+ conf_opts="${conf_opts} $(use_enable sdl)"
+ conf_opts="${conf_opts} $(use_enable spice)"
+ conf_opts="${conf_opts} $(use_enable ssl vnc-tls)"
+ conf_opts="${conf_opts} $(use_enable threads vnc-thread)"
+ conf_opts="${conf_opts} $(use_enable vde)"
+ conf_opts="${conf_opts} $(use_enable vhost-net)"
+ conf_opts="${conf_opts} $(use_enable xen)"
+ conf_opts="${conf_opts} --disable-darwin-user --disable-bsd-user"
+
+ # audio options
+ audio_opts="oss"
+ use alsa && audio_opts="alsa ${audio_opts}"
+ use esd && audio_opts="esd ${audio_opts}"
+ use pulseaudio && audio_opts="pa ${audio_opts}"
+ use sdl && audio_opts="sdl ${audio_opts}"
+ ./configure --prefix=/usr \
+ --disable-strip \
+ --disable-werror \
+ --enable-kvm \
+ --enable-nptl \
+ --enable-uuid \
+ ${conf_opts} \
+ --audio-drv-list="${audio_opts}" \
+ --target-list="${softmmu_targets} ${user_targets}" \
+ --cc="$(tc-getCC)" \
+ --host-cc="$(tc-getBUILD_CC)" \
+ || die "configure failed"
+
+ # this is for qemu upstream's threaded support which is
+ # in development and broken
+ # the kvm project has its own support for threaded IO
+ # which is always on and works
+ # --enable-io-thread \
+}
+
+src_install() {
+ emake DESTDIR="${D}" install || die "make install failed"
+
+ if [ ! -z "${softmmu_targets}" ]; then
+ insinto /$(get_libdir)/udev/rules.d/
+ doins kvm/scripts/65-kvm.rules || die
+
+ if use qemu-ifup; then
+ insinto /etc/qemu/
+ insopts -m0755
+ doins kvm/scripts/qemu-ifup || die
+ fi
+
+ if use qemu_softmmu_targets_x86_64 ; then
+ dobin "${FILESDIR}"/qemu-kvm
+ dosym /usr/bin/qemu-kvm /usr/bin/kvm
+ else
+ elog "You disabled QEMU_SOFTMMU_TARGETS=x86_64, this disables install"
+ elog "of /usr/bin/qemu-kvm and /usr/bin/kvm"
+ fi
+ fi
+
+ dodoc Changelog MAINTAINERS TODO pci-ids.txt || die
+ newdoc pc-bios/README README.pc-bios || die
+ dohtml qemu-doc.html qemu-tech.html || die
+}
+
+pkg_postinst() {
+
+ if [ ! -z "${softmmu_targets}" ]; then
+ elog "If you don't have kvm compiled into the kernel, make sure you have"
+ elog "the kernel module loaded before running kvm. The easiest way to"
+ elog "ensure that the kernel module is loaded is to load it on boot."
+ elog "For AMD CPUs the module is called 'kvm-amd'"
+ elog "For Intel CPUs the module is called 'kvm-intel'"
+ elog "Please review /etc/conf.d/modules for how to load these"
+ elog
+ elog "Make sure your user is in the 'kvm' group"
+ elog "Just run 'gpasswd -a <USER> kvm', then have <USER> re-login."
+ elog
+ elog "You will need the Universal TUN/TAP driver compiled into your"
+ elog "kernel or loaded as a module to use the virtual network device"
+ elog "if using -net tap. You will also need support for 802.1d"
+ elog "Ethernet Bridging and a configured bridge if using the provided"
+ elog "kvm-ifup script from /etc/kvm."
+ elog
+ elog "The gnutls use flag was renamed to ssl, so adjust your use flags."
+ fi
+}