nixpkgs-suyu/pkgs/applications/virtualization/xen/default.nix
Jan Malakhovski da7408e105 xen: Support PCI passthrough.
Previous commit reverted Xen back to 4.0.3 because xend from 4.1.* and newer
hangs for unknown reasons.
The new "xl" toolstack from 4.1.* and unstable works, yet PCI passthrough is not
supported by xl in 4.1.* and is broken in the unstable.

With this patch I was able to passthrough ATI Radeon HD 6950 without 3D
acceleration, though, to both Linux and Windows guests. Which is the best
archived result with Xen PCI passthrough on NixOS after trying out all possible
Xen versions.
Same VGA card works fine if passed through into a guest with KVM (acceleration,
GPGPU, everything works). I should have tried KVM from the start.
2012-08-08 03:16:57 +04:00

140 lines
4.5 KiB
Nix

{ stdenv, fetchurl, which, zlib, pkgconfig, SDL, openssl
, libuuid, gettext, ncurses, dev86, iasl, pciutils, bzip2, xz
, lvm2, utillinux, procps, texinfo, perl, pythonPackages }:
with stdenv.lib;
let
version = "4.0.3";
libDir = if stdenv.is64bit then "lib64" else "lib";
# Sources needed to build the stubdoms.
stubdomSrcs =
[ { url = http://xenbits.xensource.com/xen-extfiles/lwip-1.3.0.tar.gz;
sha256 = "13wlr85s1hnvia6a698qpryyy12lvmqw0a05xmjnd0h71ralsbkp";
}
{ url = http://xenbits.xensource.com/xen-extfiles/zlib-1.2.3.tar.gz;
sha256 = "0pmh8kifb6sfkqfxc23wqp3f2wzk69sl80yz7w8p8cd4cz8cg58p";
}
{ url = http://xenbits.xensource.com/xen-extfiles/newlib-1.16.0.tar.gz;
sha256 = "01rxk9js833mwadq92jx0flvk9jyjrnwrq93j39c2j2wjsa66hnv";
}
{ url = http://xenbits.xensource.com/xen-extfiles/grub-0.97.tar.gz;
sha256 = "02r6b52r0nsp6ryqfiqchnl7r1d9smm80sqx24494gmx5p8ia7af";
}
{ url = http://xenbits.xensource.com/xen-extfiles/pciutils-2.2.9.tar.bz2;
sha256 = "092v4q478i1gc7f3s2wz6p4xlf1wb4gs5shbkn21vnnmzcffc2pn";
}
];
in
stdenv.mkDerivation {
name = "xen-${version}";
src = fetchurl {
url = "http://bits.xensource.com/oss-xen/release/${version}/xen-${version}.tar.gz";
sha256 = "0p4i7mm8cdsr8i9z3dij6nriyvz6la2rhm7jkyk2n8h62nnxi1b5";
};
patches =
[ # Xen looks for headers in /usr/include and for libraries using
# ldconfig. Don't do that.
./has-header.patch
# GCC 4.5 compatibility.
./gcc-4.5.patch
];
buildInputs =
[ which zlib pkgconfig SDL openssl libuuid gettext ncurses
dev86 iasl pciutils bzip2 xz texinfo perl
pythonPackages.python pythonPackages.wrapPython
];
pythonPath = [ pythonPackages.curses ];
makeFlags = "PREFIX=$(out) CONFIG_DIR=/etc";
buildFlags = "xen tools stubdom";
preBuild =
''
substituteInPlace tools/libfsimage/common/fsimage_plugin.c \
--replace /usr $out
substituteInPlace tools/blktap2/lvm/lvm-util.c \
--replace /usr/sbin/vgs ${lvm2}/sbin/vgs \
--replace /usr/sbin/lvs ${lvm2}/sbin/lvs
substituteInPlace tools/hotplug/Linux/network-bridge \
--replace /usr/bin/logger ${utillinux}/bin/logger
substituteInPlace tools/xenmon/xenmon.py \
--replace /usr/bin/pkill ${procps}/bin/pkill
substituteInPlace tools/xenstat/Makefile \
--replace /usr/include/curses.h ${ncurses}/include/curses.h
substituteInPlace tools/ioemu-qemu-xen/xen-hooks.mak \
--replace /usr/include/pci ${pciutils}/include/pci
# Work around a bug in our GCC wrapper: `gcc -MF foo -v' doesn't
# print the GCC version number properly.
substituteInPlace xen/Makefile \
--replace '$(CC) $(CFLAGS) -v' '$(CC) -v'
substituteInPlace tools/python/xen/xend/server/BlktapController.py \
--replace /usr/sbin/tapdisk2 $out/sbin/tapdisk2
substituteInPlace tools/python/xen/xend/XendQCoWStorageRepo.py \
--replace /usr/sbin/qcow-create $out/sbin/qcow-create
substituteInPlace tools/python/xen/remus/save.py \
--replace /usr/lib/xen/bin/xc_save $out/${libDir}/xen/bin/xc_save
substituteInPlace tools/python/xen/remus/device.py \
--replace /usr/lib/xen/bin/imqebt $out/${libDir}/xen/bin/imqebt
# Allow the location of the xendomains config file to be
# overriden at runtime.
substituteInPlace tools/hotplug/Linux/init.d/xendomains \
--replace 'XENDOM_CONFIG=/etc/sysconfig/xendomains' "" \
--replace /bin/ls ls
# Xen's stubdoms need various sources that it usually fetches at
# build time using wget. We can't have that.
${flip concatMapStrings stubdomSrcs (x: let src = fetchurl x; in ''
cp ${src} stubdom/${src.name}
'')}
# Hack to get `gcc -m32' to work without having 32-bit Glibc headers.
mkdir -p tools/include/gnu
touch tools/include/gnu/stubs-32.h
'';
postBuild =
''
make -C docs man-pages
'';
installPhase =
''
mkdir -p $out
cp -prvd dist/install/nix/store/*/* $out/
cp -prvd dist/install/boot $out/boot
cp -prvd dist/install/etc $out/etc
cp -dR docs/man1 docs/man5 $out/share/man/
wrapPythonPrograms
''; # */
meta = {
homepage = http://www.xen.org/;
description = "Xen hypervisor and management tools for Dom0";
platforms = [ "i686-linux" "x86_64-linux" ];
maintainers = [ stdenv.lib.maintainers.eelco ];
};
}