From 66368e2767c6b888a7c06ad9f00ca36f5ac1d636 Mon Sep 17 00:00:00 2001 From: André Fabian Silva Delgado Date: Mon, 19 Nov 2012 20:08:39 -0200 Subject: xen-4.2.0-12: updating version --- kernels/xen/09_xen | 140 +- kernels/xen/24341.patch | 11 - kernels/xen/24344.patch | 33 - kernels/xen/24345.patch | 31 - kernels/xen/PKGBUILD | 214 +- kernels/xen/archinit.patch | 450 ++++ kernels/xen/dom0_xz_decompression.patch | 3528 ------------------------------- kernels/xen/proc-xen.mount | 9 + kernels/xen/texi2html.patch | 10 + kernels/xen/var-lib-xenstored.mount | 10 + kernels/xen/xen.conf | 19 + kernels/xen/xen.install | 38 + kernels/xen/xen.patch | 21 - kernels/xen/xenconsoled.service | 18 + kernels/xen/xendomU@.service | 12 + kernels/xen/xendomains.service | 15 + kernels/xen/xenstored.service | 18 + 17 files changed, 784 insertions(+), 3793 deletions(-) mode change 100755 => 100644 kernels/xen/09_xen delete mode 100755 kernels/xen/24341.patch delete mode 100755 kernels/xen/24344.patch delete mode 100755 kernels/xen/24345.patch mode change 100755 => 100644 kernels/xen/PKGBUILD create mode 100644 kernels/xen/archinit.patch delete mode 100755 kernels/xen/dom0_xz_decompression.patch create mode 100644 kernels/xen/proc-xen.mount create mode 100644 kernels/xen/texi2html.patch create mode 100644 kernels/xen/var-lib-xenstored.mount create mode 100644 kernels/xen/xen.conf create mode 100644 kernels/xen/xen.install delete mode 100755 kernels/xen/xen.patch create mode 100644 kernels/xen/xenconsoled.service create mode 100644 kernels/xen/xendomU@.service create mode 100644 kernels/xen/xendomains.service create mode 100644 kernels/xen/xenstored.service (limited to 'kernels') diff --git a/kernels/xen/09_xen b/kernels/xen/09_xen old mode 100755 new mode 100644 index 094b7f427..42309149c --- a/kernels/xen/09_xen +++ b/kernels/xen/09_xen @@ -1,69 +1,69 @@ #! /bin/sh -e -if [ -f /usr/lib/grub/grub-mkconfig_lib ]; then - . /usr/lib/grub/grub-mkconfig_lib +if [ -f /usr/share/grub/grub-mkconfig_lib ]; then + . /usr/share/grub/grub-mkconfig_lib else # no grub file, so we notify and exit gracefully - echo "Cannot find grub config file, exiting." >&2 - exit 0 + echo "Cannot find grub config file, exiting." >&2 + exit 0 fi -XEN_HYPERVISOR_CMDLINE= +XEN_HYPERVISOR_CMDLINE="xsave=1" XEN_LINUX_CMDLINE="console=tty0" [ -r /etc/xen/grub.conf ] && . /etc/xen/grub.conf CLASS="--class gnu-linux --class gnu --class os" if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then - OS=GNU/Linux + OS=GNU/Linux else - OS="${GRUB_DISTRIBUTOR}" - CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]' | cut -d' ' -f1) ${CLASS}" + OS="${GRUB_DISTRIBUTOR}" + CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]' | cut -d' ' -f1) ${CLASS}" fi # loop-AES arranges things so that /dev/loop/X can be our root device, but # the initrds that Linux uses don't like that. case ${GRUB_DEVICE} in - /dev/loop/*|/dev/loop[0-9]) - GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"` - ;; + /dev/loop/*|/dev/loop[0-9]) + GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"` + ;; esac if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ || [ "`grub-probe -t abstraction --device ${GRUB_DEVICE} | sed -e 's,.*\(lvm\).*,\1,'`" = "lvm" ] ; then - LINUX_ROOT_DEVICE=${GRUB_DEVICE} + LINUX_ROOT_DEVICE=${GRUB_DEVICE} else - LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} + LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} fi xen_entry () { - os="$1" - xen_version="$2" - version="$3" - xen_args="$4" - args="$5" - printf "menuentry 'Xen %s / %s, with Linux %s' --class xen ${CLASS} {\n" "${xen_version}" "${os}" "${version}" - save_default_entry | sed -e "s/^/\t/" - - if [ -z "${prepare_boot_cache}" ]; then - prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")" - fi - printf '%s\n' "${prepare_boot_cache}" - cat << EOF + os="$1" + xen_version="$2" + version="$3" + xen_args="$4" + args="$5" + printf "menuentry 'Xen %s / %s, with Linux %s' --class xen ${CLASS} {\n" "${xen_version}" "${os}" "${version}" + save_default_entry | sed -e "s/^/\t/" + + if [ -z "${prepare_boot_cache}" ]; then + prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")" + fi + printf '%s\n' "${prepare_boot_cache}" + cat << EOF echo '$(printf "Loading Xen %s ..." ${xen_version})' multiboot ${rel_dirname}/${xen_basename} ${rel_dirname}/${xen_basename} ${xen_args} echo $(printf "$(gettext "Loading Linux %s ...")" ${version}) module ${rel_dirname}/${basename} ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} EOF - if test -n "${initrd}" ; then - cat << EOF + if test -n "${initrd}" ; then + cat << EOF echo "Loading initial ramdisk ..." module ${rel_dirname}/${initrd} EOF - fi - cat << EOF + fi + cat << EOF } EOF } @@ -74,50 +74,48 @@ done` prepare_boot_cache= while [ "x$xen_list" != "x" ] ; do - xen=`version_find_latest $xen_list` - echo "Found Xen hypervisor image: $xen" >&2 - xen_basename=`basename $xen` - xen_dirname=`dirname $xen` - rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname` - xen_version=`echo $xen_basename | sed -e "s,^[^0-9]*-,,g" | sed -e "s,.gz,,g"` - alt_xen_version=`echo $xen_version | sed -e "s,\.old$,,g"` - - xen_configfiles=`grep -l 'CONFIG_XEN_PRIVILEGED_GUEST=y' /boot/config-*` - - list="/boot/vmlinuz-linux-libre"; - - while [ "x$list" != "x" ] ; do - linux=`version_find_latest $list` - echo -e "\tFound linux image: $linux" >&2 - basename=`basename $linux` - dirname=`dirname $linux` - rel_dirname=`make_system_path_relative_to_its_root $dirname` - version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` - base_init=`echo $basename | sed -e "s,vmlinuz,initramfs,g"` - alt_version="${base_init}-fallback" - linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" - initrd= - - for i in "${base_init}.img"; do - if test -e "${dirname}/${i}" ; then - initrd="$i" - break - fi - done - if test -n "${initrd}" ; then - echo -e "\tFound initrd image: ${dirname}/${initrd}" >&2 - else + xen=`version_find_latest $xen_list` + echo "Found Xen hypervisor image: $xen" >&2 + xen_basename=`basename $xen` + xen_dirname=`dirname $xen` + rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname` + xen_version=`echo $xen_basename | sed -e "s,^[^0-9]*-,,g" | sed -e "s,.gz,,g"` + alt_xen_version=`echo $xen_version | sed -e "s,\.old$,,g"` + + list="/boot/vmlinuz-linux"; + + while [ "x$list" != "x" ] ; do + linux=`version_find_latest $list` + echo -e "\tFound linux image: $linux" >&2 + basename=`basename $linux` + dirname=`dirname $linux` + rel_dirname=`make_system_path_relative_to_its_root $dirname` + version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` + base_init=`echo $basename | sed -e "s,vmlinuz,initramfs,g"` + alt_version="${base_init}-fallback" + linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" + initrd= + + for i in "${base_init}.img"; do + if test -e "${dirname}/${i}" ; then + initrd="$i" + break + fi + done + if test -n "${initrd}" ; then + echo -e "\tFound initrd image: ${dirname}/${initrd}" >&2 + else # "UUID=" magic is parsed by initrds. Since there's no initrd, it can't work here. - linux_root_device_thisversion=${GRUB_DEVICE} - fi + linux_root_device_thisversion=${GRUB_DEVICE} + fi - xen_entry "${OS}" "${xen_version}" "${version}" \ - "${XEN_HYPERVISOR_CMDLINE}" \ - "${XEN_LINUX_CMDLINE}" + xen_entry "${OS}" "${xen_version}" "${version}" \ + "${XEN_HYPERVISOR_CMDLINE}" \ + "${XEN_LINUX_CMDLINE}" - list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` - done + list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` + done - xen_list=`echo $xen_list | tr ' ' '\n' | grep -vx $xen | tr '\n' ' '` + xen_list=`echo $xen_list | tr ' ' '\n' | grep -vx $xen | tr '\n' ' '` done diff --git a/kernels/xen/24341.patch b/kernels/xen/24341.patch deleted file mode 100755 index 5554004d3..000000000 --- a/kernels/xen/24341.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/xen/arch/x86/x86_64/mmconfig_64.c 2011-10-20 15:05:49.000000000 -0200 -+++ b/xen/arch/x86/x86_64/mmconfig_64.c 2012-02-14 23:45:47.481729733 -0200 -@@ -23,7 +23,7 @@ - char __iomem *virt; - }; - static struct mmcfg_virt *pci_mmcfg_virt; --static int __initdata mmcfg_pci_segment_shift; -+static unsigned int mmcfg_pci_segment_shift; - - static char __iomem *get_virt(unsigned int seg, unsigned bus) - { diff --git a/kernels/xen/24344.patch b/kernels/xen/24344.patch deleted file mode 100755 index 642b90867..000000000 --- a/kernels/xen/24344.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/tools/libxc/xc_cpuid_x86.c 2011-10-20 15:05:42.000000000 -0200 -+++ b/tools/libxc/xc_cpuid_x86.c 2012-02-15 00:01:46.307514813 -0200 -@@ -42,23 +42,23 @@ - static void cpuid(const unsigned int *input, unsigned int *regs) - { - unsigned int count = (input[1] == XEN_CPUID_INPUT_UNUSED) ? 0 : input[1]; -- asm ( - #ifdef __i386__ -+/* Use the stack to avoid reg constraint failures with some gcc flags */ -+ asm ( - "push %%ebx; push %%edx\n\t" --#else -- "push %%rbx; push %%rdx\n\t" --#endif - "cpuid\n\t" - "mov %%ebx,4(%4)\n\t" - "mov %%edx,12(%4)\n\t" --#ifdef __i386__ - "pop %%edx; pop %%ebx\n\t" -+ : "=a" (regs[0]), "=c" (regs[2]) -+ : "0" (input[0]), "1" (count), "S" (regs) -+ : "memory" ); - #else -- "pop %%rdx; pop %%rbx\n\t" -+ asm ( -+ "cpuid" -+ : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) -+ : "0" (input[0]), "2" (count) ); - #endif -- : "=a" (regs[0]), "=c" (regs[2]) -- : "0" (input[0]), "1" (count), "S" (regs) -- : "memory" ); - } diff --git a/kernels/xen/24345.patch b/kernels/xen/24345.patch deleted file mode 100755 index e75a1b38c..000000000 --- a/kernels/xen/24345.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/tools/misc/xen-detect.c 2011-10-20 15:05:43.000000000 -0200 -+++ b/tools/misc/xen-detect.c 2012-02-15 00:05:55.524455578 -0200 -@@ -35,18 +35,21 @@ - - static void cpuid(uint32_t idx, uint32_t *regs, int pv_context) - { -- asm volatile ( - #ifdef __i386__ --#define R(x) "%%e"#x"x" --#else --#define R(x) "%%r"#x"x" --#endif -- "push "R(a)"; push "R(b)"; push "R(c)"; push "R(d)"\n\t" -+/* Use the stack to avoid reg constraint failures with some gcc flags */ -+ asm volatile ( -+ "push %%eax; push %%ebx; push %%ecx; push %%edx\n\t" - "test %1,%1 ; jz 1f ; ud2a ; .ascii \"xen\" ; 1: cpuid\n\t" - "mov %%eax,(%2); mov %%ebx,4(%2)\n\t" - "mov %%ecx,8(%2); mov %%edx,12(%2)\n\t" -- "pop "R(d)"; pop "R(c)"; pop "R(b)"; pop "R(a)"\n\t" -+ "pop %%edx; pop %%ecx; pop %%ebx; pop %%eax\n\t" - : : "a" (idx), "c" (pv_context), "S" (regs) : "memory" ); -+#else -+ asm volatile ( -+ "test %5,%5 ; jz 1f ; ud2a ; .ascii \"xen\" ; 1: cpuid\n\t" -+ : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) -+ : "0" (idx), "1" (pv_context), "2" (0) ); -+#endif - } - - static int check_for_xen(int pv_context) diff --git a/kernels/xen/PKGBUILD b/kernels/xen/PKGBUILD old mode 100755 new mode 100644 index c51ffeaa9..33a2dccb1 --- a/kernels/xen/PKGBUILD +++ b/kernels/xen/PKGBUILD @@ -1,104 +1,122 @@ -# Maintainer M0Rf30 -# Contributor WaxyMouthfeel -# Maintainer (Parabola): André Silva +# Maintainer: Limao Luo +# Contributor: Luceo +# Contributor: Revellion + pkgname=xen -pkgver=4.1.2 -pkgrel=3.1 -pkgdesc="Xen 4 (hypervisor and tools)" +pkgver=4.2.0 +pkgrel=12 +pkgdesc="Xen Hypervisor & Tools" arch=(i686 x86_64) -url="http://xen.org/" -license="GPL" - -if [[ $CARCH == "x86_64" ]]; then - depends=('xz' 'bzip2' 'iproute' 'net-tools' 'bridge-utils' 'python2' 'sdl' 'zlib' 'e2fsprogs' 'bin86' 'pkgconfig' 'gnutls' 'lzo2' 'lib32-glibc') -else - depends=('xz' 'bzip2' 'iproute' 'net-tools' 'bridge-utils' 'python2' 'sdl' 'zlib' 'e2fsprogs' 'bin86' 'pkgconfig' 'gnutls' 'lzo2' 'glibc') -fi - -optdepends=('xen-docs: Xen Official Documentation') -makedepends=('dev86' 'ocaml-findlib' 'iasl') -conflicts=('xen4' 'xen3' 'xen-hv-tools' 'libxen4') -provides=('xen') -backup=('etc/xen/xend-config.sxp' 'etc/xen/xend-pci-permissive.sxp' 'etc/xen/xend-pci-quirks.sxp') -options=(!strip) -optional=(xen-docs) -source=(http://bits.xensource.com/oss-xen/release/${pkgver}/xen-${pkgver}.tar.gz - 09_xen - xen.patch - parabolainit.patch - dom0_xz_decompression.patch - 24341.patch - 24344.patch - 24345.patch) +url=http://xen.org +license=(GPL) +depends=(bin86 bluez bridge-utils glib2 gnutls libaio libjpeg-turbo libpng lzo2 sdl wget vde2 yajl) +[[ "$CARCH" == "x86_64" ]] && depends+=(lib32-glibc) +makedepends=(dev86 git iasl markdown ocaml-findlib) +optdepends=('xen-docs: Official Xen Documentation') +conflicts=(xen-4.2{,-testing-hg} xen-{gdbsx,hg-unstable,rc}) +backup=(etc/$pkgname/xend-{config,pci-{permissive,quirks}}.sxp etc/modules-load.d/$pkgname.conf) +options=(!buildflags !emptydirs !strip) +install=$pkgname.install +source=(http://bits.xensource.com/oss-xen/release/$pkgver/$pkgname-$pkgver.tar.gz + 09_xen + archinit.patch + texi2html.patch + proc-xen.mount + var-lib-xenstored.mount + xenconsoled.service + xendomains.service + xendomU@.service + xenstored.service + $pkgname.conf) +sha256sums=('43f4a086e4e0330145a27b7ace8365c42b5afbc95cefadafe067be91bd3e5cfb' + 'e8dd740c0f18ea41bb80afad36ca981669e6ab86eb3848fbb40f0dff3b8aa3e6' + '35900d3ae2f2cc27834b8a7cb11f134b582f01bde033598c407c8e58ad58fdb9' + '08e5bf65c833a608470ad118ce369e32f9c267e1787f2900c06708af321225e6' + '139eed988bfaf8edc8ccdfd0b668382bd63db48ce17be91776182a7e28e9d88c' + 'c19146931c6ab8e53092bd9b2ebbfda5c76fd22ad3b1d42dcda3dd1b61f123ff' + 'ba8f1c10b3f3df1f9fda0782a691fed67661e36f49be74471c86850639fee3ba' + '0bd45d9de6456c4f9adf32e726f2db3a3cd0423c1d161b442e8a1666d2e68e3f' + '1862a14607582d14247b74435dfb16411fd68904aa19e2a93c5e6ac301169d3c' + '0a1960fd51a2f4e8e856c7392e33cc9607ac4a80e9d68b316b6a4281f34728e0' + '50a9b7fd19e8beb1dea09755f07318f36be0b7ec53d3c9e74f3266a63e682c0c') +sha512sums=('4fb56c79d722fb307bc657f16d02079c6636427e7650c4354193632d38d2d1db8e588f844ff0ca6e757c108ed639a528565ec9fc7c00bb4d5b6fbc9d122d8a70' + '23402f54e1a40c058566d6c0f18ac2e89ea85eea8bedf669f059e30ad76b3b90d81b7ff34d8e8c07ab4fea7f82ae32c80a66df2fd95fb3b296e982cdcc93d0b6' + '9ce0c009f055c9be42435be9eeeec980285cbef4fb52cbd8d81f76ae1e7760575b5c9f958e3d44612d2740eafa1e18ee48f30a5571f0c06bd031d4e102abb22f' + '562f12e723116c705fc9d0fd4a2afd382a93465be7f616d1e20e87daf39c11029fbc57ec46e38d3ff61c482fdc9ac4df9e07600a77515867d9da6f0faf3da7f9' + '6afdf16e32bb837faf6333334f86855a746f1f46fee9673a4fddc62eecf41f9856bc34397807203c6f5071f0b1ce74532214084042154585c0d39514450db25c' + '00e340f4d3635e3850ca24baea1da08467523c17815feb74161e18397b607fef904db2165fd9bf4632a6e8a6e37aeddad4e56965e1c99b5213c98b3f9afc6aad' + '27d7289a8bf6e15bddcb360287001429205b57ee4d791b0337328879ffd76b8e375e3c1dd0de0ab57dd4bd1e2a2bc1748c44cc05b2528632a3e6af60f626de9d' + 'f00034f8b826b828659a0177f0a6454113c625e69a817dfe32e461767f6643e0288bfc2a22d23358504240df627af6e3b8f5ffa0077e241e590b33d3f252e74c' + '31fefc739f0f0e568df03dcf9aa02e0265ff4fbf77e7ae62d6a318fcc34e87a0ffd3fc4b84ff8c9cc95511e2e74b7b61e6b5471cd0b3cd47ee0da86b1ea90268' + '87aceb1c646e49940bfbc47da85d7e20c9436449b152c0842b357033f66aba68a590f1d56c4a3f437d093047a611f28fd67d381692d9b21a582e598ecf1a72a2' + 'ccaa2ff82e4203b11e5dec9aeccac2e165721d8067e0094603ecaa7a70b78c9eb9e2287a32687883d26b6ceae6f8d2ad7636ddf949eb658637b3ceaa6999711b') build() { - - - cd $srcdir/xen-${pkgver} - - patch -p1 -i ../xen.patch - patch -p1 -i ../parabolainit.patch - patch -p1 -i ../dom0_xz_decompression.patch - patch -p1 -i ../24341.patch - patch -p1 -i ../24344.patch - patch -p1 -i ../24345.patch - -unset CFLAGS LDFLAGS - -make PYTHON=python2 DESTDIR=$pkgdir install-xen -make PYTHON=python2 DESTDIR=$pkgdir install-tools -#make PYTHON=python2 DESTDIR=$pkgdir install-stubdom - - sed -i 's#XENDOM_CONFIG=/etc/sysconfig/xendomains#XENDOM_CONFIG=/etc/conf.d/xendomains#' $pkgdir/etc/init.d/xendomains - sed -i "s#touch /var/lock/subsys/xend#mkdir -p /var/lock/subsys\n touch /var/lock/subsys/xend#" $pkgdir/etc/init.d/xend - - [ -d $pkgdir/usr/lib64 ] && ( cd $pkgdir/usr && cp -R lib64/* lib/ && rm -R lib64 ) - ( cd $pkgdir/etc && mv init.d rc.d ) || return 1 - rm -f $pkgdir/usr/share/man/man1/qemu-img.1* \ - $pkgdir/usr/share/man/man1/qemu.1* - # First experiment to generate grub2.cfg entry - mkdir -p $pkgdir/etc/grub.d - chmod +x $srcdir/09_xen - cp $srcdir/09_xen $pkgdir/etc/grub.d - - ############ kill unwanted stuff ############ - -# stubdom: newlib -rm -rf $pkgdir/usr/*-xen-elf - -# hypervisor symlinks -rm -rf $pkgdir/boot/xen-4.1.gz -rm -rf $pkgdir/boot/xen-4.gz -rm -rf $pkgdir/boot/xen.gz - -# silly doc dir fun -rm -fr $pkgdir/usr/share/doc/xen -rm -rf $pkgdir/usr/share/doc/qemu - -# Pointless helper -rm -f $pkgdir/usr/sbin/xen-python-path - -# qemu stuff (unused or available from upstream) -rm -rf $pkgdir/usr/share/xen/man -rm -rf $pkgdir/usr/bin/qemu-*-xen -for file in bios.bin openbios-sparc32 openbios-sparc64 ppc_rom.bin \ - pxe-e1000.bin pxe-ne2k_pci.bin pxe-pcnet.bin pxe-rtl8139.bin \ - vgabios.bin vgabios-cirrus.bin video.x openbios-ppc bamboo.dtb -do - rm -f $pkgdir/usr/share/xen/qemu/$file -done - -# adhere to Static Library Packaging Guidelines -rm -rf $pkgdir/usr/lib/*.a - - + cd "$srcdir"/$pkgname-$pkgver/ + + patch -Np1 -i ../archinit.patch + patch -Np1 -i ../texi2html.patch + + ./autogen.sh + ./configure PYTHON=/usr/bin/python2 } -md5sums=('73561faf3c1b5e36ec5c089b5db848ad' - '8d50beba46ffd89a3b959176245b676e' - 'f149bae1a6b420e49c51b9f3a74338a4' - '7a1ed81ecc828037724bb3280058c9fc' - '4aebccf16b578ed97aa8bab945011f35' - '1b0c05a555bc99fc8416dd52b6c6ae95' - 'b6225be5bec3fe462f9166f9fde9c347' - 'd282946a2873a78b2b2c3944571eb2fe') +package() { + cd "$srcdir"/$pkgname-$pkgver/ + + make PYTHON=python2 DESTDIR="$pkgdir" install-xen install-tools + # stubdom won't build with multiple makethreads + make -j1 PYTHON=python2 DESTDIR="$pkgdir" install-stubdom + + cd ../ + for f in ${source[@]}; do + [[ $f =~ .mount || $f =~ .service ]] && install -Dm644 $f "$pkgdir"/usr/lib/systemd/system/$f + done + install -Dm644 $pkgname.conf "$pkgdir"/etc/modules-load.d/$pkgname.conf + install -Dm755 09_xen "$pkgdir"/etc/grub.d/09_xen + + cd "$pkgdir" + sed -i ':XENDOM_CONFIG=/etc/:s:sysconfig/xendomains:conf.d/xendomains:' etc/init.d/xendomains + sed -i 's:touch /var/lock/subsys/xend:mkdir -p /var/lock/subsys\n &:' etc/init.d/xend + + if [[ -d usr/lib64 ]]; then + cd usr/ + cp -r lib64/* lib/ + rm -rf lib64 + fi + + mv etc/{init,rc}.d + + mv usr/local/etc/qemu/ etc/ + rm -rf usr/local/share/ + mv etc/rc.d/xendomains etc/xen/scripts/xendomains + + ##### Kill unwanted stuff ##### + # stubdom: newlib + rm -rf usr/*-xen-elf + + # hypervisor symlinks + rm -f boot/xen{,-4,-4.2}.gz + + # silly doc dir fun + rm -rf usr/share/doc/xen + rm -rf usr/share/doc/qemu + + # Pointless helper + rm -f usr/sbin/xen-python-path + + # qemu stuff (unused or available from upstream) + rm -rf usr/share/xen/man + rm -rf usr/bin/qemu-*-xen + for file in bios.bin openbios-sparc32 openbios-sparc64 ppc_rom.bin \ + pxe-e1000.bin pxe-ne2k_pci.bin pxe-pcnet.bin pxe-rtl8139.bin \ + vgabios.bin vgabios-cirrus.bin video.x openbios-ppc bamboo.dtb; do + rm -f usr/share/xen/qemu/$file + done + + # adhere to Static Library Packaging Guidelines + rm -rf usr/lib/*.a + + # Fix errors from deprecated xend + rm etc/udev/rules.d/xend.rules +} diff --git a/kernels/xen/archinit.patch b/kernels/xen/archinit.patch new file mode 100644 index 000000000..f5bece6e2 --- /dev/null +++ b/kernels/xen/archinit.patch @@ -0,0 +1,450 @@ +--- a/tools/hotplug/Linux/init.d/xencommons 2011-07-03 03:08:44.953747064 -0700 ++++ b/tools/hotplug/Linux/init.d/xencommons 2011-07-05 13:47:54.627029164 -0700 +@@ -17,6 +17,8 @@ + # Short-Description: Start/stop xenstored and xenconsoled + # Description: Starts and stops the daemons neeeded for xl/xend + ### END INIT INFO ++. /etc/rc.conf ++. /etc/rc.d/functions + + if [ -d /etc/sysconfig ]; then + xencommons_config=/etc/sysconfig +@@ -26,7 +28,7 @@ + + test -f $xencommons_config/xencommons && . $xencommons_config/xencommons + +-XENCONSOLED_PIDFILE=/var/run/xenconsoled.pid ++XENCONSOLED_PIDFILE=/run/daemons/xenconsoled.pid + shopt -s extglob + + # not running in Xen dom0 or domU +@@ -69,7 +71,7 @@ + modprobe pciback 2>/dev/null + modprobe xen-acpi-processor 2>/dev/null + modprobe blktap2 2>/dev/null || modprobe blktap 2>/dev/null +- mkdir -p /var/run/xen ++ #mkdir -p /var/run/xen + + if ! `xenstore-read -s / >/dev/null 2>&1` + then +@@ -78,55 +80,66 @@ + test -z "$XENSTORED_TRACE" || XENSTORED_ARGS=" -T /var/log/xen/xenstored-trace.log" + + if [ -n "$XENSTORED" ] ; then +- echo -n Starting $XENSTORED... +- $XENSTORED --pid-file /var/run/xenstored.pid $XENSTORED_ARGS ++ #echo -n Starting $XENSTORED... ++ stat_busy "Starting $XENSTORED" ++ $XENSTORED --pid-file /run/daemons/xenstored.pid $XENSTORED_ARGS + elif [ -x /usr/sbin/oxenstored ] ; then +- echo -n Starting oxenstored... +- /usr/sbin/oxenstored --pid-file /var/run/xenstored.pid $XENSTORED_ARGS ++ #echo -n Starting oxenstored... ++ stat_busy "Starting oxenstored" ++ /usr/sbin/oxenstored --pid-file /run/daemons/xenstored.pid $XENSTORED_ARGS + elif [ -x /usr/sbin/xenstored ] ; then +- echo -n Starting C xenstored... +- /usr/sbin/xenstored --pid-file /var/run/xenstored.pid $XENSTORED_ARGS ++ #echo -n Starting C xenstored... ++ stat_busy "Starting C xenstored" ++ /usr/sbin/xenstored --pid-file /run/daemons/xenstored.pid $XENSTORED_ARGS + else +- echo "No xenstored found" ++ #echo "No xenstored found" ++ stat_fail + exit 1 + fi + + # Wait for xenstored to actually come up, timing out after 30 seconds + while [ $time -lt $timeout ] && ! `xenstore-read -s / >/dev/null 2>&1` ; do +- echo -n . ++ #echo -n . + time=$(($time+1)) + sleep 1 + done +- echo ++ #echo + + # Exit if we timed out + if ! [ $time -lt $timeout ] ; then +- echo Could not start xenstored ++ #echo Could not start xenstored ++ stat_fail + exit 1 + fi + +- echo Setting domain 0 name... ++ #echo Setting domain 0 name... ++ stat_busy "Setting domain0 name" + xenstore-write "/local/domain/0/name" "Domain-0" + fi + +- echo Starting xenconsoled... ++ #echo Starting xenconsoled... ++ stat_busy "Starting xenconsoled" + test -z "$XENCONSOLED_TRACE" || XENCONSOLED_ARGS=" --log=$XENCONSOLED_TRACE" + xenconsoled --pid-file=$XENCONSOLED_PIDFILE $XENCONSOLED_ARGS + test -z "$XENBACKENDD_DEBUG" || XENBACKENDD_ARGS="-d" + test "`uname`" != "NetBSD" || xenbackendd $XENBACKENDD_ARGS +- echo Starting QEMU as disk backend for dom0 ++ #echo Starting QEMU as disk backend for dom0 ++ stat_busy "Starting QEMU as disk backend for dom0" + test -z "$QEMU_XEN" && QEMU_XEN=/usr/lib/xen/bin/qemu-system-i386 + $QEMU_XEN -xen-domid 0 -xen-attach -name dom0 -nographic -M xenpv -daemonize -monitor /dev/null ++ stat_done + } + do_stop () { +- echo Stopping xenconsoled ++ #echo Stopping xenconsoled ++ stat_busy "Stopping xenconsoled" + if read 2>/dev/null <$XENCONSOLED_PIDFILE pid; then + kill $pid + while kill -9 $pid >/dev/null 2>&1; do sleep 0.1; done + rm -f $XENCONSOLED_PIDFILE + fi ++ stat_done + +- echo WARNING: Not stopping xenstored, as it cannot be restarted. ++ #echo WARNING: Not stopping xenstored, as it cannot be restarted. + } + + case "$1" in +--- a/tools/hotplug/Linux/init.d/xend 2011-07-03 03:08:44.953747064 -0700 ++++ b/tools/hotplug/Linux/init.d/xend 2011-07-05 01:47:40.981951191 -0700 +@@ -18,6 +18,10 @@ + # Description: Starts and stops the Xen control daemon. + ### END INIT INFO + ++. /etc/rc.conf ++. /etc/rc.d/functions ++ ++ + shopt -s extglob + + # Wait for Xend to be up +@@ -37,23 +41,30 @@ + case "$1" in + start) + if [ -z "`ps -C xenconsoled -o pid=`" ]; then +- echo "xencommons should be started first." ++ printhl "xencommons should be started first." + exit 1 + fi + # mkdir shouldn't be needed as most distros have this already created. Default to using subsys. + # See docs/misc/distro_mapping.txt +- mkdir -p /var/lock +- if [ -d /var/lock/subsys ] ; then +- touch /var/lock/subsys/xend ++ if [ -d /run/lock/subsys ] ; then ++ touch /run/lock/subsys/xend + else +- touch /var/lock/xend ++ touch /run/lock/xend + fi ++ stat_busy "Starting xend" + xend start + await_daemons_up ++ stat_done ++ add_daemon xend + ;; ++ ++ + stop) ++ stat_busy "Stopping xend" + xend stop +- rm -f /var/lock/subsys/xend /var/lock/xend ++ rm -f /run/lock/xend /var/lock/xend ++ stat_done ++ rm_daemon xend + ;; + status) + xend status +@@ -62,8 +73,10 @@ + xend reload + ;; + restart|force-reload) ++ stat_busy "Restarting xend" + xend restart + await_daemons_up ++ stat_done + ;; + *) + # do not advertise unreasonable commands that there is no reason +--- a/tools/hotplug/Linux/init.d/xendomains 2011-07-03 03:08:44.953747064 -0700 ++++ b/tools/hotplug/Linux/init.d/xendomains 2011-07-05 13:46:36.208222760 -0700 +@@ -26,6 +26,9 @@ + # Description: Start / stop domains automatically when domain 0 + # boots / shuts down. + ### END INIT INFO ++. /etc/rc.conf ++. /etc/rc.d/functions ++ + + CMD=xm + $CMD list &> /dev/null +@@ -46,93 +49,52 @@ + exit 0 + fi + +-# See docs/misc/distro_mapping.txt +-if [ -d /var/lock/subsys ]; then +- LOCKFILE=/var/lock/subsys/xendomains +-else +- LOCKFILE=/var/lock/xendomains +-fi +- +-if [ -d /etc/sysconfig ]; then +- XENDOM_CONFIG=/etc/sysconfig/xendomains +-else +- XENDOM_CONFIG=/etc/default/xendomains +-fi ++LOCKFILE=/run/lock/xendomains ++XENDOM_CONFIG=/etc/default/xendomains + +-test -r $XENDOM_CONFIG || { echo "$XENDOM_CONFIG not existing"; ++test -r $XENDOM_CONFIG || { ++ printhl "$XENDOM_CONFIG not existing"; + if [ "$1" = "stop" ]; then exit 0; + else exit 6; fi; } + + . $XENDOM_CONFIG + +-# Use the SUSE rc_ init script functions; +-# emulate them on LSB, RH and other systems +-if test -e /etc/rc.status; then +- # SUSE rc script library +- . /etc/rc.status +-else +- _cmd=$1 +- declare -a _SMSG +- if test "${_cmd}" = "status"; then ++_cmd=$1 ++declare -a _SMSG ++if test "${_cmd}" = "status"; then + _SMSG=(running dead dead unused unknown) + _RC_UNUSED=3 +- else ++else + _SMSG=(done failed failed missed failed skipped unused failed failed) + _RC_UNUSED=6 +- fi +- if test -e /etc/init.d/functions; then +- # REDHAT +- . /etc/init.d/functions +- echo_rc() +- { +- #echo -n " [${_SMSG[${_RC_RV}]}] " +- if test ${_RC_RV} = 0; then +- success " [${_SMSG[${_RC_RV}]}] " +- else +- failure " [${_SMSG[${_RC_RV}]}] " +- fi +- } +- elif test -e /lib/lsb/init-functions; then +- # LSB +- . /lib/lsb/init-functions +- if alias log_success_msg >/dev/null 2>/dev/null; then +- echo_rc() +- { +- echo " [${_SMSG[${_RC_RV}]}] " +- } +- else +- echo_rc() +- { +- if test ${_RC_RV} = 0; then +- log_success_msg " [${_SMSG[${_RC_RV}]}] " +- else +- log_failure_msg " [${_SMSG[${_RC_RV}]}] " +- fi +- } +- fi +- else +- # emulate it +- echo_rc() +- { +- echo " [${_SMSG[${_RC_RV}]}] " +- } +- fi +- rc_reset() { _RC_RV=0; } +- rc_failed() +- { ++fi ++ ++ ++ ++echo_rc() { ++ echo ++ printhl "Return Status: ${_SMSG[${_RC_RV}]}" ++} ++ ++ ++rc_reset() { _RC_RV=0; } ++ ++ ++rc_failed() { + if test -z "$1"; then +- _RC_RV=1; ++ _RC_RV=1; + elif test "$1" != "0"; then +- _RC_RV=$1; +- fi ++ _RC_RV=$1; ++ fi + return ${_RC_RV} +- } +- rc_check() +- { ++} ++ ++rc_check() { + return rc_failed $? +- } +- rc_status() +- { ++} ++ ++ ++rc_status() { + rc_failed $? + if test "$1" = "-r"; then _RC_RV=0; shift; fi + if test "$1" = "-s"; then rc_failed 5; echo_rc; rc_failed 3; shift; fi +@@ -140,26 +102,24 @@ + if test "$1" = "-v"; then echo_rc; shift; fi + if test "$1" = "-r"; then _RC_RV=0; shift; fi + return ${_RC_RV} +- } +- rc_exit() { exit ${_RC_RV}; } +- rc_active() +- { ++} ++ ++ ++rc_exit() { exit ${_RC_RV}; } ++ ++ ++rc_active() { + if test -z "$RUNLEVEL"; then read RUNLEVEL REST < <(/sbin/runlevel); fi + if test -e /etc/init.d/S[0-9][0-9]${1}; then return 0; fi + return 1 +- } +-fi ++} + +-if ! which usleep >&/dev/null +-then +- usleep() +- { +- if [ -n "$1" ] +- then +- sleep $(( $1 / 1000000 )) +- fi +- } +-fi ++usleep() { ++ if [ -n "$1" ] ++ then ++ sleep $(( $1 / 1000000 )) ++ fi ++} + + # Reset status of this service + rc_reset +@@ -240,10 +200,12 @@ + start() + { + if [ -f $LOCKFILE ]; then +- echo -e "xendomains already running (lockfile exists)" ++ stat_busy "xendomains already running (lockfile exists)" ++ stat_fail + return; + fi + ++ printhl "Starting Xen Domains" + saved_domains=" " + if [ "$XENDOMAINS_RESTORE" = "true" ] && + contains_something "$XENDOMAINS_SAVE" +@@ -304,6 +266,7 @@ + fi + done + fi ++ add_daemon xendomains + } + + all_zombies() +@@ -357,7 +320,7 @@ + if test "$XENDOMAINS_AUTO_ONLY" = "true"; then + rdnames + fi +- echo -n "Shutting down Xen domains:" ++ printhl "Shutting down Xen domains" + name=;id= + while read LN; do + parseln "$LN" || continue +@@ -470,6 +433,7 @@ + rm -f $LOCKFILE + + exec 2>&3 ++ rm_daemon xendomains + } + + check_domain_up() +--- a/tools/hotplug/Linux/init.d/xen-watchdog 2011-07-03 03:08:44.957080397 -0700 ++++ b/tools/hotplug/Linux/init.d/xen-watchdog 2011-07-05 13:20:22.515289867 -0700 +@@ -17,49 +17,32 @@ + ### END INIT INFO + # + ++. /etc/rc.conf ++. /etc/rc.d/functions ++ + DAEMON=/usr/sbin/xenwatchdogd + base=$(basename $DAEMON) ++initname="xen-watchdog" + +-# Source function library. +-if [ -e /etc/init.d/functions ] ; then +- . /etc/init.d/functions +-elif [ -e /lib/lsb/init-functions ] ; then +- . /lib/lsb/init-functions +- success () { +- log_success_msg $* +- } +- failure () { +- log_failure_msg $* +- } +-else +- success () { +- echo $* +- } +- failure () { +- echo $* +- } +-fi + + start() { + local r +- echo -n $"Starting domain watchdog daemon: " ++ stat_busy "Starting domain watchdog daemon" + + $DAEMON 30 15 + r=$? +- [ "$r" -eq 0 ] && success $"$base startup" || failure $"$base startup" +- echo ++ [ "$r" -eq 0 ] && stat_done ; add_daemon $initname || stat_fail + + return $r + } + + stop() { + local r +- echo -n $"Stopping domain watchdog daemon: " ++ stat_busy "Stopping domain watchdog daemon" + + killall -USR1 $base 2>/dev/null + r=$? +- [ "$r" -eq 0 ] && success $"$base stop" || failure $"$base stop" +- echo ++ [ "$r" -eq 0 ] && stat_done ; rm_daemon $initname || stat_fail + + return $r + } diff --git a/kernels/xen/dom0_xz_decompression.patch b/kernels/xen/dom0_xz_decompression.patch deleted file mode 100755 index 277ebcfd2..000000000 --- a/kernels/xen/dom0_xz_decompression.patch +++ /dev/null @@ -1,3528 +0,0 @@ -diff --git a/xen/common/Makefile b/xen/common/Makefile ---- a/xen/common/Makefile -+++ b/xen/common/Makefile -@@ -43,7 +43,7 @@ - obj-y += rbtree.o - obj-y += lzo.o - --obj-$(CONFIG_X86) += decompress.o bunzip2.o unlzma.o unlzo.o -+obj-$(CONFIG_X86) += decompress.o bunzip2.o unxz.o unlzma.o unlzo.o - - obj-$(perfc) += perfc.o - obj-$(crash_debug) += gdbstub.o -diff --git a/xen/common/decompress.c b/xen/common/decompress.c ---- a/xen/common/decompress.c -+++ b/xen/common/decompress.c -@@ -20,6 +20,9 @@ - if ( len >= 3 && !memcmp(inbuf, "\x42\x5a\x68", 3) ) - return bunzip2(inbuf, len, NULL, NULL, outbuf, NULL, error); - -+ if ( len >= 6 && !memcmp(inbuf, "\3757zXZ", 6) ) -+ return unxz(inbuf, len, NULL, NULL, outbuf, NULL, error); -+ - if ( len >= 2 && !memcmp(inbuf, "\135\000", 2) ) - return unlzma(inbuf, len, NULL, NULL, outbuf, NULL, error); - -diff --git a/xen/common/decompress.h b/xen/common/decompress.h ---- a/xen/common/decompress.h -+++ b/xen/common/decompress.h -@@ -8,6 +8,7 @@ - - #define STATIC - #define INIT __init -+#define INITDATA __initdata - - static void(*__initdata error)(const char *); - #define set_error_fn(x) error = x; -diff --git a/xen/common/unxz.c b/xen/common/unxz.c -new file mode 100644 ---- /dev/null -+++ b/xen/common/unxz.c -@@ -0,0 +1,306 @@ -+/* -+ * Wrapper for decompressing XZ-compressed kernel, initramfs, and initrd -+ * -+ * Author: Lasse Collin -+ * -+ * This file has been put into the public domain. -+ * You can do whatever you want with this file. -+ */ -+ -+/* -+ * Important notes about in-place decompression -+ * -+ * At least on x86, the kernel is decompressed in place: the compressed data -+ * is placed to the end of the output buffer, and the decompressor overwrites -+ * most of the compressed data. There must be enough safety margin to -+ * guarantee that the write position is always behind the read position. -+ * -+ * The safety margin for XZ with LZMA2 or BCJ+LZMA2 is calculated below. -+ * Note that the margin with XZ is bigger than with Deflate (gzip)! -+ * -+ * The worst case for in-place decompression is that the beginning of -+ * the file is compressed extremely well, and the rest of the file is -+ * uncompressible. Thus, we must look for worst-case expansion when the -+ * compressor is encoding uncompressible data. -+ * -+ * The structure of the .xz file in case of a compresed kernel is as follows. -+ * Sizes (as bytes) of the fields are in parenthesis. -+ * -+ * Stream Header (12) -+ * Block Header: -+ * Block Header (8-12) -+ * Compressed Data (N) -+ * Block Padding (0-3) -+ * CRC32 (4) -+ * Index (8-20) -+ * Stream Footer (12) -+ * -+ * Normally there is exactly one Block, but let's assume that there are -+ * 2-4 Blocks just in case. Because Stream Header and also Block Header -+ * of the first Block don't make the decompressor produce any uncompressed -+ * data, we can ignore them from our calculations. Block Headers of possible -+ * additional Blocks have to be taken into account still. With these -+ * assumptions, it is safe to assume that the total header overhead is -+ * less than 128 bytes. -+ * -+ * Compressed Data contains LZMA2 or BCJ+LZMA2 encoded data. Since BCJ -+ * doesn't change the size of the data, it is enough to calculate the -+ * safety margin for LZMA2. -+ * -+ * LZMA2 stores the data in chunks. Each chunk has a header whose size is -+ * a maximum of 6 bytes, but to get round 2^n numbers, let's assume that -+ * the maximum chunk header size is 8 bytes. After the chunk header, there -+ * may be up to 64 KiB of actual payload in the chunk. Often the payload is -+ * quite a bit smaller though; to be safe, let's assume that an average -+ * chunk has only 32 KiB of payload. -+ * -+ * The maximum uncompressed size of the payload is 2 MiB. The minimum -+ * uncompressed size of the payload is in practice never less than the -+ * payload size itself. The LZMA2 format would allow uncompressed size -+ * to be less than the payload size, but no sane compressor creates such -+ * files. LZMA2 supports storing uncompressible data in uncompressed form, -+ * so there's never a need to create payloads whose uncompressed size is -+ * smaller than the compressed size. -+ * -+ * The assumption, that the uncompressed size of the payload is never -+ * smaller than the payload itself, is valid only when talking about -+ * the payload as a whole. It is possible that the payload has parts where -+ * the decompressor consumes more input than it produces output. Calculating -+ * the worst case for this would be tricky. Instead of trying to do that, -+ * let's simply make sure that the decompressor never overwrites any bytes -+ * of the payload which it is currently reading. -+ * -+ * Now we have enough information to calculate the safety margin. We need -+ * - 128 bytes for the .xz file format headers; -+ * - 8 bytes per every 32 KiB of uncompressed size (one LZMA2 chunk header -+ * per chunk, each chunk having average payload size of 32 KiB); and -+ * - 64 KiB (biggest possible LZMA2 chunk payload size) to make sure that -+ * the decompressor never overwrites anything from the LZMA2 chunk -+ * payload it is currently reading. -+ * -+ * We get the following formula: -+ * -+ * safety_margin = 128 + uncompressed_size * 8 / 32768 + 65536 -+ * = 128 + (uncompressed_size >> 12) + 65536 -+ * -+ * For comparision, according to arch/x86/boot/compressed/misc.c, the -+ * equivalent formula for Deflate is this: -+ * -+ * safety_margin = 18 + (uncompressed_size >> 12) + 32768 -+ * -+ * Thus, when updating Deflate-only in-place kernel decompressor to -+ * support XZ, the fixed overhead has to be increased from 18+32768 bytes -+ * to 128+65536 bytes. -+ */ -+ -+#include "decompress.h" -+ -+#define XZ_EXTERN STATIC -+ -+/* -+ * For boot time use, we enable only the BCJ filter of the current -+ * architecture or none if no BCJ filter is available for the architecture. -+ */ -+#ifdef CONFIG_X86 -+# define XZ_DEC_X86 -+#endif -+#ifdef CONFIG_PPC -+# define XZ_DEC_POWERPC -+#endif -+#ifdef CONFIG_ARM -+# define XZ_DEC_ARM -+#endif -+#ifdef CONFIG_IA64 -+# define XZ_DEC_IA64 -+#endif -+#ifdef CONFIG_SPARC -+# define XZ_DEC_SPARC -+#endif -+ -+/* -+ * This will get the basic headers so that memeq() and others -+ * can be defined. -+ */ -+#include "xz/private.h" -+ -+/* -+ * memeq and memzero are not used much and any remotely sane implementation -+ * is fast enough. memcpy/memmove speed matters in multi-call mode, but -+ * the kernel image is decompressed in single-call mode, in which only -+ * memcpy speed can matter and only if there is a lot of uncompressible data -+ * (LZMA2 stores uncompressible chunks in uncompressed form). Thus, the -+ * functions below should just be kept small; it's probably not worth -+ * optimizing for speed. -+ */ -+ -+#ifndef memeq -+#define memeq(p1, p2, sz) (memcmp(p1, p2, sz) == 0) -+#endif -+ -+#ifndef memzero -+#define memzero(p, sz) memset(p, 0, sz) -+#endif -+ -+#include "xz/crc32.c" -+#include "xz/dec_stream.c" -+#include "xz/dec_lzma2.c" -+#include "xz/dec_bcj.c" -+ -+/* Size of the input and output buffers in multi-call mode */ -+#define XZ_IOBUF_SIZE 4096 -+ -+/* -+ * This function implements the API defined in . -+ * -+ * This wrapper will automatically choose single-call or multi-call mode -+ * of the native XZ decoder API. The single-call mode can be used only when -+ * both input and output buffers are available as a single chunk, i.e. when -+ * fill() and flush() won't be used. -+ */ -+STATIC int INIT unxz(unsigned char *in, unsigned int in_size, -+ int (*fill)(void *dest, unsigned int size), -+ int (*flush)(void *src, unsigned int size), -+ unsigned char *out, unsigned int *in_used, -+ void (*error_fn)(const char *x)) -+{ -+ struct xz_buf b; -+ struct xz_dec *s; -+ enum xz_ret ret; -+ bool_t must_free_in = false; -+ -+ set_error_fn(error_fn); -+ -+ xz_crc32_init(); -+ -+ if (in_used != NULL) -+ *in_used = 0; -+ -+ if (fill == NULL && flush == NULL) -+ s = xz_dec_init(XZ_SINGLE, 0); -+ else -+ s = xz_dec_init(XZ_DYNALLOC, (uint32_t)-1); -+ -+ if (s == NULL) -+ goto error_alloc_state; -+ -+ if (flush == NULL) { -+ b.out = out; -+ b.out_size = (size_t)-1; -+ } else { -+ b.out_size = XZ_IOBUF_SIZE; -+ b.out = malloc(XZ_IOBUF_SIZE); -+ if (b.out == NULL) -+ goto error_alloc_out; -+ } -+ -+ if (in == NULL) { -+ must_free_in = true; -+ in = malloc(XZ_IOBUF_SIZE); -+ if (in == NULL) -+ goto error_alloc_in; -+ } -+ -+ b.in = in; -+ b.in_pos = 0; -+ b.in_size = in_size; -+ b.out_pos = 0; -+ -+ if (fill == NULL && flush == NULL) { -+ ret = xz_dec_run(s, &b); -+ } else { -+ do { -+ if (b.in_pos == b.in_size && fill != NULL) { -+ if (in_used != NULL) -+ *in_used += b.in_pos; -+ -+ b.in_pos = 0; -+ -+ in_size = fill(in, XZ_IOBUF_SIZE); -+ if (in_size < 0) { -+ /* -+ * This isn't an optimal error code -+ * but it probably isn't worth making -+ * a new one either. -+ */ -+ ret = XZ_BUF_ERROR; -+ break; -+ } -+ -+ b.in_size = in_size; -+ } -+ -+ ret = xz_dec_run(s, &b); -+ -+ if (flush != NULL && (b.out_pos == b.out_size -+ || (ret != XZ_OK && b.out_pos > 0))) { -+ /* -+ * Setting ret here may hide an error -+ * returned by xz_dec_run(), but probably -+ * it's not too bad. -+ */ -+ if (flush(b.out, b.out_pos) != (int)b.out_pos) -+ ret = XZ_BUF_ERROR; -+ -+ b.out_pos = 0; -+ } -+ } while (ret == XZ_OK); -+ -+ if (must_free_in) -+ free(in); -+ -+ if (flush != NULL) -+ free(b.out); -+ } -+ -+ if (in_used != NULL) -+ *in_used += b.in_pos; -+ -+ xz_dec_end(s); -+ -+ switch (ret) { -+ case XZ_STREAM_END: -+ return 0; -+ -+ case XZ_MEM_ERROR: -+ /* This can occur only in multi-call mode. */ -+ error("XZ decompressor ran out of memory"); -+ break; -+ -+ case XZ_FORMAT_ERROR: -+ error("Input is not in the XZ format (wrong magic bytes)"); -+ break; -+ -+ case XZ_OPTIONS_ERROR: -+ error("Input was encoded with settings that are not " -+ "supported by this XZ decoder"); -+ break; -+ -+ case XZ_DATA_ERROR: -+ case XZ_BUF_ERROR: -+ error("XZ-compressed data is corrupt"); -+ break; -+ -+ default: -+ error("Bug in the XZ decompressor"); -+ break; -+ } -+ -+ return -1; -+ -+error_alloc_in: -+ if (flush != NULL) -+ free(b.out); -+ -+error_alloc_out: -+ xz_dec_end(s); -+ -+error_alloc_state: -+ error("XZ decompressor ran out of memory"); -+ return -1; -+} -+ -+/* -+ * This macro is used by architecture-specific files to decompress -+ * the kernel image. -+ */ -+#define decompress unxz -diff --git a/xen/common/xz/crc32.c b/xen/common/xz/crc32.c -new file mode 100644 ---- /dev/null -+++ b/xen/common/xz/crc32.c -@@ -0,0 +1,51 @@ -+/* -+ * CRC32 using the polynomial from IEEE-802.3 -+ * -+ * Authors: Lasse Collin -+ * Igor Pavlov -+ * -+ * This file has been put into the public domain. -+ * You can do whatever you want with this file. -+ */ -+ -+/* -+ * This is not the fastest implementation, but it is pretty compact. -+ * The fastest versions of xz_crc32() on modern CPUs without hardware -+ * accelerated CRC instruction are 3-5 times as fast as this version, -+ * but they are bigger and use more memory for the lookup table. -+ */ -+ -+#include "private.h" -+ -+XZ_EXTERN uint32_t INITDATA xz_crc32_table[256]; -+ -+XZ_EXTERN void INIT xz_crc32_init(void) -+{ -+ const uint32_t poly = 0xEDB88320; -+ -+ uint32_t i; -+ uint32_t j; -+ uint32_t r; -+ -+ for (i = 0; i < 256; ++i) { -+ r = i; -+ for (j = 0; j < 8; ++j) -+ r = (r >> 1) ^ (poly & ~((r & 1) - 1)); -+ -+ xz_crc32_table[i] = r; -+ } -+ -+ return; -+} -+ -+XZ_EXTERN uint32_t INIT xz_crc32(const uint8_t *buf, size_t size, uint32_t crc) -+{ -+ crc = ~crc; -+ -+ while (size != 0) { -+ crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); -+ --size; -+ } -+ -+ return ~crc; -+} -diff --git a/xen/common/xz/dec_bcj.c b/xen/common/xz/dec_bcj.c -new file mode 100644 ---- /dev/null -+++ b/xen/common/xz/dec_bcj.c -@@ -0,0 +1,562 @@ -+/* -+ * Branch/Call/Jump (BCJ) filter decoders -+ * -+ * Authors: Lasse Collin -+ * Igor Pavlov -+ * -+ * This file has been put into the public domain. -+ * You can do whatever you want with this file. -+ */ -+ -+#include "private.h" -+ -+/* -+ * The rest of the file is inside this ifdef. It makes things a little more -+ * convenient when building without support for any BCJ filters. -+ */ -+#ifdef XZ_DEC_BCJ -+ -+struct xz_dec_bcj { -+ /* Type of the BCJ filter being used */ -+ enum { -+ BCJ_X86 = 4, /* x86 or x86-64 */ -+ BCJ_POWERPC = 5, /* Big endian only */ -+ BCJ_IA64 = 6, /* Big or little endian */ -+ BCJ_ARM = 7, /* Little endian only */ -+ BCJ_ARMTHUMB = 8, /* Little endian only */ -+ BCJ_SPARC = 9 /* Big or little endian */ -+ } type; -+ -+ /* -+ * Return value of the next filter in the chain. We need to preserve -+ * this information across calls, because we must not call the next -+ * filter anymore once it has returned XZ_STREAM_END. -+ */ -+ enum xz_ret ret; -+ -+ /* True if we are operating in single-call mode. */ -+ bool_t single_call; -+ -+ /* -+ * Absolute position relative to the beginning of the uncompressed -+ * data (in a single .xz Block). We care only about the lowest 32 -+ * bits so this doesn't need to be uint64_t even with big files. -+ */ -+ uint32_t pos; -+ -+ /* x86 filter state */ -+ uint32_t x86_prev_mask; -+ -+ /* Temporary space to hold the variables from struct xz_buf */ -+ uint8_t *out; -+ size_t out_pos; -+ size_t out_size; -+ -+ struct { -+ /* Amount of already filtered data in the beginning of buf */ -+ size_t filtered; -+ -+ /* Total amount of data currently stored in buf */ -+ size_t size; -+ -+ /* -+ * Buffer to hold a mix of filtered and unfiltered data. This -+ * needs to be big enough to hold Alignment + 2 * Look-ahead: -+ * -+ * Type Alignment Look-ahead -+ * x86 1 4 -+ * PowerPC 4 0 -+ * IA-64 16 0 -+ * ARM 4 0 -+ * ARM-Thumb 2 2 -+ * SPARC 4 0 -+ */ -+ uint8_t buf[16]; -+ } temp; -+}; -+ -+#ifdef XZ_DEC_X86 -+/* -+ * This is used to test the most significant byte of a memory address -+ * in an x86 instruction. -+ */ -+static inline int INIT bcj_x86_test_msbyte(uint8_t b) -+{ -+ return b == 0x00 || b == 0xFF; -+} -+ -+static size_t INIT bcj_x86(struct xz_dec_bcj *s, uint8_t *buf, size_t size) -+{ -+ static /*const*/ bool_t INITDATA mask_to_allowed_status[8] -+ = { true, true, true, false, true, false, false, false }; -+ -+ static /*const*/ uint8_t INITDATA mask_to_bit_num[8] -+ = { 0, 1, 2, 2, 3, 3, 3, 3 }; -+ -+ size_t i; -+ size_t prev_pos = (size_t)-1; -+ uint32_t prev_mask = s->x86_prev_mask; -+ uint32_t src; -+ uint32_t dest; -+ uint32_t j; -+ uint8_t b; -+ -+ if (size <= 4) -+ return 0; -+ -+ size -= 4; -+ for (i = 0; i < size; ++i) { -+ if ((buf[i] & 0xFE) != 0xE8) -+ continue; -+ -+ prev_pos = i - prev_pos; -+ if (prev_pos > 3) { -+ prev_mask = 0; -+ } else { -+ prev_mask = (prev_mask << (prev_pos - 1)) & 7; -+ if (prev_mask != 0) { -+ b = buf[i + 4 - mask_to_bit_num[prev_mask]]; -+ if (!mask_to_allowed_status[prev_mask] -+ || bcj_x86_test_msbyte(b)) { -+ prev_pos = i; -+ prev_mask = (prev_mask << 1) | 1; -+ continue; -+ } -+ } -+ } -+ -+ prev_pos = i; -+ -+ if (bcj_x86_test_msbyte(buf[i + 4])) { -+ src = get_unaligned_le32(buf + i + 1); -+ while (true) { -+ dest = src - (s->pos + (uint32_t)i + 5); -+ if (prev_mask == 0) -+ break; -+ -+ j = mask_to_bit_num[prev_mask] * 8; -+ b = (uint8_t)(dest >> (24 - j)); -+ if (!bcj_x86_test_msbyte(b)) -+ break; -+ -+ src = dest ^ (((uint32_t)1 << (32 - j)) - 1); -+ } -+ -+ dest &= 0x01FFFFFF; -+ dest |= (uint32_t)0 - (dest & 0x01000000); -+ put_unaligned_le32(dest, buf + i + 1); -+ i += 4; -+ } else { -+ prev_mask = (prev_mask << 1) | 1; -+ } -+ } -+ -+ prev_pos = i - prev_pos; -+ s->x86_prev_mask = prev_pos > 3 ? 0 : prev_mask << (prev_pos - 1); -+ return i; -+} -+#endif -+ -+#ifdef XZ_DEC_POWERPC -+static size_t INIT bcj_powerpc(struct xz_dec_bcj *s, uint8_t *buf, size_t size) -+{ -+ size_t i; -+ uint32_t instr; -+ -+ for (i = 0; i + 4 <= size; i += 4) { -+ instr = get_unaligned_be32(buf + i); -+ if ((instr & 0xFC000003) == 0x48000001) { -+ instr &= 0x03FFFFFC; -+ instr -= s->pos + (uint32_t)i; -+ instr &= 0x03FFFFFC; -+ instr |= 0x48000001; -+ put_unaligned_be32(instr, buf + i); -+ } -+ } -+ -+ return i; -+} -+#endif -+ -+#ifdef XZ_DEC_IA64 -+static size_t INIT bcj_ia64(struct xz_dec_bcj *s, uint8_t *buf, size_t size) -+{ -+ static const uint8_t branch_table[32] = { -+ 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, -+ 4, 4, 6, 6, 0, 0, 7, 7, -+ 4, 4, 0, 0, 4, 4, 0, 0 -+ }; -+ -+ /* -+ * The local variables take a little bit stack space, but it's less -+ * than what LZMA2 decoder takes, so it doesn't make sense to reduce -+ * stack usage here without doing that for the LZMA2 decoder too. -+ */ -+ -+ /* Loop counters */ -+ size_t i; -+ size_t j; -+ -+ /* Instruction slot (0, 1, or 2) in the 128-bit instruction word */ -+ uint32_t slot; -+ -+ /* Bitwise offset of the instruction indicated by slot */ -+ uint32_t bit_pos; -+ -+ /* bit_pos split into byte and bit parts */ -+ uint32_t byte_pos; -+ uint32_t bit_res; -+ -+ /* Address part of an instruction */ -+ uint32_t addr; -+ -+ /* Mask used to detect which instructions to convert */ -+ uint32_t mask; -+ -+ /* 41-bit instruction stored somewhere in the lowest 48 bits */ -+ uint64_t instr; -+ -+ /* Instruction normalized with bit_res for easier manipulation */ -+ uint64_t norm; -+ -+ for (i = 0; i + 16 <= size; i += 16) { -+ mask = branch_table[buf[i] & 0x1F]; -+ for (slot = 0, bit_pos = 5; slot < 3; ++slot, bit_pos += 41) { -+ if (((mask >> slot) & 1) == 0) -+ continue; -+ -+ byte_pos = bit_pos >> 3; -+ bit_res = bit_pos & 7; -+ instr = 0; -+ for (j = 0; j < 6; ++j) -+ instr |= (uint64_t)(buf[i + j + byte_pos]) -+ << (8 * j); -+ -+ norm = instr >> bit_res; -+ -+ if (((norm >> 37) & 0x0F) == 0x05 -+ && ((norm >> 9) & 0x07) == 0) { -+ addr = (norm >> 13) & 0x0FFFFF; -+ addr |= ((uint32_t)(norm >> 36) & 1) << 20; -+ addr <<= 4; -+ addr -= s->pos + (uint32_t)i; -+ addr >>= 4; -+ -+ norm &= ~((uint64_t)0x8FFFFF << 13); -+ norm |= (uint64_t)(addr & 0x0FFFFF) << 13; -+ norm |= (uint64_t)(addr & 0x100000) -+ << (36 - 20); -+ -+ instr &= (1 << bit_res) - 1; -+ instr |= norm << bit_res; -+ -+ for (j = 0; j < 6; j++) -+ buf[i + j + byte_pos] -+ = (uint8_t)(instr >> (8 * j)); -+ } -+ } -+ } -+ -+ return i; -+} -+#endif -+ -+#ifdef XZ_DEC_ARM -+static size_t INIT bcj_arm(struct xz_dec_bcj *s, uint8_t *buf, size_t size) -+{ -+ size_t i; -+ uint32_t addr; -+ -+ for (i = 0; i + 4 <= size; i += 4) { -+ if (buf[i + 3] == 0xEB) { -+ addr = (uint32_t)buf[i] | ((uint32_t)buf[i + 1] << 8) -+ | ((uint32_t)buf[i + 2] << 16); -+ addr <<= 2; -+ addr -= s->pos + (uint32_t)i + 8; -+ addr >>= 2; -+ buf[i] = (uint8_t)addr; -+ buf[i + 1] = (uint8_t)(addr >> 8); -+ buf[i + 2] = (uint8_t)(addr >> 16); -+ } -+ } -+ -+ return i; -+} -+#endif -+ -+#ifdef XZ_DEC_ARMTHUMB -+static size_t INIT bcj_armthumb(struct xz_dec_bcj *s, uint8_t *buf, size_t size) -+{ -+ size_t i; -+ uint32_t addr; -+ -+ for (i = 0; i + 4 <= size; i += 2) { -+ if ((buf[i + 1] & 0xF8) == 0xF0 -+ && (buf[i + 3] & 0xF8) == 0xF8) { -+ addr = (((uint32_t)buf[i + 1] & 0x07) << 19) -+ | ((uint32_t)buf[i] << 11) -+ | (((uint32_t)buf[i + 3] & 0x07) << 8) -+ | (uint32_t)buf[i + 2]; -+ addr <<= 1; -+ addr -= s->pos + (uint32_t)i + 4; -+ addr >>= 1; -+ buf[i + 1] = (uint8_t)(0xF0 | ((addr >> 19) & 0x07)); -+ buf[i] = (uint8_t)(addr >> 11); -+ buf[i + 3] = (uint8_t)(0xF8 | ((addr >> 8) & 0x07)); -+ buf[i + 2] = (uint8_t)addr; -+ i += 2; -+ } -+ } -+ -+ return i; -+} -+#endif -+ -+#ifdef XZ_DEC_SPARC -+static size_t INIT bcj_sparc(struct xz_dec_bcj *s, uint8_t *buf, size_t size) -+{ -+ size_t i; -+ uint32_t instr; -+ -+ for (i = 0; i + 4 <= size; i += 4) { -+ instr = get_unaligned_be32(buf + i); -+ if ((instr >> 22) == 0x100 || (instr >> 22) == 0x1FF) { -+ instr <<= 2; -+ instr -= s->pos + (uint32_t)i; -+ instr >>= 2; -+ instr = ((uint32_t)0x40000000 - (instr & 0x400000)) -+ | 0x40000000 | (instr & 0x3FFFFF); -+ put_unaligned_be32(instr, buf + i); -+ } -+ } -+ -+ return i; -+} -+#endif -+ -+/* -+ * Apply the selected BCJ filter. Update *pos and s->pos to match the amount -+ * of data that got filtered. -+ * -+ * NOTE: This is implemented as a switch statement to avoid using function -+ * pointers, which could be problematic in the kernel boot code, which must -+ * avoid pointers to static data (at least on x86). -+ */ -+static void INIT bcj_apply(struct xz_dec_bcj *s, -+ uint8_t *buf, size_t *pos, size_t size) -+{ -+ size_t filtered; -+ -+ buf += *pos; -+ size -= *pos; -+ -+ switch (s->type) { -+#ifdef XZ_DEC_X86 -+ case BCJ_X86: -+ filtered = bcj_x86(s, buf, size); -+ break; -+#endif -+#ifdef XZ_DEC_POWERPC -+ case BCJ_POWERPC: -+ filtered = bcj_powerpc(s, buf, size); -+ break; -+#endif -+#ifdef XZ_DEC_IA64 -+ case BCJ_IA64: -+ filtered = bcj_ia64(s, buf, size); -+ break; -+#endif -+#ifdef XZ_DEC_ARM -+ case BCJ_ARM: -+ filtered = bcj_arm(s, buf, size); -+ break; -+#endif -+#ifdef XZ_DEC_ARMTHUMB -+ case BCJ_ARMTHUMB: -+ filtered = bcj_armthumb(s, buf, size); -+ break; -+#endif -+#ifdef XZ_DEC_SPARC -+ case BCJ_SPARC: -+ filtered = bcj_sparc(s, buf, size); -+ break; -+#endif -+ default: -+ /* Never reached but silence compiler warnings. */ -+ filtered = 0; -+ break; -+ } -+ -+ *pos += filtered; -+ s->pos += filtered; -+} -+ -+/* -+ * Flush pending filtered data from temp to the output buffer. -+ * Move the remaining mixture of possibly filtered and unfiltered -+ * data to the beginning of temp. -+ */ -+static void INIT bcj_flush(struct xz_dec_bcj *s, struct xz_buf *b) -+{ -+ size_t copy_size; -+ -+ copy_size = min_t(size_t, s->temp.filtered, b->out_size - b->out_pos); -+ memcpy(b->out + b->out_pos, s->temp.buf, copy_size); -+ b->out_pos += copy_size; -+ -+ s->temp.filtered -= copy_size; -+ s->temp.size -= copy_size; -+ memmove(s->temp.buf, s->temp.buf + copy_size, s->temp.size); -+} -+ -+/* -+ * The BCJ filter functions are primitive in sense that they process the -+ * data in chunks of 1-16 bytes. To hide this issue, this function does -+ * some buffering. -+ */ -+XZ_EXTERN enum xz_ret INIT xz_dec_bcj_run(struct xz_dec_bcj *s, -+ struct xz_dec_lzma2 *lzma2, -+ struct xz_buf *b) -+{ -+ size_t out_start; -+ -+ /* -+ * Flush pending already filtered data to the output buffer. Return -+ * immediatelly if we couldn't flush everything, or if the next -+ * filter in the chain had already returned XZ_STREAM_END. -+ */ -+ if (s->temp.filtered > 0) { -+ bcj_flush(s, b); -+ if (s->temp.filtered > 0) -+ return XZ_OK; -+ -+ if (s->ret == XZ_STREAM_END) -+ return XZ_STREAM_END; -+ } -+ -+ /* -+ * If we have more output space than what is currently pending in -+ * temp, copy the unfiltered data from temp to the output buffer -+ * and try to fill the output buffer by decoding more data from the -+ * next filter in the chain. Apply the BCJ filter on the new data -+ * in the output buffer. If everything cannot be filtered, copy it -+ * to temp and rewind the output buffer position accordingly. -+ */ -+ if (s->temp.size < b->out_size - b->out_pos) { -+ out_start = b->out_pos; -+ memcpy(b->out + b->out_pos, s->temp.buf, s->temp.size); -+ b->out_pos += s->temp.size; -+ -+ s->ret = xz_dec_lzma2_run(lzma2, b); -+ if (s->ret != XZ_STREAM_END -+ && (s->ret != XZ_OK || s->single_call)) -+ return s->ret; -+ -+ bcj_apply(s, b->out, &out_start, b->out_pos); -+ -+ /* -+ * As an exception, if the next filter returned XZ_STREAM_END, -+ * we can do that too, since the last few bytes that remain -+ * unfiltered are meant to remain unfiltered. -+ */ -+ if (s->ret == XZ_STREAM_END) -+ return XZ_STREAM_END; -+ -+ s->temp.size = b->out_pos - out_start; -+ b->out_pos -= s->temp.size; -+ memcpy(s->temp.buf, b->out + b->out_pos, s->temp.size); -+ } -+ -+ /* -+ * If we have unfiltered data in temp, try to fill by decoding more -+ * data from the next filter. Apply the BCJ filter on temp. Then we -+ * hopefully can fill the actual output buffer by copying filtered -+ * data from temp. A mix of filtered and unfiltered data may be left -+ * in temp; it will be taken care on the next call to this function. -+ */ -+ if (s->temp.size > 0) { -+ /* Make b->out{,_pos,_size} temporarily point to s->temp. */ -+ s->out = b->out; -+ s->out_pos = b->out_pos; -+ s->out_size = b->out_size; -+ b->out = s->temp.buf; -+ b->out_pos = s->temp.size; -+ b->out_size = sizeof(s->temp.buf); -+ -+ s->ret = xz_dec_lzma2_run(lzma2, b); -+ -+ s->temp.size = b->out_pos; -+ b->out = s->out; -+ b->out_pos = s->out_pos; -+ b->out_size = s->out_size; -+ -+ if (s->ret != XZ_OK && s->ret != XZ_STREAM_END) -+ return s->ret; -+ -+ bcj_apply(s, s->temp.buf, &s->temp.filtered, s->temp.size); -+ -+ /* -+ * If the next filter returned XZ_STREAM_END, we mark that -+ * everything is filtered, since the last unfiltered bytes -+ * of the stream are meant to be left as is. -+ */ -+ if (s->ret == XZ_STREAM_END) -+ s->temp.filtered = s->temp.size; -+ -+ bcj_flush(s, b); -+ if (s->temp.filtered > 0) -+ return XZ_OK; -+ } -+ -+ return s->ret; -+} -+ -+XZ_EXTERN struct xz_dec_bcj *INIT xz_dec_bcj_create(bool_t single_call) -+{ -+ struct xz_dec_bcj *s = malloc(sizeof(*s)); -+ if (s != NULL) -+ s->single_call = single_call; -+ -+ return s; -+} -+ -+XZ_EXTERN enum xz_ret INIT xz_dec_bcj_reset(struct xz_dec_bcj *s, uint8_t id) -+{ -+ switch (id) { -+#ifdef XZ_DEC_X86 -+ case BCJ_X86: -+#endif -+#ifdef XZ_DEC_POWERPC -+ case BCJ_POWERPC: -+#endif -+#ifdef XZ_DEC_IA64 -+ case BCJ_IA64: -+#endif -+#ifdef XZ_DEC_ARM -+ case BCJ_ARM: -+#endif -+#ifdef XZ_DEC_ARMTHUMB -+ case BCJ_ARMTHUMB: -+#endif -+#ifdef XZ_DEC_SPARC -+ case BCJ_SPARC: -+#endif -+ break; -+ -+ default: -+ /* Unsupported Filter ID */ -+ return XZ_OPTIONS_ERROR; -+ } -+ -+ s->type = id; -+ s->ret = XZ_OK; -+ s->pos = 0; -+ s->x86_prev_mask = 0; -+ s->temp.filtered = 0; -+ s->temp.size = 0; -+ -+ return XZ_OK; -+} -+ -+#endif -diff --git a/xen/common/xz/dec_lzma2.c b/xen/common/xz/dec_lzma2.c -new file mode 100644 ---- /dev/null -+++ b/xen/common/xz/dec_lzma2.c -@@ -0,0 +1,1171 @@ -+/* -+ * LZMA2 decoder -+ * -+ * Authors: Lasse Collin -+ * Igor Pavlov -+ * -+ * This file has been put into the public domain. -+ * You can do whatever you want with this file. -+ */ -+ -+#include "private.h" -+#include "lzma2.h" -+ -+/* -+ * Range decoder initialization eats the first five bytes of each LZMA chunk. -+ */ -+#define RC_INIT_BYTES 5 -+ -+/* -+ * Minimum number of usable input buffer to safely decode one LZMA symbol. -+ * The worst case is that we decode 22 bits using probabilities and 26 -+ * direct bits. This may decode at maximum of 20 bytes of input. However, -+ * lzma_main() does an extra normalization before returning, thus we -+ * need to put 21 here. -+ */ -+#define LZMA_IN_REQUIRED 21 -+ -+/* -+ * Dictionary (history buffer) -+ * -+ * These are always true: -+ * start <= pos <= full <= end -+ * pos <= limit <= end -+ * -+ * In multi-call mode, also these are true: -+ * end == size -+ * size <= size_max -+ * allocated <= size -+ * -+ * Most of these variables are size_t to support single-call mode, -+ * in which the dictionary variables address the actual output -+ * buffer directly. -+ */ -+struct dictionary { -+ /* Beginning of the history buffer */ -+ uint8_t *buf; -+ -+ /* Old position in buf (before decoding more data) */ -+ size_t start; -+ -+ /* Position in buf */ -+ size_t pos; -+ -+ /* -+ * How full dictionary is. This is used to detect corrupt input that -+ * would read beyond the beginning of the uncompressed stream. -+ */ -+ size_t full; -+ -+ /* Write limit; we don't write to buf[limit] or later bytes. */ -+ size_t limit; -+ -+ /* -+ * End of the dictionary buffer. In multi-call mode, this is -+ * the same as the dictionary size. In single-call mode, this -+ * indicates the size of the output buffer. -+ */ -+ size_t end; -+ -+ /* -+ * Size of the dictionary as specified in Block Header. This is used -+ * together with "full" to detect corrupt input that would make us -+ * read beyond the beginning of the uncompressed stream. -+ */ -+ uint32_t size; -+ -+ /* -+ * Maximum allowed dictionary size in multi-call mode. -+ * This is ignored in single-call mode. -+ */ -+ uint32_t size_max; -+ -+ /* -+ * Amount of memory currently allocated for the dictionary. -+ * This is used only with XZ_DYNALLOC. (With XZ_PREALLOC, -+ * size_max is always the same as the allocated size.) -+ */ -+ uint32_t allocated; -+ -+ /* Operation mode */ -+ enum xz_mode mode; -+}; -+ -+/* Range decoder */ -+struct rc_dec { -+ uint32_t range; -+ uint32_t code; -+ -+ /* -+ * Number of initializing bytes remaining to be read -+ * by rc_read_init(). -+ */ -+ uint32_t init_bytes_left; -+ -+ /* -+ * Buffer from which we read our input. It can be either -+ * temp.buf or the caller-provided input buffer. -+ */ -+ const uint8_t *in; -+ size_t in_pos; -+ size_t in_limit; -+}; -+ -+/* Probabilities for a length decoder. */ -+struct lzma_len_dec { -+ /* Probability of match length being at least 10 */ -+ uint16_t choice; -+ -+ /* Probability of match length being at least 18 */ -+ uint16_t choice2; -+ -+ /* Probabilities for match lengths 2-9 */ -+ uint16_t low[POS_STATES_MAX][LEN_LOW_SYMBOLS]; -+ -+ /* Probabilities for match lengths 10-17 */ -+ uint16_t mid[POS_STATES_MAX][LEN_MID_SYMBOLS]; -+ -+ /* Probabilities for match lengths 18-273 */ -+ uint16_t high[LEN_HIGH_SYMBOLS]; -+}; -+ -+struct lzma_dec { -+ /* Distances of latest four matches */ -+ uint32_t rep0; -+ uint32_t rep1; -+ uint32_t rep2; -+ uint32_t rep3; -+ -+ /* Types of the most recently seen LZMA symbols */ -+ enum lzma_state state; -+ -+ /* -+ * Length of a match. This is updated so that dict_repeat can -+ * be called again to finish repeating the whole match. -+ */ -+ uint32_t len; -+ -+ /* -+ * LZMA properties or related bit masks (number of literal -+ * context bits, a mask dervied from the number of literal -+ * position bits, and a mask dervied from the number -+ * position bits) -+ */ -+ uint32_t lc; -+ uint32_t literal_pos_mask; /* (1 << lp) - 1 */ -+ uint32_t pos_mask; /* (1 << pb) - 1 */ -+ -+ /* If 1, it's a match. Otherwise it's a single 8-bit literal. */ -+ uint16_t is_match[STATES][POS_STATES_MAX]; -+ -+ /* If 1, it's a repeated match. The distance is one of rep0 .. rep3. */ -+ uint16_t is_rep[STATES]; -+ -+ /* -+ * If 0, distance of a repeated match is rep0. -+ * Otherwise check is_rep1. -+ */ -+ uint16_t is_rep0[STATES]; -+ -+ /* -+ * If 0, distance of a repeated match is rep1. -+ * Otherwise check is_rep2. -+ */ -+ uint16_t is_rep1[STATES]; -+ -+ /* If 0, distance of a repeated match is rep2. Otherwise it is rep3. */ -+ uint16_t is_rep2[STATES]; -+ -+ /* -+ * If 1, the repeated match has length of one byte. Otherwise -+ * the length is decoded from rep_len_decoder. -+ */ -+ uint16_t is_rep0_long[STATES][POS_STATES_MAX]; -+ -+ /* -+ * Probability tree for the highest two bits of the match -+ * distance. There is a separate probability tree for match -+ * lengths of 2 (i.e. MATCH_LEN_MIN), 3, 4, and [5, 273]. -+ */ -+ uint16_t dist_slot[DIST_STATES][DIST_SLOTS]; -+ -+ /* -+ * Probility trees for additional bits for match distance -+ * when the distance is in the range [4, 127]. -+ */ -+ uint16_t dist_special[FULL_DISTANCES - DIST_MODEL_END]; -+ -+ /* -+ * Probability tree for the lowest four bits of a match -+ * distance that is equal to or greater than 128. -+ */ -+ uint16_t dist_align[ALIGN_SIZE]; -+ -+ /* Length of a normal match */ -+ struct lzma_len_dec match_len_dec; -+ -+ /* Length of a repeated match */ -+ struct lzma_len_dec rep_len_dec; -+ -+ /* Probabilities of literals */ -+ uint16_t literal[LITERAL_CODERS_MAX][LITERAL_CODER_SIZE]; -+}; -+ -+struct lzma2_dec { -+ /* Position in xz_dec_lzma2_run(). */ -+ enum lzma2_seq { -+ SEQ_CONTROL, -+ SEQ_UNCOMPRESSED_1, -+ SEQ_UNCOMPRESSED_2, -+ SEQ_COMPRESSED_0, -+ SEQ_COMPRESSED_1, -+ SEQ_PROPERTIES, -+ SEQ_LZMA_PREPARE, -+ SEQ_LZMA_RUN, -+ SEQ_COPY -+ } sequence; -+ -+ /* Next position after decoding the compressed size of the chunk. */ -+ enum lzma2_seq next_sequence; -+ -+ /* Uncompressed size of LZMA chunk (2 MiB at maximum) */ -+ uint32_t uncompressed; -+ -+ /* -+ * Compressed size of LZMA chunk or compressed/uncompressed -+ * size of uncompressed chunk (64 KiB at maximum) -+ */ -+ uint32_t compressed; -+ -+ /* -+ * True if dictionary reset is needed. This is false before -+ * the first chunk (LZMA or uncompressed). -+ */ -+ bool_t need_dict_reset; -+ -+ /* -+ * True if new LZMA properties are needed. This is false -+ * before the first LZMA chunk. -+ */ -+ bool_t need_props; -+}; -+ -+struct xz_dec_lzma2 { -+ /* -+ * The order below is important on x86 to reduce code size and -+ * it shouldn't hurt on other platforms. Everything up to and -+ * including lzma.pos_mask are in the first 128 bytes on x86-32, -+ * which allows using smaller instructions to access those -+ * variables. On x86-64, fewer variables fit into the first 128 -+ * bytes, but this is still the best order without sacrificing -+ * the readability by splitting the structures. -+ */ -+ struct rc_dec rc; -+ struct dictionary dict; -+ struct lzma2_dec lzma2; -+ struct lzma_dec lzma; -+ -+ /* -+ * Temporary buffer which holds small number of input bytes between -+ * decoder calls. See lzma2_lzma() for details. -+ */ -+ struct { -+ uint32_t size; -+ uint8_t buf[3 * LZMA_IN_REQUIRED]; -+ } temp; -+}; -+ -+/************** -+ * Dictionary * -+ **************/ -+ -+/* -+ * Reset the dictionary state. When in single-call mode, set up the beginning -+ * of the dictionary to point to the actual output buffer. -+ */ -+static void INIT dict_reset(struct dictionary *dict, struct xz_buf *b) -+{ -+ if (DEC_IS_SINGLE(dict->mode)) { -+ dict->buf = b->out + b->out_pos; -+ dict->end = b->out_size - b->out_pos; -+ } -+ -+ dict->start = 0; -+ dict->pos = 0; -+ dict->limit = 0; -+ dict->full = 0; -+} -+ -+/* Set dictionary write limit */ -+static void INIT dict_limit(struct dictionary *dict, size_t out_max) -+{ -+ if (dict->end - dict->pos <= out_max) -+ dict->limit = dict->end; -+ else -+ dict->limit = dict->pos + out_max; -+} -+ -+/* Return true if at least one byte can be written into the dictionary. */ -+static inline bool_t INIT dict_has_space(const struct dictionary *dict) -+{ -+ return dict->pos < dict->limit; -+} -+ -+/* -+ * Get a byte from the dictionary at the given distance. The distance is -+ * assumed to valid, or as a special case, zero when the dictionary is -+ * still empty. This special case is needed for single-call decoding to -+ * avoid writing a '\0' to the end of the destination buffer. -+ */ -+static inline uint32_t INIT dict_get(const struct dictionary *dict, uint32_t dist) -+{ -+ size_t offset = dict->pos - dist - 1; -+ -+ if (dist >= dict->pos) -+ offset += dict->end; -+ -+ return dict->full > 0 ? dict->buf[offset] : 0; -+} -+ -+/* -+ * Put one byte into the dictionary. It is assumed that there is space for it. -+ */ -+static inline void INIT dict_put(struct dictionary *dict, uint8_t byte) -+{ -+ dict->buf[dict->pos++] = byte; -+ -+ if (dict->full < dict->pos) -+ dict->full = dict->pos; -+} -+ -+/* -+ * Repeat given number of bytes from the given distance. If the distance is -+ * invalid, false is returned. On success, true is returned and *len is -+ * updated to indicate how many bytes were left to be repeated. -+ */ -+static bool_t INIT dict_repeat(struct dictionary *dict, uint32_t *len, uint32_t dist) -+{ -+ size_t back; -+ uint32_t left; -+ -+ if (dist >= dict->full || dist >= dict->size) -+ return false; -+ -+ left = min_t(size_t, dict->limit - dict->pos, *len); -+ *len -= left; -+ -+ back = dict->pos - dist - 1; -+ if (dist >= dict->pos) -+ back += dict->end; -+ -+ do { -+ dict->buf[dict->pos++] = dict->buf[back++]; -+ if (back == dict->end) -+ back = 0; -+ } while (--left > 0); -+ -+ if (dict->full < dict->pos) -+ dict->full = dict->pos; -+ -+ return true; -+} -+ -+/* Copy uncompressed data as is from input to dictionary and output buffers. */ -+static void INIT dict_uncompressed(struct dictionary *dict, struct xz_buf *b, -+ uint32_t *left) -+{ -+ size_t copy_size; -+ -+ while (*left > 0 && b->in_pos < b->in_size -+ && b->out_pos < b->out_size) { -+ copy_size = min(b->in_size - b->in_pos, -+ b->out_size - b->out_pos); -+ if (copy_size > dict->end - dict->pos) -+ copy_size = dict->end - dict->pos; -+ if (copy_size > *left) -+ copy_size = *left; -+ -+ *left -= copy_size; -+ -+ memcpy(dict->buf + dict->pos, b->in + b->in_pos, copy_size); -+ dict->pos += copy_size; -+ -+ if (dict->full < dict->pos) -+ dict->full = dict->pos; -+ -+ if (DEC_IS_MULTI(dict->mode)) { -+ if (dict->pos == dict->end) -+ dict->pos = 0; -+ -+ memcpy(b->out + b->out_pos, b->in + b->in_pos, -+ copy_size); -+ } -+ -+ dict->start = dict->pos; -+ -+ b->out_pos += copy_size; -+ b->in_pos += copy_size; -+ } -+} -+ -+/* -+ * Flush pending data from dictionary to b->out. It is assumed that there is -+ * enough space in b->out. This is guaranteed because caller uses dict_limit() -+ * before decoding data into the dictionary. -+ */ -+static uint32_t INIT dict_flush(struct dictionary *dict, struct xz_buf *b) -+{ -+ size_t copy_size = dict->pos - dict->start; -+ -+ if (DEC_IS_MULTI(dict->mode)) { -+ if (dict->pos == dict->end) -+ dict->pos = 0; -+ -+ memcpy(b->out + b->out_pos, dict->buf + dict->start, -+ copy_size); -+ } -+ -+ dict->start = dict->pos; -+ b->out_pos += copy_size; -+ return copy_size; -+} -+ -+/***************** -+ * Range decoder * -+ *****************/ -+ -+/* Reset the range decoder. */ -+static void INIT rc_reset(struct rc_dec *rc) -+{ -+ rc->range = (uint32_t)-1; -+ rc->code = 0; -+ rc->init_bytes_left = RC_INIT_BYTES; -+} -+ -+/* -+ * Read the first five initial bytes into rc->code if they haven't been -+ * read already. (Yes, the first byte gets completely ignored.) -+ */ -+static bool_t INIT rc_read_init(struct rc_dec *rc, struct xz_buf *b) -+{ -+ while (rc->init_bytes_left > 0) { -+ if (b->in_pos == b->in_size) -+ return false; -+ -+ rc->code = (rc->code << 8) + b->in[b->in_pos++]; -+ --rc->init_bytes_left; -+ } -+ -+ return true; -+} -+ -+/* Return true if there may not be enough input for the next decoding loop. */ -+static inline bool_t INIT rc_limit_exceeded(const struct rc_dec *rc) -+{ -+ return rc->in_pos > rc->in_limit; -+} -+ -+/* -+ * Return true if it is possible (from point of view of range decoder) that -+ * we have reached the end of the LZMA chunk. -+ */ -+static inline bool_t INIT rc_is_finished(const struct rc_dec *rc) -+{ -+ return rc->code == 0; -+} -+ -+/* Read the next input byte if needed. */ -+static always_inline void rc_normalize(struct rc_dec *rc) -+{ -+ if (rc->range < RC_TOP_VALUE) { -+ rc->range <<= RC_SHIFT_BITS; -+ rc->code = (rc->code << RC_SHIFT_BITS) + rc->in[rc->in_pos++]; -+ } -+} -+ -+/* -+ * Decode one bit. In some versions, this function has been splitted in three -+ * functions so that the compiler is supposed to be able to more easily avoid -+ * an extra branch. In this particular version of the LZMA decoder, this -+ * doesn't seem to be a good idea (tested with GCC 3.3.6, 3.4.6, and 4.3.3 -+ * on x86). Using a non-splitted version results in nicer looking code too. -+ * -+ * NOTE: This must return an int. Do not make it return a bool or the speed -+ * of the code generated by GCC 3.x decreases 10-15 %. (GCC 4.3 doesn't care, -+ * and it generates 10-20 % faster code than GCC 3.x from this file anyway.) -+ */ -+static always_inline int rc_bit(struct rc_dec *rc, uint16_t *prob) -+{ -+ uint32_t bound; -+ int bit; -+ -+ rc_normalize(rc); -+ bound = (rc->range >> RC_BIT_MODEL_TOTAL_BITS) * *prob; -+ if (rc->code < bound) { -+ rc->range = bound; -+ *prob += (RC_BIT_MODEL_TOTAL - *prob) >> RC_MOVE_BITS; -+ bit = 0; -+ } else { -+ rc->range -= bound; -+ rc->code -= bound; -+ *prob -= *prob >> RC_MOVE_BITS; -+ bit = 1; -+ } -+ -+ return bit; -+} -+ -+/* Decode a bittree starting from the most significant bit. */ -+static always_inline uint32_t rc_bittree(struct rc_dec *rc, -+ uint16_t *probs, uint32_t limit) -+{ -+ uint32_t symbol = 1; -+ -+ do { -+ if (rc_bit(rc, &probs[symbol])) -+ symbol = (symbol << 1) + 1; -+ else -+ symbol <<= 1; -+ } while (symbol < limit); -+ -+ return symbol; -+} -+ -+/* Decode a bittree starting from the least significant bit. */ -+static always_inline void rc_bittree_reverse(struct rc_dec *rc, -+ uint16_t *probs, -+ uint32_t *dest, uint32_t limit) -+{ -+ uint32_t symbol = 1; -+ uint32_t i = 0; -+ -+ do { -+ if (rc_bit(rc, &probs[symbol])) { -+ symbol = (symbol << 1) + 1; -+ *dest += 1 << i; -+ } else { -+ symbol <<= 1; -+ } -+ } while (++i < limit); -+} -+ -+/* Decode direct bits (fixed fifty-fifty probability) */ -+static inline void INIT rc_direct(struct rc_dec *rc, uint32_t *dest, uint32_t limit) -+{ -+ uint32_t mask; -+ -+ do { -+ rc_normalize(rc); -+ rc->range >>= 1; -+ rc->code -= rc->range; -+ mask = (uint32_t)0 - (rc->code >> 31); -+ rc->code += rc->range & mask; -+ *dest = (*dest << 1) + (mask + 1); -+ } while (--limit > 0); -+} -+ -+/******** -+ * LZMA * -+ ********/ -+ -+/* Get pointer to literal coder probability array. */ -+static uint16_t *INIT lzma_literal_probs(struct xz_dec_lzma2 *s) -+{ -+ uint32_t prev_byte = dict_get(&s->dict, 0); -+ uint32_t low = prev_byte >> (8 - s->lzma.lc); -+ uint32_t high = (s->dict.pos & s->lzma.literal_pos_mask) << s->lzma.lc; -+ return s->lzma.literal[low + high]; -+} -+ -+/* Decode a literal (one 8-bit byte) */ -+static void INIT lzma_literal(struct xz_dec_lzma2 *s) -+{ -+ uint16_t *probs; -+ uint32_t symbol; -+ uint32_t match_byte; -+ uint32_t match_bit; -+ uint32_t offset; -+ uint32_t i; -+ -+ probs = lzma_literal_probs(s); -+ -+ if (lzma_state_is_literal(s->lzma.state)) { -+ symbol = rc_bittree(&s->rc, probs, 0x100); -+ } else { -+ symbol = 1; -+ match_byte = dict_get(&s->dict, s->lzma.rep0) << 1; -+ offset = 0x100; -+ -+ do { -+ match_bit = match_byte & offset; -+ match_byte <<= 1; -+ i = offset + match_bit + symbol; -+ -+ if (rc_bit(&s->rc, &probs[i])) { -+ symbol = (symbol << 1) + 1; -+ offset &= match_bit; -+ } else { -+ symbol <<= 1; -+ offset &= ~match_bit; -+ } -+ } while (symbol < 0x100); -+ } -+ -+ dict_put(&s->dict, (uint8_t)symbol); -+ lzma_state_literal(&s->lzma.state); -+} -+ -+/* Decode the length of the match into s->lzma.len. */ -+static void INIT lzma_len(struct xz_dec_lzma2 *s, struct lzma_len_dec *l, -+ uint32_t pos_state) -+{ -+ uint16_t *probs; -+ uint32_t limit; -+ -+ if (!rc_bit(&s->rc, &l->choice)) { -+ probs = l->low[pos_state]; -+ limit = LEN_LOW_SYMBOLS; -+ s->lzma.len = MATCH_LEN_MIN; -+ } else { -+ if (!rc_bit(&s->rc, &l->choice2)) { -+ probs = l->mid[pos_state]; -+ limit = LEN_MID_SYMBOLS; -+ s->lzma.len = MATCH_LEN_MIN + LEN_LOW_SYMBOLS; -+ } else { -+ probs = l->high; -+ limit = LEN_HIGH_SYMBOLS; -+ s->lzma.len = MATCH_LEN_MIN + LEN_LOW_SYMBOLS -+ + LEN_MID_SYMBOLS; -+ } -+ } -+ -+ s->lzma.len += rc_bittree(&s->rc, probs, limit) - limit; -+} -+ -+/* Decode a match. The distance will be stored in s->lzma.rep0. */ -+static void INIT lzma_match(struct xz_dec_lzma2 *s, uint32_t pos_state) -+{ -+ uint16_t *probs; -+ uint32_t dist_slot; -+ uint32_t limit; -+ -+ lzma_state_match(&s->lzma.state); -+ -+ s->lzma.rep3 = s->lzma.rep2; -+ s->lzma.rep2 = s->lzma.rep1; -+ s->lzma.rep1 = s->lzma.rep0; -+ -+ lzma_len(s, &s->lzma.match_len_dec, pos_state); -+ -+ probs = s->lzma.dist_slot[lzma_get_dist_state(s->lzma.len)]; -+ dist_slot = rc_bittree(&s->rc, probs, DIST_SLOTS) - DIST_SLOTS; -+ -+ if (dist_slot < DIST_MODEL_START) { -+ s->lzma.rep0 = dist_slot; -+ } else { -+ limit = (dist_slot >> 1) - 1; -+ s->lzma.rep0 = 2 + (dist_slot & 1); -+ -+ if (dist_slot < DIST_MODEL_END) { -+ s->lzma.rep0 <<= limit; -+ probs = s->lzma.dist_special + s->lzma.rep0 -+ - dist_slot - 1; -+ rc_bittree_reverse(&s->rc, probs, -+ &s->lzma.rep0, limit); -+ } else { -+ rc_direct(&s->rc, &s->lzma.rep0, limit - ALIGN_BITS); -+ s->lzma.rep0 <<= ALIGN_BITS; -+ rc_bittree_reverse(&s->rc, s->lzma.dist_align, -+ &s->lzma.rep0, ALIGN_BITS); -+ } -+ } -+} -+ -+/* -+ * Decode a repeated match. The distance is one of the four most recently -+ * seen matches. The distance will be stored in s->lzma.rep0. -+ */ -+static void INIT lzma_rep_match(struct xz_dec_lzma2 *s, uint32_t pos_state) -+{ -+ uint32_t tmp; -+ -+ if (!rc_bit(&s->rc, &s->lzma.is_rep0[s->lzma.state])) { -+ if (!rc_bit(&s->rc, &s->lzma.is_rep0_long[ -+ s->lzma.state][pos_state])) { -+ lzma_state_short_rep(&s->lzma.state); -+ s->lzma.len = 1; -+ return; -+ } -+ } else { -+ if (!rc_bit(&s->rc, &s->lzma.is_rep1[s->lzma.state])) { -+ tmp = s->lzma.rep1; -+ } else { -+ if (!rc_bit(&s->rc, &s->lzma.is_rep2[s->lzma.state])) { -+ tmp = s->lzma.rep2; -+ } else { -+ tmp = s->lzma.rep3; -+ s->lzma.rep3 = s->lzma.rep2; -+ } -+ -+ s->lzma.rep2 = s->lzma.rep1; -+ } -+ -+ s->lzma.rep1 = s->lzma.rep0; -+ s->lzma.rep0 = tmp; -+ } -+ -+ lzma_state_long_rep(&s->lzma.state); -+ lzma_len(s, &s->lzma.rep_len_dec, pos_state); -+} -+ -+/* LZMA decoder core */ -+static bool_t INIT lzma_main(struct xz_dec_lzma2 *s) -+{ -+ uint32_t pos_state; -+ -+ /* -+ * If the dictionary was reached during the previous call, try to -+ * finish the possibly pending repeat in the dictionary. -+ */ -+ if (dict_has_space(&s->dict) && s->lzma.len > 0) -+ dict_repeat(&s->dict, &s->lzma.len, s->lzma.rep0); -+ -+ /* -+ * Decode more LZMA symbols. One iteration may consume up to -+ * LZMA_IN_REQUIRED - 1 bytes. -+ */ -+ while (dict_has_space(&s->dict) && !rc_limit_exceeded(&s->rc)) { -+ pos_state = s->dict.pos & s->lzma.pos_mask; -+ -+ if (!rc_bit(&s->rc, &s->lzma.is_match[ -+ s->lzma.state][pos_state])) { -+ lzma_literal(s); -+ } else { -+ if (rc_bit(&s->rc, &s->lzma.is_rep[s->lzma.state])) -+ lzma_rep_match(s, pos_state); -+ else -+ lzma_match(s, pos_state); -+ -+ if (!dict_repeat(&s->dict, &s->lzma.len, s->lzma.rep0)) -+ return false; -+ } -+ } -+ -+ /* -+ * Having the range decoder always normalized when we are outside -+ * this function makes it easier to correctly handle end of the chunk. -+ */ -+ rc_normalize(&s->rc); -+ -+ return true; -+} -+ -+/* -+ * Reset the LZMA decoder and range decoder state. Dictionary is nore reset -+ * here, because LZMA state may be reset without resetting the dictionary. -+ */ -+static void INIT lzma_reset(struct xz_dec_lzma2 *s) -+{ -+ uint16_t *probs; -+ size_t i; -+ -+ s->lzma.state = STATE_LIT_LIT; -+ s->lzma.rep0 = 0; -+ s->lzma.rep1 = 0; -+ s->lzma.rep2 = 0; -+ s->lzma.rep3 = 0; -+ -+ /* -+ * All probabilities are initialized to the same value. This hack -+ * makes the code smaller by avoiding a separate loop for each -+ * probability array. -+ * -+ * This could be optimized so that only that part of literal -+ * probabilities that are actually required. In the common case -+ * we would write 12 KiB less. -+ */ -+ probs = s->lzma.is_match[0]; -+ for (i = 0; i < PROBS_TOTAL; ++i) -+ probs[i] = RC_BIT_MODEL_TOTAL / 2; -+ -+ rc_reset(&s->rc); -+} -+ -+/* -+ * Decode and validate LZMA properties (lc/lp/pb) and calculate the bit masks -+ * from the decoded lp and pb values. On success, the LZMA decoder state is -+ * reset and true is returned. -+ */ -+static bool_t INIT lzma_props(struct xz_dec_lzma2 *s, uint8_t props) -+{ -+ if (props > (4 * 5 + 4) * 9 + 8) -+ return false; -+ -+ s->lzma.pos_mask = 0; -+ while (props >= 9 * 5) { -+ props -= 9 * 5; -+ ++s->lzma.pos_mask; -+ } -+ -+ s->lzma.pos_mask = (1 << s->lzma.pos_mask) - 1; -+ -+ s->lzma.literal_pos_mask = 0; -+ while (props >= 9) { -+ props -= 9; -+ ++s->lzma.literal_pos_mask; -+ } -+ -+ s->lzma.lc = props; -+ -+ if (s->lzma.lc + s->lzma.literal_pos_mask > 4) -+ return false; -+ -+ s->lzma.literal_pos_mask = (1 << s->lzma.literal_pos_mask) - 1; -+ -+ lzma_reset(s); -+ -+ return true; -+} -+ -+/********* -+ * LZMA2 * -+ *********/ -+ -+/* -+ * The LZMA decoder assumes that if the input limit (s->rc.in_limit) hasn't -+ * been exceeded, it is safe to read up to LZMA_IN_REQUIRED bytes. This -+ * wrapper function takes care of making the LZMA decoder's assumption safe. -+ * -+ * As long as there is plenty of input left to be decoded in the current LZMA -+ * chunk, we decode directly from the caller-supplied input buffer until -+ * there's LZMA_IN_REQUIRED bytes left. Those remaining bytes are copied into -+ * s->temp.buf, which (hopefully) gets filled on the next call to this -+ * function. We decode a few bytes from the temporary buffer so that we can -+ * continue decoding from the caller-supplied input buffer again. -+ */ -+static bool_t INIT lzma2_lzma(struct xz_dec_lzma2 *s, struct xz_buf *b) -+{ -+ size_t in_avail; -+ uint32_t tmp; -+ -+ in_avail = b->in_size - b->in_pos; -+ if (s->temp.size > 0 || s->lzma2.compressed == 0) { -+ tmp = 2 * LZMA_IN_REQUIRED - s->temp.size; -+ if (tmp > s->lzma2.compressed - s->temp.size) -+ tmp = s->lzma2.compressed - s->temp.size; -+ if (tmp > in_avail) -+ tmp = in_avail; -+ -+ memcpy(s->temp.buf + s->temp.size, b->in + b->in_pos, tmp); -+ -+ if (s->temp.size + tmp == s->lzma2.compressed) { -+ memzero(s->temp.buf + s->temp.size + tmp, -+ sizeof(s->temp.buf) -+ - s->temp.size - tmp); -+ s->rc.in_limit = s->temp.size + tmp; -+ } else if (s->temp.size + tmp < LZMA_IN_REQUIRED) { -+ s->temp.size += tmp; -+ b->in_pos += tmp; -+ return true; -+ } else { -+ s->rc.in_limit = s->temp.size + tmp - LZMA_IN_REQUIRED; -+ } -+ -+ s->rc.in = s->temp.buf; -+ s->rc.in_pos = 0; -+ -+ if (!lzma_main(s) || s->rc.in_pos > s->temp.size + tmp) -+ return false; -+ -+ s->lzma2.compressed -= s->rc.in_pos; -+ -+ if (s->rc.in_pos < s->temp.size) { -+ s->temp.size -= s->rc.in_pos; -+ memmove(s->temp.buf, s->temp.buf + s->rc.in_pos, -+ s->temp.size); -+ return true; -+ } -+ -+ b->in_pos += s->rc.in_pos - s->temp.size; -+ s->temp.size = 0; -+ } -+ -+ in_avail = b->in_size - b->in_pos; -+ if (in_avail >= LZMA_IN_REQUIRED) { -+ s->rc.in = b->in; -+ s->rc.in_pos = b->in_pos; -+ -+ if (in_avail >= s->lzma2.compressed + LZMA_IN_REQUIRED) -+ s->rc.in_limit = b->in_pos + s->lzma2.compressed; -+ else -+ s->rc.in_limit = b->in_size - LZMA_IN_REQUIRED; -+ -+ if (!lzma_main(s)) -+ return false; -+ -+ in_avail = s->rc.in_pos - b->in_pos; -+ if (in_avail > s->lzma2.compressed) -+ return false; -+ -+ s->lzma2.compressed -= in_avail; -+ b->in_pos = s->rc.in_pos; -+ } -+ -+ in_avail = b->in_size - b->in_pos; -+ if (in_avail < LZMA_IN_REQUIRED) { -+ if (in_avail > s->lzma2.compressed) -+ in_avail = s->lzma2.compressed; -+ -+ memcpy(s->temp.buf, b->in + b->in_pos, in_avail); -+ s->temp.size = in_avail; -+ b->in_pos += in_avail; -+ } -+ -+ return true; -+} -+ -+/* -+ * Take care of the LZMA2 control layer, and forward the job of actual LZMA -+ * decoding or copying of uncompressed chunks to other functions. -+ */ -+XZ_EXTERN enum xz_ret INIT xz_dec_lzma2_run(struct xz_dec_lzma2 *s, -+ struct xz_buf *b) -+{ -+ uint32_t tmp; -+ -+ while (b->in_pos < b->in_size || s->lzma2.sequence == SEQ_LZMA_RUN) { -+ switch (s->lzma2.sequence) { -+ case SEQ_CONTROL: -+ /* -+ * LZMA2 control byte -+ * -+ * Exact values: -+ * 0x00 End marker -+ * 0x01 Dictionary reset followed by -+ * an uncompressed chunk -+ * 0x02 Uncompressed chunk (no dictionary reset) -+ * -+ * Highest three bits (s->control & 0xE0): -+ * 0xE0 Dictionary reset, new properties and state -+ * reset, followed by LZMA compressed chunk -+ * 0xC0 New properties and state reset, followed -+ * by LZMA compressed chunk (no dictionary -+ * reset) -+ * 0xA0 State reset using old properties, -+ * followed by LZMA compressed chunk (no -+ * dictionary reset) -+ * 0x80 LZMA chunk (no dictionary or state reset) -+ * -+ * For LZMA compressed chunks, the lowest five bits -+ * (s->control & 1F) are the highest bits of the -+ * uncompressed size (bits 16-20). -+ * -+ * A new LZMA2 stream must begin with a dictionary -+ * reset. The first LZMA chunk must set new -+ * properties and reset the LZMA state. -+ * -+ * Values that don't match anything described above -+ * are invalid and we return XZ_DATA_ERROR. -+ */ -+ tmp = b->in[b->in_pos++]; -+ -+ if (tmp >= 0xE0 || tmp == 0x01) { -+ s->lzma2.need_props = true; -+ s->lzma2.need_dict_reset = false; -+ dict_reset(&s->dict, b); -+ } else if (s->lzma2.need_dict_reset) { -+ return XZ_DATA_ERROR; -+ } -+ -+ if (tmp >= 0x80) { -+ s->lzma2.uncompressed = (tmp & 0x1F) << 16; -+ s->lzma2.sequence = SEQ_UNCOMPRESSED_1; -+ -+ if (tmp >= 0xC0) { -+ /* -+ * When there are new properties, -+ * state reset is done at -+ * SEQ_PROPERTIES. -+ */ -+ s->lzma2.need_props = false; -+ s->lzma2.next_sequence -+ = SEQ_PROPERTIES; -+ -+ } else if (s->lzma2.need_props) { -+ return XZ_DATA_ERROR; -+ -+ } else { -+ s->lzma2.next_sequence -+ = SEQ_LZMA_PREPARE; -+ if (tmp >= 0xA0) -+ lzma_reset(s); -+ } -+ } else { -+ if (tmp == 0x00) -+ return XZ_STREAM_END; -+ -+ if (tmp > 0x02) -+ return XZ_DATA_ERROR; -+ -+ s->lzma2.sequence = SEQ_COMPRESSED_0; -+ s->lzma2.next_sequence = SEQ_COPY; -+ } -+ -+ break; -+ -+ case SEQ_UNCOMPRESSED_1: -+ s->lzma2.uncompressed -+ += (uint32_t)b->in[b->in_pos++] << 8; -+ s->lzma2.sequence = SEQ_UNCOMPRESSED_2; -+ break; -+ -+ case SEQ_UNCOMPRESSED_2: -+ s->lzma2.uncompressed -+ += (uint32_t)b->in[b->in_pos++] + 1; -+ s->lzma2.sequence = SEQ_COMPRESSED_0; -+ break; -+ -+ case SEQ_COMPRESSED_0: -+ s->lzma2.compressed -+ = (uint32_t)b->in[b->in_pos++] << 8; -+ s->lzma2.sequence = SEQ_COMPRESSED_1; -+ break; -+ -+ case SEQ_COMPRESSED_1: -+ s->lzma2.compressed -+ += (uint32_t)b->in[b->in_pos++] + 1; -+ s->lzma2.sequence = s->lzma2.next_sequence; -+ break; -+ -+ case SEQ_PROPERTIES: -+ if (!lzma_props(s, b->in[b->in_pos++])) -+ return XZ_DATA_ERROR; -+ -+ s->lzma2.sequence = SEQ_LZMA_PREPARE; -+ -+ case SEQ_LZMA_PREPARE: -+ if (s->lzma2.compressed < RC_INIT_BYTES) -+ return XZ_DATA_ERROR; -+ -+ if (!rc_read_init(&s->rc, b)) -+ return XZ_OK; -+ -+ s->lzma2.compressed -= RC_INIT_BYTES; -+ s->lzma2.sequence = SEQ_LZMA_RUN; -+ -+ case SEQ_LZMA_RUN: -+ /* -+ * Set dictionary limit to indicate how much we want -+ * to be encoded at maximum. Decode new data into the -+ * dictionary. Flush the new data from dictionary to -+ * b->out. Check if we finished decoding this chunk. -+ * In case the dictionary got full but we didn't fill -+ * the output buffer yet, we may run this loop -+ * multiple times without changing s->lzma2.sequence. -+ */ -+ dict_limit(&s->dict, min_t(size_t, -+ b->out_size - b->out_pos, -+ s->lzma2.uncompressed)); -+ if (!lzma2_lzma(s, b)) -+ return XZ_DATA_ERROR; -+ -+ s->lzma2.uncompressed -= dict_flush(&s->dict, b); -+ -+ if (s->lzma2.uncompressed == 0) { -+ if (s->lzma2.compressed > 0 || s->lzma.len > 0 -+ || !rc_is_finished(&s->rc)) -+ return XZ_DATA_ERROR; -+ -+ rc_reset(&s->rc); -+ s->lzma2.sequence = SEQ_CONTROL; -+ -+ } else if (b->out_pos == b->out_size -+ || (b->in_pos == b->in_size -+ && s->temp.size -+ < s->lzma2.compressed)) { -+ return XZ_OK; -+ } -+ -+ break; -+ -+ case SEQ_COPY: -+ dict_uncompressed(&s->dict, b, &s->lzma2.compressed); -+ if (s->lzma2.compressed > 0) -+ return XZ_OK; -+ -+ s->lzma2.sequence = SEQ_CONTROL; -+ break; -+ } -+ } -+ -+ return XZ_OK; -+} -+ -+XZ_EXTERN struct xz_dec_lzma2 *INIT xz_dec_lzma2_create(enum xz_mode mode, -+ uint32_t dict_max) -+{ -+ struct xz_dec_lzma2 *s = malloc(sizeof(*s)); -+ if (s == NULL) -+ return NULL; -+ -+ s->dict.mode = mode; -+ s->dict.size_max = dict_max; -+ -+ if (DEC_IS_PREALLOC(mode)) { -+ s->dict.buf = large_malloc(dict_max); -+ if (s->dict.buf == NULL) { -+ free(s); -+ return NULL; -+ } -+ } else if (DEC_IS_DYNALLOC(mode)) { -+ s->dict.buf = NULL; -+ s->dict.allocated = 0; -+ } -+ -+ return s; -+} -+ -+XZ_EXTERN enum xz_ret INIT xz_dec_lzma2_reset(struct xz_dec_lzma2 *s, uint8_t props) -+{ -+ /* This limits dictionary size to 3 GiB to keep parsing simpler. */ -+ if (props > 39) -+ return XZ_OPTIONS_ERROR; -+ -+ s->dict.size = 2 + (props & 1); -+ s->dict.size <<= (props >> 1) + 11; -+ -+ if (DEC_IS_MULTI(s->dict.mode)) { -+ if (s->dict.size > s->dict.size_max) -+ return XZ_MEMLIMIT_ERROR; -+ -+ s->dict.end = s->dict.size; -+ -+ if (DEC_IS_DYNALLOC(s->dict.mode)) { -+ if (s->dict.allocated < s->dict.size) { -+ large_free(s->dict.buf); -+ s->dict.buf = large_malloc(s->dict.size); -+ if (s->dict.buf == NULL) { -+ s->dict.allocated = 0; -+ return XZ_MEM_ERROR; -+ } -+ } -+ } -+ } -+ -+ s->lzma.len = 0; -+ -+ s->lzma2.sequence = SEQ_CONTROL; -+ s->lzma2.need_dict_reset = true; -+ -+ s->temp.size = 0; -+ -+ return XZ_OK; -+} -+ -+XZ_EXTERN void INIT xz_dec_lzma2_end(struct xz_dec_lzma2 *s) -+{ -+ if (DEC_IS_MULTI(s->dict.mode)) -+ large_free(s->dict.buf); -+ -+ free(s); -+} -diff --git a/xen/common/xz/dec_stream.c b/xen/common/xz/dec_stream.c -new file mode 100644 ---- /dev/null -+++ b/xen/common/xz/dec_stream.c -@@ -0,0 +1,821 @@ -+/* -+ * .xz Stream decoder -+ * -+ * Author: Lasse Collin -+ * -+ * This file has been put into the public domain. -+ * You can do whatever you want with this file. -+ */ -+ -+#include "private.h" -+#include "stream.h" -+ -+/* Hash used to validate the Index field */ -+struct xz_dec_hash { -+ vli_type unpadded; -+ vli_type uncompressed; -+ uint32_t crc32; -+}; -+ -+struct xz_dec { -+ /* Position in dec_main() */ -+ enum { -+ SEQ_STREAM_HEADER, -+ SEQ_BLOCK_START, -+ SEQ_BLOCK_HEADER, -+ SEQ_BLOCK_UNCOMPRESS, -+ SEQ_BLOCK_PADDING, -+ SEQ_BLOCK_CHECK, -+ SEQ_INDEX, -+ SEQ_INDEX_PADDING, -+ SEQ_INDEX_CRC32, -+ SEQ_STREAM_FOOTER -+ } sequence; -+ -+ /* Position in variable-length integers and Check fields */ -+ uint32_t pos; -+ -+ /* Variable-length integer decoded by dec_vli() */ -+ vli_type vli; -+ -+ /* Saved in_pos and out_pos */ -+ size_t in_start; -+ size_t out_start; -+ -+ /* CRC32 value in Block or Index */ -+ uint32_t crc32; -+ -+ /* Type of the integrity check calculated from uncompressed data */ -+ enum xz_check check_type; -+ -+ /* Operation mode */ -+ enum xz_mode mode; -+ -+ /* -+ * True if the next call to xz_dec_run() is allowed to return -+ * XZ_BUF_ERROR. -+ */ -+ bool_t allow_buf_error; -+ -+ /* Information stored in Block Header */ -+ struct { -+ /* -+ * Value stored in the Compressed Size field, or -+ * VLI_UNKNOWN if Compressed Size is not present. -+ */ -+ vli_type compressed; -+ -+ /* -+ * Value stored in the Uncompressed Size field, or -+ * VLI_UNKNOWN if Uncompressed Size is not present. -+ */ -+ vli_type uncompressed; -+ -+ /* Size of the Block Header field */ -+ uint32_t size; -+ } block_header; -+ -+ /* Information collected when decoding Blocks */ -+ struct { -+ /* Observed compressed size of the current Block */ -+ vli_type compressed; -+ -+ /* Observed uncompressed size of the current Block */ -+ vli_type uncompressed; -+ -+ /* Number of Blocks decoded so far */ -+ vli_type count; -+ -+ /* -+ * Hash calculated from the Block sizes. This is used to -+ * validate the Index field. -+ */ -+ struct xz_dec_hash hash; -+ } block; -+ -+ /* Variables needed when verifying the Index field */ -+ struct { -+ /* Position in dec_index() */ -+ enum { -+ SEQ_INDEX_COUNT, -+ SEQ_INDEX_UNPADDED, -+ SEQ_INDEX_UNCOMPRESSED -+ } sequence; -+ -+ /* Size of the Index in bytes */ -+ vli_type size; -+ -+ /* Number of Records (matches block.count in valid files) */ -+ vli_type count; -+ -+ /* -+ * Hash calculated from the Records (matches block.hash in -+ * valid files). -+ */ -+ struct xz_dec_hash hash; -+ } index; -+ -+ /* -+ * Temporary buffer needed to hold Stream Header, Block Header, -+ * and Stream Footer. The Block Header is the biggest (1 KiB) -+ * so we reserve space according to that. buf[] has to be aligned -+ * to a multiple of four bytes; the size_t variables before it -+ * should guarantee this. -+ */ -+ struct { -+ size_t pos; -+ size_t size; -+ uint8_t buf[1024]; -+ } temp; -+ -+ struct xz_dec_lzma2 *lzma2; -+ -+#ifdef XZ_DEC_BCJ -+ struct xz_dec_bcj *bcj; -+ bool_t bcj_active; -+#endif -+}; -+ -+#ifdef XZ_DEC_ANY_CHECK -+/* Sizes of the Check field with different Check IDs */ -+static const uint8_t check_sizes[16] = { -+ 0, -+ 4, 4, 4, -+ 8, 8, 8, -+ 16, 16, 16, -+ 32, 32, 32, -+ 64, 64, 64 -+}; -+#endif -+ -+/* -+ * Fill s->temp by copying data starting from b->in[b->in_pos]. Caller -+ * must have set s->temp.pos to indicate how much data we are supposed -+ * to copy into s->temp.buf. Return true once s->temp.pos has reached -+ * s->temp.size. -+ */ -+static bool_t INIT fill_temp(struct xz_dec *s, struct xz_buf *b) -+{ -+ size_t copy_size = min_t(size_t, -+ b->in_size - b->in_pos, s->temp.size - s->temp.pos); -+ -+ memcpy(s->temp.buf + s->temp.pos, b->in + b->in_pos, copy_size); -+ b->in_pos += copy_size; -+ s->temp.pos += copy_size; -+ -+ if (s->temp.pos == s->temp.size) { -+ s->temp.pos = 0; -+ return true; -+ } -+ -+ return false; -+} -+ -+/* Decode a variable-length integer (little-endian base-128 encoding) */ -+static enum xz_ret INIT dec_vli(struct xz_dec *s, const uint8_t *in, -+ size_t *in_pos, size_t in_size) -+{ -+ uint8_t byte; -+ -+ if (s->pos == 0) -+ s->vli = 0; -+ -+ while (*in_pos < in_size) { -+ byte = in[*in_pos]; -+ ++*in_pos; -+ -+ s->vli |= (vli_type)(byte & 0x7F) << s->pos; -+ -+ if ((byte & 0x80) == 0) { -+ /* Don't allow non-minimal encodings. */ -+ if (byte == 0 && s->pos != 0) -+ return XZ_DATA_ERROR; -+ -+ s->pos = 0; -+ return XZ_STREAM_END; -+ } -+ -+ s->pos += 7; -+ if (s->pos == 7 * VLI_BYTES_MAX) -+ return XZ_DATA_ERROR; -+ } -+ -+ return XZ_OK; -+} -+ -+/* -+ * Decode the Compressed Data field from a Block. Update and validate -+ * the observed compressed and uncompressed sizes of the Block so that -+ * they don't exceed the values possibly stored in the Block Header -+ * (validation assumes that no integer overflow occurs, since vli_type -+ * is normally uint64_t). Update the CRC32 if presence of the CRC32 -+ * field was indicated in Stream Header. -+ * -+ * Once the decoding is finished, validate that the observed sizes match -+ * the sizes possibly stored in the Block Header. Update the hash and -+ * Block count, which are later used to validate the Index field. -+ */ -+static enum xz_ret INIT dec_block(struct xz_dec *s, struct xz_buf *b) -+{ -+ enum xz_ret ret; -+ -+ s->in_start = b->in_pos; -+ s->out_start = b->out_pos; -+ -+#ifdef XZ_DEC_BCJ -+ if (s->bcj_active) -+ ret = xz_dec_bcj_run(s->bcj, s->lzma2, b); -+ else -+#endif -+ ret = xz_dec_lzma2_run(s->lzma2, b); -+ -+ s->block.compressed += b->in_pos - s->in_start; -+ s->block.uncompressed += b->out_pos - s->out_start; -+ -+ /* -+ * There is no need to separately check for VLI_UNKNOWN, since -+ * the observed sizes are always smaller than VLI_UNKNOWN. -+ */ -+ if (s->block.compressed > s->block_header.compressed -+ || s->block.uncompressed -+ > s->block_header.uncompressed) -+ return XZ_DATA_ERROR; -+ -+ if (s->check_type == XZ_CHECK_CRC32) -+ s->crc32 = xz_crc32(b->out + s->out_start, -+ b->out_pos - s->out_start, s->crc32); -+ -+ if (ret == XZ_STREAM_END) { -+ if (s->block_header.compressed != VLI_UNKNOWN -+ && s->block_header.compressed -+ != s->block.compressed) -+ return XZ_DATA_ERROR; -+ -+ if (s->block_header.uncompressed != VLI_UNKNOWN -+ && s->block_header.uncompressed -+ != s->block.uncompressed) -+ return XZ_DATA_ERROR; -+ -+ s->block.hash.unpadded += s->block_header.size -+ + s->block.compressed; -+ -+#ifdef XZ_DEC_ANY_CHECK -+ s->block.hash.unpadded += check_sizes[s->check_type]; -+#else -+ if (s->check_type == XZ_CHECK_CRC32) -+ s->block.hash.unpadded += 4; -+#endif -+ -+ s->block.hash.uncompressed += s->block.uncompressed; -+ s->block.hash.crc32 = xz_crc32( -+ (const uint8_t *)&s->block.hash, -+ sizeof(s->block.hash), s->block.hash.crc32); -+ -+ ++s->block.count; -+ } -+ -+ return ret; -+} -+ -+/* Update the Index size and the CRC32 value. */ -+static void INIT index_update(struct xz_dec *s, const struct xz_buf *b) -+{ -+ size_t in_used = b->in_pos - s->in_start; -+ s->index.size += in_used; -+ s->crc32 = xz_crc32(b->in + s->in_start, in_used, s->crc32); -+} -+ -+/* -+ * Decode the Number of Records, Unpadded Size, and Uncompressed Size -+ * fields from the Index field. That is, Index Padding and CRC32 are not -+ * decoded by this function. -+ * -+ * This can return XZ_OK (more input needed), XZ_STREAM_END (everything -+ * successfully decoded), or XZ_DATA_ERROR (input is corrupt). -+ */ -+static enum xz_ret INIT dec_index(struct xz_dec *s, struct xz_buf *b) -+{ -+ enum xz_ret ret; -+ -+ do { -+ ret = dec_vli(s, b->in, &b->in_pos, b->in_size); -+ if (ret != XZ_STREAM_END) { -+ index_update(s, b); -+ return ret; -+ } -+ -+ switch (s->index.sequence) { -+ case SEQ_INDEX_COUNT: -+ s->index.count = s->vli; -+ -+ /* -+ * Validate that the Number of Records field -+ * indicates the same number of Records as -+ * there were Blocks in the Stream. -+ */ -+ if (s->index.count != s->block.count) -+ return XZ_DATA_ERROR; -+ -+ s->index.sequence = SEQ_INDEX_UNPADDED; -+ break; -+ -+ case SEQ_INDEX_UNPADDED: -+ s->index.hash.unpadded += s->vli; -+ s->index.sequence = SEQ_INDEX_UNCOMPRESSED; -+ break; -+ -+ case SEQ_INDEX_UNCOMPRESSED: -+ s->index.hash.uncompressed += s->vli; -+ s->index.hash.crc32 = xz_crc32( -+ (const uint8_t *)&s->index.hash, -+ sizeof(s->index.hash), -+ s->index.hash.crc32); -+ --s->index.count; -+ s->index.sequence = SEQ_INDEX_UNPADDED; -+ break; -+ } -+ } while (s->index.count > 0); -+ -+ return XZ_STREAM_END; -+} -+ -+/* -+ * Validate that the next four input bytes match the value of s->crc32. -+ * s->pos must be zero when starting to validate the first byte. -+ */ -+static enum xz_ret INIT crc32_validate(struct xz_dec *s, struct xz_buf *b) -+{ -+ do { -+ if (b->in_pos == b->in_size) -+ return XZ_OK; -+ -+ if (((s->crc32 >> s->pos) & 0xFF) != b->in[b->in_pos++]) -+ return XZ_DATA_ERROR; -+ -+ s->pos += 8; -+ -+ } while (s->pos < 32); -+ -+ s->crc32 = 0; -+ s->pos = 0; -+ -+ return XZ_STREAM_END; -+} -+ -+#ifdef XZ_DEC_ANY_CHECK -+/* -+ * Skip over the Check field when the Check ID is not supported. -+ * Returns true once the whole Check field has been skipped over. -+ */ -+static bool_t INIT check_skip(struct xz_dec *s, struct xz_buf *b) -+{ -+ while (s->pos < check_sizes[s->check_type]) { -+ if (b->in_pos == b->in_size) -+ return false; -+ -+ ++b->in_pos; -+ ++s->pos; -+ } -+ -+ s->pos = 0; -+ -+ return true; -+} -+#endif -+ -+/* Decode the Stream Header field (the first 12 bytes of the .xz Stream). */ -+static enum xz_ret INIT dec_stream_header(struct xz_dec *s) -+{ -+ if (!memeq(s->temp.buf, HEADER_MAGIC, HEADER_MAGIC_SIZE)) -+ return XZ_FORMAT_ERROR; -+ -+ if (xz_crc32(s->temp.buf + HEADER_MAGIC_SIZE, 2, 0) -+ != get_le32(s->temp.buf + HEADER_MAGIC_SIZE + 2)) -+ return XZ_DATA_ERROR; -+ -+ if (s->temp.buf[HEADER_MAGIC_SIZE] != 0) -+ return XZ_OPTIONS_ERROR; -+ -+ /* -+ * Of integrity checks, we support only none (Check ID = 0) and -+ * CRC32 (Check ID = 1). However, if XZ_DEC_ANY_CHECK is defined, -+ * we will accept other check types too, but then the check won't -+ * be verified and a warning (XZ_UNSUPPORTED_CHECK) will be given. -+ */ -+ s->check_type = s->temp.buf[HEADER_MAGIC_SIZE + 1]; -+ -+#ifdef XZ_DEC_ANY_CHECK -+ if (s->check_type > XZ_CHECK_MAX) -+ return XZ_OPTIONS_ERROR; -+ -+ if (s->check_type > XZ_CHECK_CRC32) -+ return XZ_UNSUPPORTED_CHECK; -+#else -+ if (s->check_type > XZ_CHECK_CRC32) -+ return XZ_OPTIONS_ERROR; -+#endif -+ -+ return XZ_OK; -+} -+ -+/* Decode the Stream Footer field (the last 12 bytes of the .xz Stream) */ -+static enum xz_ret INIT dec_stream_footer(struct xz_dec *s) -+{ -+ if (!memeq(s->temp.buf + 10, FOOTER_MAGIC, FOOTER_MAGIC_SIZE)) -+ return XZ_DATA_ERROR; -+ -+ if (xz_crc32(s->temp.buf + 4, 6, 0) != get_le32(s->temp.buf)) -+ return XZ_DATA_ERROR; -+ -+ /* -+ * Validate Backward Size. Note that we never added the size of the -+ * Index CRC32 field to s->index.size, thus we use s->index.size / 4 -+ * instead of s->index.size / 4 - 1. -+ */ -+ if ((s->index.size >> 2) != get_le32(s->temp.buf + 4)) -+ return XZ_DATA_ERROR; -+ -+ if (s->temp.buf[8] != 0 || s->temp.buf[9] != s->check_type) -+ return XZ_DATA_ERROR; -+ -+ /* -+ * Use XZ_STREAM_END instead of XZ_OK to be more convenient -+ * for the caller. -+ */ -+ return XZ_STREAM_END; -+} -+ -+/* Decode the Block Header and initialize the filter chain. */ -+static enum xz_ret INIT dec_block_header(struct xz_dec *s) -+{ -+ enum xz_ret ret; -+ -+ /* -+ * Validate the CRC32. We know that the temp buffer is at least -+ * eight bytes so this is safe. -+ */ -+ s->temp.size -= 4; -+ if (xz_crc32(s->temp.buf, s->temp.size, 0) -+ != get_le32(s->temp.buf + s->temp.size)) -+ return XZ_DATA_ERROR; -+ -+ s->temp.pos = 2; -+ -+ /* -+ * Catch unsupported Block Flags. We support only one or two filters -+ * in the chain, so we catch that with the same test. -+ */ -+#ifdef XZ_DEC_BCJ -+ if (s->temp.buf[1] & 0x3E) -+#else -+ if (s->temp.buf[1] & 0x3F) -+#endif -+ return XZ_OPTIONS_ERROR; -+ -+ /* Compressed Size */ -+ if (s->temp.buf[1] & 0x40) { -+ if (dec_vli(s, s->temp.buf, &s->temp.pos, s->temp.size) -+ != XZ_STREAM_END) -+ return XZ_DATA_ERROR; -+ -+ s->block_header.compressed = s->vli; -+ } else { -+ s->block_header.compressed = VLI_UNKNOWN; -+ } -+ -+ /* Uncompressed Size */ -+ if (s->temp.buf[1] & 0x80) { -+ if (dec_vli(s, s->temp.buf, &s->temp.pos, s->temp.size) -+ != XZ_STREAM_END) -+ return XZ_DATA_ERROR; -+ -+ s->block_header.uncompressed = s->vli; -+ } else { -+ s->block_header.uncompressed = VLI_UNKNOWN; -+ } -+ -+#ifdef XZ_DEC_BCJ -+ /* If there are two filters, the first one must be a BCJ filter. */ -+ s->bcj_active = s->temp.buf[1] & 0x01; -+ if (s->bcj_active) { -+ if (s->temp.size - s->temp.pos < 2) -+ return XZ_OPTIONS_ERROR; -+ -+ ret = xz_dec_bcj_reset(s->bcj, s->temp.buf[s->temp.pos++]); -+ if (ret != XZ_OK) -+ return ret; -+ -+ /* -+ * We don't support custom start offset, -+ * so Size of Properties must be zero. -+ */ -+ if (s->temp.buf[s->temp.pos++] != 0x00) -+ return XZ_OPTIONS_ERROR; -+ } -+#endif -+ -+ /* Valid Filter Flags always take at least two bytes. */ -+ if (s->temp.size - s->temp.pos < 2) -+ return XZ_DATA_ERROR; -+ -+ /* Filter ID = LZMA2 */ -+ if (s->temp.buf[s->temp.pos++] != 0x21) -+ return XZ_OPTIONS_ERROR; -+ -+ /* Size of Properties = 1-byte Filter Properties */ -+ if (s->temp.buf[s->temp.pos++] != 0x01) -+ return XZ_OPTIONS_ERROR; -+ -+ /* Filter Properties contains LZMA2 dictionary size. */ -+ if (s->temp.size - s->temp.pos < 1) -+ return XZ_DATA_ERROR; -+ -+ ret = xz_dec_lzma2_reset(s->lzma2, s->temp.buf[s->temp.pos++]); -+ if (ret != XZ_OK) -+ return ret; -+ -+ /* The rest must be Header Padding. */ -+ while (s->temp.pos < s->temp.size) -+ if (s->temp.buf[s->temp.pos++] != 0x00) -+ return XZ_OPTIONS_ERROR; -+ -+ s->temp.pos = 0; -+ s->block.compressed = 0; -+ s->block.uncompressed = 0; -+ -+ return XZ_OK; -+} -+ -+static enum xz_ret INIT dec_main(struct xz_dec *s, struct xz_buf *b) -+{ -+ enum xz_ret ret; -+ -+ /* -+ * Store the start position for the case when we are in the middle -+ * of the Index field. -+ */ -+ s->in_start = b->in_pos; -+ -+ while (true) { -+ switch (s->sequence) { -+ case SEQ_STREAM_HEADER: -+ /* -+ * Stream Header is copied to s->temp, and then -+ * decoded from there. This way if the caller -+ * gives us only little input at a time, we can -+ * still keep the Stream Header decoding code -+ * simple. Similar approach is used in many places -+ * in this file. -+ */ -+ if (!fill_temp(s, b)) -+ return XZ_OK; -+ -+ /* -+ * If dec_stream_header() returns -+ * XZ_UNSUPPORTED_CHECK, it is still possible -+ * to continue decoding if working in multi-call -+ * mode. Thus, update s->sequence before calling -+ * dec_stream_header(). -+ */ -+ s->sequence = SEQ_BLOCK_START; -+ -+ ret = dec_stream_header(s); -+ if (ret != XZ_OK) -+ return ret; -+ -+ case SEQ_BLOCK_START: -+ /* We need one byte of input to continue. */ -+ if (b->in_pos == b->in_size) -+ return XZ_OK; -+ -+ /* See if this is the beginning of the Index field. */ -+ if (b->in[b->in_pos] == 0) { -+ s->in_start = b->in_pos++; -+ s->sequence = SEQ_INDEX; -+ break; -+ } -+ -+ /* -+ * Calculate the size of the Block Header and -+ * prepare to decode it. -+ */ -+ s->block_header.size -+ = ((uint32_t)b->in[b->in_pos] + 1) * 4; -+ -+ s->temp.size = s->block_header.size; -+ s->temp.pos = 0; -+ s->sequence = SEQ_BLOCK_HEADER; -+ -+ case SEQ_BLOCK_HEADER: -+ if (!fill_temp(s, b)) -+ return XZ_OK; -+ -+ ret = dec_block_header(s); -+ if (ret != XZ_OK) -+ return ret; -+ -+ s->sequence = SEQ_BLOCK_UNCOMPRESS; -+ -+ case SEQ_BLOCK_UNCOMPRESS: -+ ret = dec_block(s, b); -+ if (ret != XZ_STREAM_END) -+ return ret; -+ -+ s->sequence = SEQ_BLOCK_PADDING; -+ -+ case SEQ_BLOCK_PADDING: -+ /* -+ * Size of Compressed Data + Block Padding -+ * must be a multiple of four. We don't need -+ * s->block.compressed for anything else -+ * anymore, so we use it here to test the size -+ * of the Block Padding field. -+ */ -+ while (s->block.compressed & 3) { -+ if (b->in_pos == b->in_size) -+ return XZ_OK; -+ -+ if (b->in[b->in_pos++] != 0) -+ return XZ_DATA_ERROR; -+ -+ ++s->block.compressed; -+ } -+ -+ s->sequence = SEQ_BLOCK_CHECK; -+ -+ case SEQ_BLOCK_CHECK: -+ if (s->check_type == XZ_CHECK_CRC32) { -+ ret = crc32_validate(s, b); -+ if (ret != XZ_STREAM_END) -+ return ret; -+ } -+#ifdef XZ_DEC_ANY_CHECK -+ else if (!check_skip(s, b)) { -+ return XZ_OK; -+ } -+#endif -+ -+ s->sequence = SEQ_BLOCK_START; -+ break; -+ -+ case SEQ_INDEX: -+ ret = dec_index(s, b); -+ if (ret != XZ_STREAM_END) -+ return ret; -+ -+ s->sequence = SEQ_INDEX_PADDING; -+ -+ case SEQ_INDEX_PADDING: -+ while ((s->index.size + (b->in_pos - s->in_start)) -+ & 3) { -+ if (b->in_pos == b->in_size) { -+ index_update(s, b); -+ return XZ_OK; -+ } -+ -+ if (b->in[b->in_pos++] != 0) -+ return XZ_DATA_ERROR; -+ } -+ -+ /* Finish the CRC32 value and Index size. */ -+ index_update(s, b); -+ -+ /* Compare the hashes to validate the Index field. */ -+ if (!memeq(&s->block.hash, &s->index.hash, -+ sizeof(s->block.hash))) -+ return XZ_DATA_ERROR; -+ -+ s->sequence = SEQ_INDEX_CRC32; -+ -+ case SEQ_INDEX_CRC32: -+ ret = crc32_validate(s, b); -+ if (ret != XZ_STREAM_END) -+ return ret; -+ -+ s->temp.size = STREAM_HEADER_SIZE; -+ s->sequence = SEQ_STREAM_FOOTER; -+ -+ case SEQ_STREAM_FOOTER: -+ if (!fill_temp(s, b)) -+ return XZ_OK; -+ -+ return dec_stream_footer(s); -+ } -+ } -+ -+ /* Never reached */ -+} -+ -+XZ_EXTERN void INIT xz_dec_reset(struct xz_dec *s) -+{ -+ s->sequence = SEQ_STREAM_HEADER; -+ s->allow_buf_error = false; -+ s->pos = 0; -+ s->crc32 = 0; -+ memzero(&s->block, sizeof(s->block)); -+ memzero(&s->index, sizeof(s->index)); -+ s->temp.pos = 0; -+ s->temp.size = STREAM_HEADER_SIZE; -+} -+ -+/* -+ * xz_dec_run() is a wrapper for dec_main() to handle some special cases in -+ * multi-call and single-call decoding. -+ * -+ * In multi-call mode, we must return XZ_BUF_ERROR when it seems clear that we -+ * are not going to make any progress anymore. This is to prevent the caller -+ * from calling us infinitely when the input file is truncated or otherwise -+ * corrupt. Since zlib-style API allows that the caller fills the input buffer -+ * only when the decoder doesn't produce any new output, we have to be careful -+ * to avoid returning XZ_BUF_ERROR too easily: XZ_BUF_ERROR is returned only -+ * after the second consecutive call to xz_dec_run() that makes no progress. -+ * -+ * In single-call mode, if we couldn't decode everything and no error -+ * occurred, either the input is truncated or the output buffer is too small. -+ * Since we know that the last input byte never produces any output, we know -+ * that if all the input was consumed and decoding wasn't finished, the file -+ * must be corrupt. Otherwise the output buffer has to be too small or the -+ * file is corrupt in a way that decoding it produces too big output. -+ * -+ * If single-call decoding fails, we reset b->in_pos and b->out_pos back to -+ * their original values. This is because with some filter chains there won't -+ * be any valid uncompressed data in the output buffer unless the decoding -+ * actually succeeds (that's the price to pay of using the output buffer as -+ * the workspace). -+ */ -+XZ_EXTERN enum xz_ret INIT xz_dec_run(struct xz_dec *s, struct xz_buf *b) -+{ -+ size_t in_start; -+ size_t out_start; -+ enum xz_ret ret; -+ -+ if (DEC_IS_SINGLE(s->mode)) -+ xz_dec_reset(s); -+ -+ in_start = b->in_pos; -+ out_start = b->out_pos; -+ ret = dec_main(s, b); -+ -+ if (DEC_IS_SINGLE(s->mode)) { -+ if (ret == XZ_OK) -+ ret = b->in_pos == b->in_size -+ ? XZ_DATA_ERROR : XZ_BUF_ERROR; -+ -+ if (ret != XZ_STREAM_END) { -+ b->in_pos = in_start; -+ b->out_pos = out_start; -+ } -+ -+ } else if (ret == XZ_OK && in_start == b->in_pos -+ && out_start == b->out_pos) { -+ if (s->allow_buf_error) -+ ret = XZ_BUF_ERROR; -+ -+ s->allow_buf_error = true; -+ } else { -+ s->allow_buf_error = false; -+ } -+ -+ return ret; -+} -+ -+XZ_EXTERN struct xz_dec *INIT xz_dec_init(enum xz_mode mode, uint32_t dict_max) -+{ -+ struct xz_dec *s = malloc(sizeof(*s)); -+ if (s == NULL) -+ return NULL; -+ -+ s->mode = mode; -+ -+#ifdef XZ_DEC_BCJ -+ s->bcj = xz_dec_bcj_create(DEC_IS_SINGLE(mode)); -+ if (s->bcj == NULL) -+ goto error_bcj; -+#endif -+ -+ s->lzma2 = xz_dec_lzma2_create(mode, dict_max); -+ if (s->lzma2 == NULL) -+ goto error_lzma2; -+ -+ xz_dec_reset(s); -+ return s; -+ -+error_lzma2: -+#ifdef XZ_DEC_BCJ -+ xz_dec_bcj_end(s->bcj); -+error_bcj: -+#endif -+ free(s); -+ return NULL; -+} -+ -+XZ_EXTERN void INIT xz_dec_end(struct xz_dec *s) -+{ -+ if (s != NULL) { -+ xz_dec_lzma2_end(s->lzma2); -+#ifdef XZ_DEC_BCJ -+ xz_dec_bcj_end(s->bcj); -+#endif -+ free(s); -+ } -+} -diff --git a/xen/common/xz/lzma2.h b/xen/common/xz/lzma2.h -new file mode 100644 ---- /dev/null -+++ b/xen/common/xz/lzma2.h -@@ -0,0 +1,204 @@ -+/* -+ * LZMA2 definitions -+ * -+ * Authors: Lasse Collin -+ * Igor Pavlov -+ * -+ * This file has been put into the public domain. -+ * You can do whatever you want with this file. -+ */ -+ -+#ifndef XZ_LZMA2_H -+#define XZ_LZMA2_H -+ -+/* Range coder constants */ -+#define RC_SHIFT_BITS 8 -+#define RC_TOP_BITS 24 -+#define RC_TOP_VALUE (1 << RC_TOP_BITS) -+#define RC_BIT_MODEL_TOTAL_BITS 11 -+#define RC_BIT_MODEL_TOTAL (1 << RC_BIT_MODEL_TOTAL_BITS) -+#define RC_MOVE_BITS 5 -+ -+/* -+ * Maximum number of position states. A position state is the lowest pb -+ * number of bits of the current uncompressed offset. In some places there -+ * are different sets of probabilities for different position states. -+ */ -+#define POS_STATES_MAX (1 << 4) -+ -+/* -+ * This enum is used to track which LZMA symbols have occurred most recently -+ * and in which order. This information is used to predict the next symbol. -+ * -+ * Symbols: -+ * - Literal: One 8-bit byte -+ * - Match: Repeat a chunk of data at some distance -+ * - Long repeat: Multi-byte match at a recently seen distance -+ * - Short repeat: One-byte repeat at a recently seen distance -+ * -+ * The symbol names are in from STATE_oldest_older_previous. REP means -+ * either short or long repeated match, and NONLIT means any non-literal. -+ */ -+enum lzma_state { -+ STATE_LIT_LIT, -+ STATE_MATCH_LIT_LIT, -+ STATE_REP_LIT_LIT, -+ STATE_SHORTREP_LIT_LIT, -+ STATE_MATCH_LIT, -+ STATE_REP_LIT, -+ STATE_SHORTREP_LIT, -+ STATE_LIT_MATCH, -+ STATE_LIT_LONGREP, -+ STATE_LIT_SHORTREP, -+ STATE_NONLIT_MATCH, -+ STATE_NONLIT_REP -+}; -+ -+/* Total number of states */ -+#define STATES 12 -+ -+/* The lowest 7 states indicate that the previous state was a literal. */ -+#define LIT_STATES 7 -+ -+/* Indicate that the latest symbol was a literal. */ -+static inline void INIT lzma_state_literal(enum lzma_state *state) -+{ -+ if (*state <= STATE_SHORTREP_LIT_LIT) -+ *state = STATE_LIT_LIT; -+ else if (*state <= STATE_LIT_SHORTREP) -+ *state -= 3; -+ else -+ *state -= 6; -+} -+ -+/* Indicate that the latest symbol was a match. */ -+static inline void INIT lzma_state_match(enum lzma_state *state) -+{ -+ *state = *state < LIT_STATES ? STATE_LIT_MATCH : STATE_NONLIT_MATCH; -+} -+ -+/* Indicate that the latest state was a long repeated match. */ -+static inline void INIT lzma_state_long_rep(enum lzma_state *state) -+{ -+ *state = *state < LIT_STATES ? STATE_LIT_LONGREP : STATE_NONLIT_REP; -+} -+ -+/* Indicate that the latest symbol was a short match. */ -+static inline void INIT lzma_state_short_rep(enum lzma_state *state) -+{ -+ *state = *state < LIT_STATES ? STATE_LIT_SHORTREP : STATE_NONLIT_REP; -+} -+ -+/* Test if the previous symbol was a literal. */ -+static inline bool_t INIT lzma_state_is_literal(enum lzma_state state) -+{ -+ return state < LIT_STATES; -+} -+ -+/* Each literal coder is divided in three sections: -+ * - 0x001-0x0FF: Without match byte -+ * - 0x101-0x1FF: With match byte; match bit is 0 -+ * - 0x201-0x2FF: With match byte; match bit is 1 -+ * -+ * Match byte is used when the previous LZMA symbol was something else than -+ * a literal (that is, it was some kind of match). -+ */ -+#define LITERAL_CODER_SIZE 0x300 -+ -+/* Maximum number of literal coders */ -+#define LITERAL_CODERS_MAX (1 << 4) -+ -+/* Minimum length of a match is two bytes. */ -+#define MATCH_LEN_MIN 2 -+ -+/* Match length is encoded with 4, 5, or 10 bits. -+ * -+ * Length Bits -+ * 2-9 4 = Choice=0 + 3 bits -+ * 10-17 5 = Choice=1 + Choice2=0 + 3 bits -+ * 18-273 10 = Choice=1 + Choice2=1 + 8 bits -+ */ -+#define LEN_LOW_BITS 3 -+#define LEN_LOW_SYMBOLS (1 << LEN_LOW_BITS) -+#define LEN_MID_BITS 3 -+#define LEN_MID_SYMBOLS (1 << LEN_MID_BITS) -+#define LEN_HIGH_BITS 8 -+#define LEN_HIGH_SYMBOLS (1 << LEN_HIGH_BITS) -+#define LEN_SYMBOLS (LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS + LEN_HIGH_SYMBOLS) -+ -+/* -+ * Maximum length of a match is 273 which is a result of the encoding -+ * described above. -+ */ -+#define MATCH_LEN_MAX (MATCH_LEN_MIN + LEN_SYMBOLS - 1) -+ -+/* -+ * Different sets of probabilities are used for match distances that have -+ * very short match length: Lengths of 2, 3, and 4 bytes have a separate -+ * set of probabilities for each length. The matches with longer length -+ * use a shared set of probabilities. -+ */ -+#define DIST_STATES 4 -+ -+/* -+ * Get the index of the appropriate probability array for decoding -+ * the distance slot. -+ */ -+static inline uint32_t INIT lzma_get_dist_state(uint32_t len) -+{ -+ return len < DIST_STATES + MATCH_LEN_MIN -+ ? len - MATCH_LEN_MIN : DIST_STATES - 1; -+} -+ -+/* -+ * The highest two bits of a 32-bit match distance are encoded using six bits. -+ * This six-bit value is called a distance slot. This way encoding a 32-bit -+ * value takes 6-36 bits, larger values taking more bits. -+ */ -+#define DIST_SLOT_BITS 6 -+#define DIST_SLOTS (1 << DIST_SLOT_BITS) -+ -+/* Match distances up to 127 are fully encoded using probabilities. Since -+ * the highest two bits (distance slot) are always encoded using six bits, -+ * the distances 0-3 don't need any additional bits to encode, since the -+ * distance slot itself is the same as the actual distance. DIST_MODEL_START -+ * indicates the first distance slot where at least one additional bit is -+ * needed. -+ */ -+#define DIST_MODEL_START 4 -+ -+/* -+ * Match distances greater than 127 are encoded in three pieces: -+ * - distance slot: the highest two bits -+ * - direct bits: 2-26 bits below the highest two bits -+ * - alignment bits: four lowest bits -+ * -+ * Direct bits don't use any probabilities. -+ * -+ * The distance slot value of 14 is for distances 128-191. -+ */ -+#define DIST_MODEL_END 14 -+ -+/* Distance slots that indicate a distance <= 127. */ -+#define FULL_DISTANCES_BITS (DIST_MODEL_END / 2) -+#define FULL_DISTANCES (1 << FULL_DISTANCES_BITS) -+ -+/* -+ * For match distances greater than 127, only the highest two bits and the -+ * lowest four bits (alignment) is encoded using probabilities. -+ */ -+#define ALIGN_BITS 4 -+#define ALIGN_SIZE (1 << ALIGN_BITS) -+#define ALIGN_MASK (ALIGN_SIZE - 1) -+ -+/* Total number of all probability variables */ -+#define PROBS_TOTAL (1846 + LITERAL_CODERS_MAX * LITERAL_CODER_SIZE) -+ -+/* -+ * LZMA remembers the four most recent match distances. Reusing these -+ * distances tends to take less space than re-encoding the actual -+ * distance value. -+ */ -+#define REPS 4 -+ -+#endif -diff --git a/xen/common/xz/private.h b/xen/common/xz/private.h -new file mode 100644 ---- /dev/null -+++ b/xen/common/xz/private.h -@@ -0,0 +1,271 @@ -+/* -+ * Private includes and definitions -+ * -+ * Author: Lasse Collin -+ * -+ * This file has been put into the public domain. -+ * You can do whatever you want with this file. -+ */ -+ -+#ifndef XZ_PRIVATE_H -+#define XZ_PRIVATE_H -+ -+#include -+#include -+#define get_le32(p) le32_to_cpup((const uint32_t *)(p)) -+ -+#if 1 /* ndef CONFIG_??? */ -+static inline u32 INIT get_unaligned_le32(void *p) -+{ -+ return le32_to_cpup(p); -+} -+ -+static inline void INIT put_unaligned_le32(u32 val, void *p) -+{ -+ *(__force __le32*)p = cpu_to_le32(val); -+} -+#else -+#include -+ -+static inline u32 INIT get_unaligned_le32(void *p) -+{ -+ return le32_to_cpu(__get_unaligned(p, 4)); -+} -+ -+static inline void INIT put_unaligned_le32(u32 val, void *p) -+{ -+ __put_unaligned(cpu_to_le32(val), p, 4); -+} -+#endif -+ -+#define false 0 -+#define true 1 -+ -+/** -+ * enum xz_mode - Operation mode -+ * -+ * @XZ_SINGLE: Single-call mode. This uses less RAM than -+ * than multi-call modes, because the LZMA2 -+ * dictionary doesn't need to be allocated as -+ * part of the decoder state. All required data -+ * structures are allocated at initialization, -+ * so xz_dec_run() cannot return XZ_MEM_ERROR. -+ * @XZ_PREALLOC: Multi-call mode with preallocated LZMA2 -+ * dictionary buffer. All data structures are -+ * allocated at initialization, so xz_dec_run() -+ * cannot return XZ_MEM_ERROR. -+ * @XZ_DYNALLOC: Multi-call mode. The LZMA2 dictionary is -+ * allocated once the required size has been -+ * parsed from the stream headers. If the -+ * allocation fails, xz_dec_run() will return -+ * XZ_MEM_ERROR. -+ * -+ * It is possible to enable support only for a subset of the above -+ * modes at compile time by defining XZ_DEC_SINGLE, XZ_DEC_PREALLOC, -+ * or XZ_DEC_DYNALLOC. The xz_dec kernel module is always compiled -+ * with support for all operation modes, but the preboot code may -+ * be built with fewer features to minimize code size. -+ */ -+enum xz_mode { -+ XZ_SINGLE, -+ XZ_PREALLOC, -+ XZ_DYNALLOC -+}; -+ -+/** -+ * enum xz_ret - Return codes -+ * @XZ_OK: Everything is OK so far. More input or more -+ * output space is required to continue. This -+ * return code is possible only in multi-call mode -+ * (XZ_PREALLOC or XZ_DYNALLOC). -+ * @XZ_STREAM_END: Operation finished successfully. -+ * @XZ_UNSUPPORTED_CHECK: Integrity check type is not supported. Decoding -+ * is still possible in multi-call mode by simply -+ * calling xz_dec_run() again. -+ * Note that this return value is used only if -+ * XZ_DEC_ANY_CHECK was defined at build time, -+ * which is not used in the kernel. Unsupported -+ * check types return XZ_OPTIONS_ERROR if -+ * XZ_DEC_ANY_CHECK was not defined at build time. -+ * @XZ_MEM_ERROR: Allocating memory failed. This return code is -+ * possible only if the decoder was initialized -+ * with XZ_DYNALLOC. The amount of memory that was -+ * tried to be allocated was no more than the -+ * dict_max argument given to xz_dec_init(). -+ * @XZ_MEMLIMIT_ERROR: A bigger LZMA2 dictionary would be needed than -+ * allowed by the dict_max argument given to -+ * xz_dec_init(). This return value is possible -+ * only in multi-call mode (XZ_PREALLOC or -+ * XZ_DYNALLOC); the single-call mode (XZ_SINGLE) -+ * ignores the dict_max argument. -+ * @XZ_FORMAT_ERROR: File format was not recognized (wrong magic -+ * bytes). -+ * @XZ_OPTIONS_ERROR: This implementation doesn't support the requested -+ * compression options. In the decoder this means -+ * that the header CRC32 matches, but the header -+ * itself specifies something that we don't support. -+ * @XZ_DATA_ERROR: Compressed data is corrupt. -+ * @XZ_BUF_ERROR: Cannot make any progress. Details are slightly -+ * different between multi-call and single-call -+ * mode; more information below. -+ * -+ * In multi-call mode, XZ_BUF_ERROR is returned when two consecutive calls -+ * to XZ code cannot consume any input and cannot produce any new output. -+ * This happens when there is no new input available, or the output buffer -+ * is full while at least one output byte is still pending. Assuming your -+ * code is not buggy, you can get this error only when decoding a compressed -+ * stream that is truncated or otherwise corrupt. -+ * -+ * In single-call mode, XZ_BUF_ERROR is returned only when the output buffer -+ * is too small or the compressed input is corrupt in a way that makes the -+ * decoder produce more output than the caller expected. When it is -+ * (relatively) clear that the compressed input is truncated, XZ_DATA_ERROR -+ * is used instead of XZ_BUF_ERROR. -+ */ -+enum xz_ret { -+ XZ_OK, -+ XZ_STREAM_END, -+ XZ_UNSUPPORTED_CHECK, -+ XZ_MEM_ERROR, -+ XZ_MEMLIMIT_ERROR, -+ XZ_FORMAT_ERROR, -+ XZ_OPTIONS_ERROR, -+ XZ_DATA_ERROR, -+ XZ_BUF_ERROR -+}; -+ -+/** -+ * struct xz_buf - Passing input and output buffers to XZ code -+ * @in: Beginning of the input buffer. This may be NULL if and only -+ * if in_pos is equal to in_size. -+ * @in_pos: Current position in the input buffer. This must not exceed -+ * in_size. -+ * @in_size: Size of the input buffer -+ * @out: Beginning of the output buffer. This may be NULL if and only -+ * if out_pos is equal to out_size. -+ * @out_pos: Current position in the output buffer. This must not exceed -+ * out_size. -+ * @out_size: Size of the output buffer -+ * -+ * Only the contents of the output buffer from out[out_pos] onward, and -+ * the variables in_pos and out_pos are modified by the XZ code. -+ */ -+struct xz_buf { -+ const uint8_t *in; -+ size_t in_pos; -+ size_t in_size; -+ -+ uint8_t *out; -+ size_t out_pos; -+ size_t out_size; -+}; -+ -+/** -+ * struct xz_dec - Opaque type to hold the XZ decoder state -+ */ -+struct xz_dec; -+ -+/* If no specific decoding mode is requested, enable support for all modes. */ -+#if !defined(XZ_DEC_SINGLE) && !defined(XZ_DEC_PREALLOC) \ -+ && !defined(XZ_DEC_DYNALLOC) -+# define XZ_DEC_SINGLE -+# define XZ_DEC_PREALLOC -+# define XZ_DEC_DYNALLOC -+#endif -+ -+/* -+ * The DEC_IS_foo(mode) macros are used in "if" statements. If only some -+ * of the supported modes are enabled, these macros will evaluate to true or -+ * false at compile time and thus allow the compiler to omit unneeded code. -+ */ -+#ifdef XZ_DEC_SINGLE -+# define DEC_IS_SINGLE(mode) ((mode) == XZ_SINGLE) -+#else -+# define DEC_IS_SINGLE(mode) (false) -+#endif -+ -+#ifdef XZ_DEC_PREALLOC -+# define DEC_IS_PREALLOC(mode) ((mode) == XZ_PREALLOC) -+#else -+# define DEC_IS_PREALLOC(mode) (false) -+#endif -+ -+#ifdef XZ_DEC_DYNALLOC -+# define DEC_IS_DYNALLOC(mode) ((mode) == XZ_DYNALLOC) -+#else -+# define DEC_IS_DYNALLOC(mode) (false) -+#endif -+ -+#if !defined(XZ_DEC_SINGLE) -+# define DEC_IS_MULTI(mode) (true) -+#elif defined(XZ_DEC_PREALLOC) || defined(XZ_DEC_DYNALLOC) -+# define DEC_IS_MULTI(mode) ((mode) != XZ_SINGLE) -+#else -+# define DEC_IS_MULTI(mode) (false) -+#endif -+ -+/* -+ * If any of the BCJ filter decoders are wanted, define XZ_DEC_BCJ. -+ * XZ_DEC_BCJ is used to enable generic support for BCJ decoders. -+ */ -+#ifndef XZ_DEC_BCJ -+# if defined(XZ_DEC_X86) || defined(XZ_DEC_POWERPC) \ -+ || defined(XZ_DEC_IA64) || defined(XZ_DEC_ARM) \ -+ || defined(XZ_DEC_ARM) || defined(XZ_DEC_ARMTHUMB) \ -+ || defined(XZ_DEC_SPARC) -+# define XZ_DEC_BCJ -+# endif -+#endif -+ -+/* -+ * Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used -+ * before calling xz_dec_lzma2_run(). -+ */ -+XZ_EXTERN struct xz_dec_lzma2 *xz_dec_lzma2_create(enum xz_mode mode, -+ uint32_t dict_max); -+ -+/* -+ * Decode the LZMA2 properties (one byte) and reset the decoder. Return -+ * XZ_OK on success, XZ_MEMLIMIT_ERROR if the preallocated dictionary is not -+ * big enough, and XZ_OPTIONS_ERROR if props indicates something that this -+ * decoder doesn't support. -+ */ -+XZ_EXTERN enum xz_ret xz_dec_lzma2_reset(struct xz_dec_lzma2 *s, -+ uint8_t props); -+ -+/* Decode raw LZMA2 stream from b->in to b->out. */ -+XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s, -+ struct xz_buf *b); -+ -+/* Free the memory allocated for the LZMA2 decoder. */ -+XZ_EXTERN void xz_dec_lzma2_end(struct xz_dec_lzma2 *s); -+ -+#ifdef XZ_DEC_BCJ -+/* -+ * Allocate memory for BCJ decoders. xz_dec_bcj_reset() must be used before -+ * calling xz_dec_bcj_run(). -+ */ -+XZ_EXTERN struct xz_dec_bcj *xz_dec_bcj_create(bool_t single_call); -+ -+/* -+ * Decode the Filter ID of a BCJ filter. This implementation doesn't -+ * support custom start offsets, so no decoding of Filter Properties -+ * is needed. Returns XZ_OK if the given Filter ID is supported. -+ * Otherwise XZ_OPTIONS_ERROR is returned. -+ */ -+XZ_EXTERN enum xz_ret xz_dec_bcj_reset(struct xz_dec_bcj *s, uint8_t id); -+ -+/* -+ * Decode raw BCJ + LZMA2 stream. This must be used only if there actually is -+ * a BCJ filter in the chain. If the chain has only LZMA2, xz_dec_lzma2_run() -+ * must be called directly. -+ */ -+XZ_EXTERN enum xz_ret xz_dec_bcj_run(struct xz_dec_bcj *s, -+ struct xz_dec_lzma2 *lzma2, -+ struct xz_buf *b); -+ -+/* Free the memory allocated for the BCJ filters. */ -+#define xz_dec_bcj_end(s) free(s) -+#endif -+ -+#endif -diff --git a/xen/common/xz/stream.h b/xen/common/xz/stream.h -new file mode 100644 ---- /dev/null -+++ b/xen/common/xz/stream.h -@@ -0,0 +1,55 @@ -+/* -+ * Definitions for handling the .xz file format -+ * -+ * Author: Lasse Collin -+ * -+ * This file has been put into the public domain. -+ * You can do whatever you want with this file. -+ */ -+ -+#ifndef XZ_STREAM_H -+#define XZ_STREAM_H -+ -+/* -+ * See the .xz file format specification at -+ * http://tukaani.org/xz/xz-file-format.txt -+ * to understand the container format. -+ */ -+ -+#define STREAM_HEADER_SIZE 12 -+ -+#define HEADER_MAGIC "\3757zXZ" -+#define HEADER_MAGIC_SIZE 6 -+ -+#define FOOTER_MAGIC "YZ" -+#define FOOTER_MAGIC_SIZE 2 -+ -+/* -+ * Variable-length integer can hold a 63-bit unsigned integer or a special -+ * value indicating that the value is unknown. -+ * -+ * Experimental: vli_type can be defined to uint32_t to save a few bytes -+ * in code size (no effect on speed). Doing so limits the uncompressed and -+ * compressed size of the file to less than 256 MiB and may also weaken -+ * error detection slightly. -+ */ -+typedef uint64_t vli_type; -+ -+#define VLI_MAX ((vli_type)-1 / 2) -+#define VLI_UNKNOWN ((vli_type)-1) -+ -+/* Maximum encoded size of a VLI */ -+#define VLI_BYTES_MAX (sizeof(vli_type) * 8 / 7) -+ -+/* Integrity Check types */ -+enum xz_check { -+ XZ_CHECK_NONE = 0, -+ XZ_CHECK_CRC32 = 1, -+ XZ_CHECK_CRC64 = 4, -+ XZ_CHECK_SHA256 = 10 -+}; -+ -+/* Maximum possible Check ID */ -+#define XZ_CHECK_MAX 15 -+ -+#endif -diff --git a/xen/include/xen/decompress.h b/xen/include/xen/decompress.h ---- a/xen/include/xen/decompress.h -+++ b/xen/include/xen/decompress.h -@@ -31,7 +31,7 @@ - * dependent). - */ - --decompress_fn bunzip2, unlzma, unlzo; -+decompress_fn bunzip2, unxz, unlzma, unlzo; - - int decompress(void *inbuf, unsigned int len, void *outbuf); \ No newline at end of file diff --git a/kernels/xen/proc-xen.mount b/kernels/xen/proc-xen.mount new file mode 100644 index 000000000..0eaa59c5f --- /dev/null +++ b/kernels/xen/proc-xen.mount @@ -0,0 +1,9 @@ +[Unit] +Description=Mount /proc/xen files +ConditionPathExists=/proc/xen +RefuseManualStop=true + +[Mount] +What=xenfs +Where=/proc/xen +Type=xenfs diff --git a/kernels/xen/texi2html.patch b/kernels/xen/texi2html.patch new file mode 100644 index 000000000..8f22773c9 --- /dev/null +++ b/kernels/xen/texi2html.patch @@ -0,0 +1,10 @@ +--- a/tools/Makefile 2012-09-17 22:25:54.683349679 -0500 ++++ b/tools/Makefile 2012-09-17 22:49:08.923331802 -0500 +@@ -164,6 +164,7 @@ + $(QEMU_ROOT)/xen-setup \ + --extra-cflags="$(EXTRA_CFLAGS_QEMU_TRADITIONAL)" \ + $(IOEMU_CONFIGURE_CROSS); \ ++ sed -i 's/number[ ]/number-sections /' Makefile; \ + $(MAKE) install + + subdir-clean-qemu-xen-traditional-dir: diff --git a/kernels/xen/var-lib-xenstored.mount b/kernels/xen/var-lib-xenstored.mount new file mode 100644 index 000000000..1c2015ca2 --- /dev/null +++ b/kernels/xen/var-lib-xenstored.mount @@ -0,0 +1,10 @@ +[Unit] +Description=mount xenstore file system +ConditionPathExists=/proc/xen +RefuseManualStop=true + +[Mount] +What=xenstore +Where=/var/lib/xenstored +Type=tmpfs +Options=mode=755 diff --git a/kernels/xen/xen.conf b/kernels/xen/xen.conf new file mode 100644 index 000000000..37a5b59f7 --- /dev/null +++ b/kernels/xen/xen.conf @@ -0,0 +1,19 @@ +xen-evtchn +xen-gntdev +xen-gntalloc +xen-blkback +xen-netback +xen-pciback +xen-acpi-processor +## xen-acpi-processor: This module may not work on all machines; try removing this first if it causes issues. + +## The following were included in xencommons, but were not inserted by systemd: +# evtchn +# gntdev +# netbk +# blkbk +# xen-scsibk +# usbbk +# pciback +# blktap2 +# blktap diff --git a/kernels/xen/xen.install b/kernels/xen/xen.install new file mode 100644 index 000000000..5664948c7 --- /dev/null +++ b/kernels/xen/xen.install @@ -0,0 +1,38 @@ +install_msg() { + cat << __EOF__ +===> IMPORTANT NOTICE: + +In order to complete the installation, and enable Xen, +at the very least you must: +1. Edit your GRUB2 config files as specified at + https://wiki.archlinux.org/index.php/Xen#Bootloader_Configuration +2. Issue the following commands to allow you to create and start VMs: + systemctl enable xenstored.service + systemctl enable xenconsoled.service + systemctl enable xendomains.service +For more information refer to the Wiki: + https://wiki.archlinux.org/index.php/Xen +__EOF__ + +} + +post_upgrade() { + install_msg +} + +pre_remove() { + for i in xen{stored,consoled,domains}.service; do + systemctl disable $serv + systemctl stop $serv + done +} + +post_remove() { + cat << __EOF__ +===> IMPORTANT NOTICE: + +In order to finish removing Xen, you will need to modify +your bootloader configuration files to load your Linux +kernel instead of Xen kernel. +__EOF__ +} diff --git a/kernels/xen/xen.patch b/kernels/xen/xen.patch deleted file mode 100755 index 8b1b5585d..000000000 --- a/kernels/xen/xen.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- xen-4.0.1.orig/Config.mk 2010-08-25 12:22:44.000000000 +0200 -+++ xen-4.0.1/Config.mk 2010-11-02 23:38:11.575000000 +0100 -@@ -187,4 +187,4 @@ - CONFIG_MINITERM ?= n - CONFIG_LOMOUNT ?= n - ---include $(XEN_ROOT)/.config -+#-include $(XEN_ROOT)/.config - ---- xen-4.0.1/Config.mk.orig 2010-08-25 11:22:44.000000000 +0100 -+++ xen-4.0.1/Config.mk 2011-01-29 17:40:43.000000000 +0000 -@@ -135,6 +135,8 @@ - - LDFLAGS += $(foreach i, $(EXTRA_LIB), -L$(i)) - CFLAGS += $(foreach i, $(EXTRA_INCLUDES), -I$(i)) -+# temporary compile fix for rawhide -+CFLAGS += -Wunused-but-set-variable -Wno-error=unused-but-set-variable -Wuninitialized -Wno-error=uninitialized - - EMBEDDED_EXTRA_CFLAGS := -nopie -fno-stack-protector -fno-stack-protector-all - EMBEDDED_EXTRA_CFLAGS += -fno-exceptions - diff --git a/kernels/xen/xenconsoled.service b/kernels/xen/xenconsoled.service new file mode 100644 index 000000000..edcc8e69f --- /dev/null +++ b/kernels/xen/xenconsoled.service @@ -0,0 +1,18 @@ +[Unit] +Description=Xenconsoled - handles logging from guest consoles and hypervisor +Requires=proc-xen.mount +After=proc-xen.mount xenstored.service +ConditionPathExists=/proc/xen + +[Service] +Type=simple +Environment=XENCONSOLED_ARGS= +Environment=XENCONSOLED_LOG=none +Environment=XENCONSOLED_LOG_DIR=/var/log/xen/console +EnvironmentFile=-/etc/conf.d/xenconsoled +PIDFile=/var/run/xenconsoled.pid +ExecStartPre=/usr/bin/grep -q control_d /proc/xen/capabilities +ExecStart=/usr/sbin/xenconsoled --log=${XENCONSOLED_LOG} --log-dir=${XENCONSOLED_LOG_DIR} $XENCONSOLED_ARGS + +[Install] +WantedBy=multi-user.target diff --git a/kernels/xen/xendomU@.service b/kernels/xen/xendomU@.service new file mode 100644 index 000000000..57d6e520d --- /dev/null +++ b/kernels/xen/xendomU@.service @@ -0,0 +1,12 @@ +[Unit] +Description=xen domU service for domain %i +Requires=xenstored.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/sbin/xl create /etc/xen/conf/%i.cfg +ExecStop=/usr/sbin/xl shutdown %i + +[Install] +WantedBy=multi-user.target diff --git a/kernels/xen/xendomains.service b/kernels/xen/xendomains.service new file mode 100644 index 000000000..d49bd5593 --- /dev/null +++ b/kernels/xen/xendomains.service @@ -0,0 +1,15 @@ +[Unit] +Description=Xendomains - start and stop guests on boot and shutdown +Requires=proc-xen.mount xenstored.service +After=proc-xen.mount xenstored.service xenconsoled.service +ConditionPathExists=/proc/xen + +[Service] +Type=oneshot +RemainAfterExit=true +ExecStartPre=/usr/bin/grep -q control_d /proc/xen/capabilities +ExecStart=/etc/xen/scripts/xendomains start +ExecStop=/etc/xen/scripts/xendomains stop + +[Install] +WantedBy=multi-user.target diff --git a/kernels/xen/xenstored.service b/kernels/xen/xenstored.service new file mode 100644 index 000000000..9025f2244 --- /dev/null +++ b/kernels/xen/xenstored.service @@ -0,0 +1,18 @@ +[Unit] +Description=Xenstored - daemon managing xenstore file system +Requires=proc-xen.mount var-lib-xenstored.mount +After=proc-xen.mount var-lib-xenstored.mount +Before=libvirtd.service libvirt-guests.service +RefuseManualStop=true +ConditionPathExists=/proc/xen + +[Service] +Type=forking +Environment=XENSTORED_ARGS= +EnvironmentFile=-/etc/conf.d/xenstored +PIDFile=/var/run/xenstored.pid +ExecStartPre=/usr/bin/grep -q control_d /proc/xen/capabilities +ExecStart=/usr/sbin/xenstored --pid-file /var/run/xenstored.pid $XENSTORED_ARGS + +[Install] +WantedBy=multi-user.target -- cgit v1.2.3