diff --git a/0001-Handle-CPU-interrupts-by-inline-checking-of-a-flag.patch b/0001-Handle-CPU-interrupts-by-inline-checking-of-a-flag.patch index 6cecf42c..2ddbfde7 100644 --- a/0001-Handle-CPU-interrupts-by-inline-checking-of-a-flag.patch +++ b/0001-Handle-CPU-interrupts-by-inline-checking-of-a-flag.patch @@ -1,7 +1,7 @@ From 4cc09e9530fb08123594be6c72dfc381df5dcddc Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Wed, 5 Oct 2011 10:04:02 +0100 -Subject: [PATCH 01/44] Handle CPU interrupts by inline checking of a flag +Subject: [PATCH] Handle CPU interrupts by inline checking of a flag Fix the nasty TCG race conditions and crashes by implementing cpu_exit as setting a flag which is checked at the start of each TB. This is diff --git a/0002-linux-user-fix-QEMU_STRACE-1-segfault.patch b/0002-linux-user-fix-QEMU_STRACE-1-segfault.patch index 9191413f..57548a01 100644 --- a/0002-linux-user-fix-QEMU_STRACE-1-segfault.patch +++ b/0002-linux-user-fix-QEMU_STRACE-1-segfault.patch @@ -1,7 +1,7 @@ From 0588bc446fd48bdb1965a6773d008c05a4ba16c1 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sun, 20 Nov 2011 13:02:54 +0100 -Subject: [PATCH 02/44] linux-user: fix QEMU_STRACE=1 segfault +Subject: [PATCH] linux-user: fix QEMU_STRACE=1 segfault While debugging some issues with QEMU_STRACE I stumbled over segmentation faults that were pretty reproducible. Turns out we tried to treat a diff --git a/0003-linux-user-save-auxv-length.patch b/0003-linux-user-save-auxv-length.patch index 1f80a753..1e083a74 100644 --- a/0003-linux-user-save-auxv-length.patch +++ b/0003-linux-user-save-auxv-length.patch @@ -1,7 +1,7 @@ From 67c12998086c44ebef7f92a394154d6aba446178 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 2 Nov 2011 09:23:22 +0000 -Subject: [PATCH 03/44] linux-user: save auxv length +Subject: [PATCH] linux-user: save auxv length We create our own AUXV segment on stack and save a pointer to it. However we don't save the length of it, so any code that wants to diff --git a/0004-linux-user-add-open-hijack-infrastructure.patch b/0004-linux-user-add-open-hijack-infrastructure.patch index 6dd005a1..f9621ce8 100644 --- a/0004-linux-user-add-open-hijack-infrastructure.patch +++ b/0004-linux-user-add-open-hijack-infrastructure.patch @@ -1,7 +1,7 @@ From 99590488e94b6b7f10ecf9a99398fd24a69a7039 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 2 Nov 2011 09:23:23 +0000 -Subject: [PATCH 04/44] linux-user: add open() hijack infrastructure +Subject: [PATCH] linux-user: add open() hijack infrastructure There are a number of files in /proc that expose host information to the guest program. This patch adds infrastructure to override diff --git a/0005-linux-user-fake-proc-self-maps.patch b/0005-linux-user-fake-proc-self-maps.patch index 280895a6..aff0fa08 100644 --- a/0005-linux-user-fake-proc-self-maps.patch +++ b/0005-linux-user-fake-proc-self-maps.patch @@ -1,7 +1,7 @@ From 059e727a9a4be00de949769105e9e0ea876fc64b Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 2 Nov 2011 09:23:24 +0000 -Subject: [PATCH 05/44] linux-user: fake /proc/self/maps +Subject: [PATCH] linux-user: fake /proc/self/maps glibc's pthread_attr_getstack tries to find the stack range from /proc/self/maps. Unfortunately, /proc is usually the host's /proc diff --git a/0006-linux-user-fake-proc-self-stat.patch b/0006-linux-user-fake-proc-self-stat.patch index 14c8943c..9949cba9 100644 --- a/0006-linux-user-fake-proc-self-stat.patch +++ b/0006-linux-user-fake-proc-self-stat.patch @@ -1,7 +1,7 @@ From 7ee3fd47eed19e4dfa26a8d0176ed3550b8d0ccf Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 2 Nov 2011 09:23:25 +0000 -Subject: [PATCH 06/44] linux-user: fake /proc/self/stat +Subject: [PATCH] linux-user: fake /proc/self/stat The boehm gc finds the program's stack starting pointer by checking /proc/self/stat. Unfortunately, so far it reads diff --git a/0007-linux-user-fake-proc-self-auxv.patch b/0007-linux-user-fake-proc-self-auxv.patch index 781b9a33..12b9fabc 100644 --- a/0007-linux-user-fake-proc-self-auxv.patch +++ b/0007-linux-user-fake-proc-self-auxv.patch @@ -1,7 +1,7 @@ From ddf0d4037b10c07d9e5b168f9f96e60a1601c75b Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 2 Nov 2011 09:23:26 +0000 -Subject: [PATCH 07/44] linux-user: fake /proc/self/auxv +Subject: [PATCH] linux-user: fake /proc/self/auxv Gtk tries to read /proc/self/auxv to find its auxv table instead of taking it from its own program memory space. diff --git a/0008-XXX-dont-dump-core-on-sigabort.patch b/0008-XXX-dont-dump-core-on-sigabort.patch index 0e94354d..2960e652 100644 --- a/0008-XXX-dont-dump-core-on-sigabort.patch +++ b/0008-XXX-dont-dump-core-on-sigabort.patch @@ -1,7 +1,7 @@ From 4bc96d88f91417aa2bb029da2e8343456fe86631 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Mon, 21 Nov 2011 23:50:36 +0100 -Subject: [PATCH 08/44] XXX dont dump core on sigabort +Subject: [PATCH] XXX dont dump core on sigabort --- linux-user/signal.c | 6 ++++++ diff --git a/0009-linux-user-fix-wait-syscall-status-returns.patch b/0009-linux-user-fix-wait-syscall-status-returns.patch index 8ef89512..3579b60f 100644 --- a/0009-linux-user-fix-wait-syscall-status-returns.patch +++ b/0009-linux-user-fix-wait-syscall-status-returns.patch @@ -1,7 +1,7 @@ From ee5137d38109fdcb55a58be447c2c27be2b16eb0 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 22 Nov 2011 17:53:40 +0100 -Subject: [PATCH 09/44] linux-user: fix wait* syscall status returns +Subject: [PATCH] linux-user: fix wait* syscall status returns When calling wait4 or waitpid with a status pointer and WNOHANG, the syscall can potentially not modify the status pointer input. Now if we diff --git a/0010-Revert-linux-user-fix-wait-syscall-status-returns.patch b/0010-Revert-linux-user-fix-wait-syscall-status-returns.patch index 088faab6..34e2ef86 100644 --- a/0010-Revert-linux-user-fix-wait-syscall-status-returns.patch +++ b/0010-Revert-linux-user-fix-wait-syscall-status-returns.patch @@ -1,7 +1,7 @@ From 5cfce885dd1b3a229cd2ea7a94dfe2445ec29417 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 24 Nov 2011 00:38:22 +0100 -Subject: [PATCH 10/44] Revert "linux-user: fix wait* syscall status returns" +Subject: [PATCH] Revert "linux-user: fix wait* syscall status returns" This reverts commit 93092792064d880eb91679004b4761639d754081. --- diff --git a/0011-linux-user-fix-wait-syscall-status-returns.patch b/0011-linux-user-fix-wait-syscall-status-returns.patch index 28bb8081..2e627fbf 100644 --- a/0011-linux-user-fix-wait-syscall-status-returns.patch +++ b/0011-linux-user-fix-wait-syscall-status-returns.patch @@ -1,7 +1,7 @@ From b71ee7a063f7cffdf8a2cf73fcbc1d461fbbb80e Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 24 Nov 2011 00:39:35 +0100 -Subject: [PATCH 11/44] linux-user: fix wait* syscall status returns +Subject: [PATCH] linux-user: fix wait* syscall status returns When calling wait4 or waitpid with a status pointer and WNOHANG, the syscall can potentially not modify the status pointer input. Now if we diff --git a/0012-XXX-linux-user-fake-proc-self-maps-even-more.patch b/0012-XXX-linux-user-fake-proc-self-maps-even-more.patch index 5f06fc7f..8250bb13 100644 --- a/0012-XXX-linux-user-fake-proc-self-maps-even-more.patch +++ b/0012-XXX-linux-user-fake-proc-self-maps-even-more.patch @@ -1,7 +1,7 @@ From 146dddbec44c48417f776d54f823093b464e596c Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Mon, 28 Nov 2011 17:05:24 +0100 -Subject: [PATCH 12/44] XXX linux-user: fake /proc/self/maps even more +Subject: [PATCH] XXX linux-user: fake /proc/self/maps even more --- linux-user/syscall.c | 40 +++++++++++++++++++++++++++++++++++++++- diff --git a/0013-XXX-work-around-SA_RESTART-race-with-boehm-gc-ARM-o.patch b/0013-XXX-work-around-SA_RESTART-race-with-boehm-gc-ARM-o.patch index 725636cf..d872b87a 100644 --- a/0013-XXX-work-around-SA_RESTART-race-with-boehm-gc-ARM-o.patch +++ b/0013-XXX-work-around-SA_RESTART-race-with-boehm-gc-ARM-o.patch @@ -1,7 +1,7 @@ From 79a59902304b66e9270d11901a554e5b22042d6e Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 1 Dec 2011 19:00:01 +0100 -Subject: [PATCH 13/44] XXX work around SA_RESTART race with boehm-gc (ARM only) +Subject: [PATCH] XXX work around SA_RESTART race with boehm-gc (ARM only) --- linux-user/main.c | 25 ++++++++----- diff --git a/0014-XXX-move-qemu-binary-lower-in-address-space-so-we-ha.patch b/0014-XXX-move-qemu-binary-lower-in-address-space-so-we-ha.patch index 243a8ef2..b0a62d82 100644 --- a/0014-XXX-move-qemu-binary-lower-in-address-space-so-we-ha.patch +++ b/0014-XXX-move-qemu-binary-lower-in-address-space-so-we-ha.patch @@ -1,7 +1,7 @@ From e534a77a0e1f880d0f74514ac50de5de3dd4811a Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Mon, 5 Dec 2011 23:37:52 +0100 -Subject: [PATCH 14/44] XXX move qemu binary lower in address space so we have space for guest stuff +Subject: [PATCH] XXX move qemu binary lower in address space so we have space for guest stuff --- x86_64.ld | 2 +- diff --git a/0015-linux-user-map-lower-in-address-space.patch b/0015-linux-user-map-lower-in-address-space.patch index e4afbba7..32813fa6 100644 --- a/0015-linux-user-map-lower-in-address-space.patch +++ b/0015-linux-user-map-lower-in-address-space.patch @@ -1,7 +1,7 @@ From edda5e8f49b7857379733d652d6b259488bd7b70 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 6 Dec 2011 00:39:50 +0100 -Subject: [PATCH 15/44] linux-user: map lower in address space +Subject: [PATCH] linux-user: map lower in address space While trying to compile Java I can into situations where there was simply no virtual address space left for a 32-bit guest to take. For example when diff --git a/0016-XXX-fake-proc-self-maps-also-fclose-real-file.patch b/0016-XXX-fake-proc-self-maps-also-fclose-real-file.patch index 9bb358d7..3f312b68 100644 --- a/0016-XXX-fake-proc-self-maps-also-fclose-real-file.patch +++ b/0016-XXX-fake-proc-self-maps-also-fclose-real-file.patch @@ -1,7 +1,7 @@ From 3580a90d40df10410b7268f89aae58ce05dd2bed Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Thu, 8 Dec 2011 23:19:32 +0100 -Subject: [PATCH 16/44] XXX fake /proc/self/maps: also fclose real file +Subject: [PATCH] XXX fake /proc/self/maps: also fclose real file --- linux-user/syscall.c | 1 + diff --git a/0017-XXX-map-qemu-higher-again-so-we-have-space-for-brk.patch b/0017-XXX-map-qemu-higher-again-so-we-have-space-for-brk.patch index 69b220c5..796cdfb0 100644 --- a/0017-XXX-map-qemu-higher-again-so-we-have-space-for-brk.patch +++ b/0017-XXX-map-qemu-higher-again-so-we-have-space-for-brk.patch @@ -1,7 +1,7 @@ From 91f12fe177833e0112cd7f7cf5781b26377667a5 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sat, 10 Dec 2011 00:03:56 +0100 -Subject: [PATCH 17/44] XXX map qemu higher again so we have space for brk +Subject: [PATCH] XXX map qemu higher again so we have space for brk --- linux-user/mmap.c | 2 +- diff --git a/0018-qemu-0.9.0.cvs-binfmt.patch b/0018-qemu-0.9.0.cvs-binfmt.patch index 57f6ba6f..1d700b06 100644 --- a/0018-qemu-0.9.0.cvs-binfmt.patch +++ b/0018-qemu-0.9.0.cvs-binfmt.patch @@ -1,7 +1,7 @@ From 434801ec78b031170eb0762302b52062e6c27d0e Mon Sep 17 00:00:00 2001 From: Ulrich Hecht Date: Tue, 14 Apr 2009 16:18:44 +0200 -Subject: [PATCH 18/44] qemu-0.9.0.cvs-binfmt +Subject: [PATCH] qemu-0.9.0.cvs-binfmt Fixes binfmt_misc setup script: - x86_64 is i386-compatible diff --git a/0019-qemu-cvs-alsa_bitfield.patch b/0019-qemu-cvs-alsa_bitfield.patch index 0fa39bc7..516defb9 100644 --- a/0019-qemu-cvs-alsa_bitfield.patch +++ b/0019-qemu-cvs-alsa_bitfield.patch @@ -1,7 +1,7 @@ From b41a72d0c29f97610dfdd5573b8be383823bc88f Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 14 Apr 2009 16:20:50 +0200 -Subject: [PATCH 19/44] qemu-cvs-alsa_bitfield +Subject: [PATCH] qemu-cvs-alsa_bitfield Implements TYPE_INTBITFIELD partially. (required for ALSA support) diff --git a/0020-qemu-cvs-alsa_ioctl.patch b/0020-qemu-cvs-alsa_ioctl.patch index a9bf878b..a9bc2a21 100644 --- a/0020-qemu-cvs-alsa_ioctl.patch +++ b/0020-qemu-cvs-alsa_ioctl.patch @@ -1,7 +1,7 @@ From 33f065c217c1921759df12467954eb4638f84a72 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 14 Apr 2009 16:23:27 +0200 -Subject: [PATCH 20/44] qemu-cvs-alsa_ioctl +Subject: [PATCH] qemu-cvs-alsa_ioctl Implements ALSA ioctls on PPC hosts. diff --git a/0021-qemu-cvs-alsa_mmap.patch b/0021-qemu-cvs-alsa_mmap.patch index 930e39c5..978193d5 100644 --- a/0021-qemu-cvs-alsa_mmap.patch +++ b/0021-qemu-cvs-alsa_mmap.patch @@ -1,7 +1,7 @@ From 8b67814c8ab4645ddd43664b1092e78ea6a743d8 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 14 Apr 2009 16:24:15 +0200 -Subject: [PATCH 21/44] qemu-cvs-alsa_mmap +Subject: [PATCH] qemu-cvs-alsa_mmap Hack to prevent ALSA from using mmap() interface to simplify emulation. diff --git a/0022-qemu-cvs-gettimeofday.patch b/0022-qemu-cvs-gettimeofday.patch index 6d128e74..c96fc6f0 100644 --- a/0022-qemu-cvs-gettimeofday.patch +++ b/0022-qemu-cvs-gettimeofday.patch @@ -1,7 +1,7 @@ From c0ce4deb6c2ac843e337b7252fbefc190d625ca5 Mon Sep 17 00:00:00 2001 From: Ulrich Hecht Date: Tue, 14 Apr 2009 16:25:41 +0200 -Subject: [PATCH 22/44] qemu-cvs-gettimeofday +Subject: [PATCH] qemu-cvs-gettimeofday No clue what this is for. --- diff --git a/0023-qemu-cvs-ioctl_debug.patch b/0023-qemu-cvs-ioctl_debug.patch index 47eec797..83b86119 100644 --- a/0023-qemu-cvs-ioctl_debug.patch +++ b/0023-qemu-cvs-ioctl_debug.patch @@ -1,7 +1,7 @@ From 6232258009a4735d7f4f53b5589e7ebd90a9885d Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 14 Apr 2009 16:26:33 +0200 -Subject: [PATCH 23/44] qemu-cvs-ioctl_debug +Subject: [PATCH] qemu-cvs-ioctl_debug Extends unsupported ioctl debug output. diff --git a/0024-qemu-cvs-ioctl_nodirection.patch b/0024-qemu-cvs-ioctl_nodirection.patch index 855b1127..50798f2e 100644 --- a/0024-qemu-cvs-ioctl_nodirection.patch +++ b/0024-qemu-cvs-ioctl_nodirection.patch @@ -1,7 +1,7 @@ From 926d75fa4b4b5d95d4b0111e3e0af4d983a9d46b Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 14 Apr 2009 16:27:36 +0200 -Subject: [PATCH 24/44] qemu-cvs-ioctl_nodirection +Subject: [PATCH] qemu-cvs-ioctl_nodirection the direction given in the ioctl should be correct so we can assume the communication is uni-directional. The alsa developers did not like this diff --git a/0025-qemu-img-vmdk-scsi.patch b/0025-qemu-img-vmdk-scsi.patch index 6ce257b2..1a72e4cb 100644 --- a/0025-qemu-img-vmdk-scsi.patch +++ b/0025-qemu-img-vmdk-scsi.patch @@ -1,7 +1,7 @@ From 90b3180677c5615bafc9a1f8252fbc4af1dc1ae4 Mon Sep 17 00:00:00 2001 From: Ulrich Hecht Date: Tue, 14 Apr 2009 16:37:42 +0200 -Subject: [PATCH 25/44] qemu-img-vmdk-scsi +Subject: [PATCH] qemu-img-vmdk-scsi Support creation of SCSI VMDK images in qemu-img. diff --git a/0026-qemu-nonvoid_return.patch b/0026-qemu-nonvoid_return.patch index 19acf463..0c44fc3f 100644 --- a/0026-qemu-nonvoid_return.patch +++ b/0026-qemu-nonvoid_return.patch @@ -1,7 +1,7 @@ From 7e6479e0d45e45e888cb79759fd44d6c14be19f4 Mon Sep 17 00:00:00 2001 From: Ulrich Hecht Date: Tue, 14 Apr 2009 16:38:20 +0200 -Subject: [PATCH 26/44] qemu-nonvoid_return +Subject: [PATCH] qemu-nonvoid_return Squelches GCC warnings about undefined return values. diff --git a/0027-fix-mipsn32-linux-user-builds.patch b/0027-fix-mipsn32-linux-user-builds.patch index 8b6f1696..3979bd98 100644 --- a/0027-fix-mipsn32-linux-user-builds.patch +++ b/0027-fix-mipsn32-linux-user-builds.patch @@ -1,7 +1,7 @@ From 164cf539481164978d9fa6ad69eb20cda7dc0e12 Mon Sep 17 00:00:00 2001 From: Ulrich Hecht Date: Wed, 25 Aug 2010 14:23:43 +0200 -Subject: [PATCH 27/44] fix mipsn32*-linux-user builds +Subject: [PATCH] fix mipsn32*-linux-user builds Signed-off-by: Ulrich Hecht --- diff --git a/0028-Integrating-Dynamips-and-GNS3-UDP-tunnels-Patches.patch b/0028-Integrating-Dynamips-and-GNS3-UDP-tunnels-Patches.patch index 0a30937a..87846404 100644 --- a/0028-Integrating-Dynamips-and-GNS3-UDP-tunnels-Patches.patch +++ b/0028-Integrating-Dynamips-and-GNS3-UDP-tunnels-Patches.patch @@ -1,7 +1,7 @@ From 15d6a32b38abc6c2f8143ebccfcdd05d204f0fcd Mon Sep 17 00:00:00 2001 From: Benjamin Date: Sat, 8 Oct 2011 07:31:33 +0000 -Subject: [PATCH 28/44] Integrating Dynamips and GNS3 UDP tunnels (Patches) +Subject: [PATCH] Integrating Dynamips and GNS3 UDP tunnels (Patches) On 10/07/11 10:35, Jan Kiszka wrote: > diff --git a/0029-linux-user-add-binfmt-wrapper-for-argv-0-handling.patch b/0029-linux-user-add-binfmt-wrapper-for-argv-0-handling.patch index 3b0b07f5..d51ad074 100644 --- a/0029-linux-user-add-binfmt-wrapper-for-argv-0-handling.patch +++ b/0029-linux-user-add-binfmt-wrapper-for-argv-0-handling.patch @@ -1,7 +1,7 @@ From 47ff084e9af71b217e6f842f720d12fe9e12f2fd Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 30 Sep 2011 19:40:36 +0200 -Subject: [PATCH 29/44] linux-user: add binfmt wrapper for argv[0] handling +Subject: [PATCH] linux-user: add binfmt wrapper for argv[0] handling When using qemu's linux-user binaries through binfmt, argv[0] gets lost along the execution because qemu only gets passed in the full file name diff --git a/0030-linux-user-Ignore-timer_create-syscall.patch b/0030-linux-user-Ignore-timer_create-syscall.patch index b977520b..985ef7e2 100644 --- a/0030-linux-user-Ignore-timer_create-syscall.patch +++ b/0030-linux-user-Ignore-timer_create-syscall.patch @@ -1,7 +1,7 @@ From 269d801698bf7640dd325cfb4b195c4a207a07ee Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sun, 11 Dec 2011 01:19:24 +0100 -Subject: [PATCH 30/44] linux-user: Ignore timer_create syscall +Subject: [PATCH] linux-user: Ignore timer_create syscall We don't implement the timer_create syscall, but shouting out loud about it breaks some %check tests in OBS, so better ignore it silently. diff --git a/0031-linux-user-be-silent-about-capget-failures.patch b/0031-linux-user-be-silent-about-capget-failures.patch index 4b11fc90..7a5a1917 100644 --- a/0031-linux-user-be-silent-about-capget-failures.patch +++ b/0031-linux-user-be-silent-about-capget-failures.patch @@ -1,7 +1,7 @@ From 36f403e159ecb5fcaeda5346c2df762cc904a91b Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Sun, 11 Dec 2011 01:21:51 +0100 -Subject: [PATCH 31/44] linux-user: be silent about capget failures +Subject: [PATCH] linux-user: be silent about capget failures Complaining about capget doesn't buy us anything, but makes %check fail in certain builds. So better not complain about its missing diff --git a/0032-PPC-Fix-linker-scripts-on-ppc-hosts.patch b/0032-PPC-Fix-linker-scripts-on-ppc-hosts.patch index 91eea497..11ff61a1 100644 --- a/0032-PPC-Fix-linker-scripts-on-ppc-hosts.patch +++ b/0032-PPC-Fix-linker-scripts-on-ppc-hosts.patch @@ -1,7 +1,7 @@ From 4fddaa4befeb3ddb1c14d9b2c882474ba4166940 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Mon, 12 Dec 2011 23:16:43 +0100 -Subject: [PATCH 32/44] PPC: Fix linker scripts on ppc hosts +Subject: [PATCH] PPC: Fix linker scripts on ppc hosts When compiling qemu statically with multilib on PPC, we hit the same issue that commit 845f2c2812d9ed24b36c02a3d06ee83aeafe8b49 diff --git a/0033-linux-user-reserve-4GB-of-vmem-for-32-on-64.patch b/0033-linux-user-reserve-4GB-of-vmem-for-32-on-64.patch index ce1e3c59..42a31657 100644 --- a/0033-linux-user-reserve-4GB-of-vmem-for-32-on-64.patch +++ b/0033-linux-user-reserve-4GB-of-vmem-for-32-on-64.patch @@ -1,7 +1,7 @@ From ac233b323ad7e498c665e8c74df7e44de4a542c0 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 14 Dec 2011 00:33:28 +0100 -Subject: [PATCH 33/44] linux-user: reserve 4GB of vmem for 32-on-64 +Subject: [PATCH] linux-user: reserve 4GB of vmem for 32-on-64 When running 32-on-64 bit guests, we should always reserve as much virtual memory as we possibly can for the guest process, so it can diff --git a/0034-PPC-KVM-Disable-mmu-notifier-check.patch b/0034-PPC-KVM-Disable-mmu-notifier-check.patch index 41a5ac57..e88c3baf 100644 --- a/0034-PPC-KVM-Disable-mmu-notifier-check.patch +++ b/0034-PPC-KVM-Disable-mmu-notifier-check.patch @@ -1,7 +1,7 @@ From 96ac7aa8753cb2d79121c5a579a6e93160428a40 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 6 Jan 2012 01:05:55 +0100 -Subject: [PATCH 34/44] PPC: KVM: Disable mmu notifier check +Subject: [PATCH] PPC: KVM: Disable mmu notifier check When using hugetlbfs (which is required for HV mode KVM on 970), we check for MMU notifiers that on 970 can not be implemented properly. diff --git a/0035-linux-user-improve-fake-proc-self-stat-making-ps.patch b/0035-linux-user-improve-fake-proc-self-stat-making-ps.patch index d787ded7..31f68f44 100644 --- a/0035-linux-user-improve-fake-proc-self-stat-making-ps.patch +++ b/0035-linux-user-improve-fake-proc-self-stat-making-ps.patch @@ -1,7 +1,7 @@ From 872ebeaa24ed1c4b0c1596a7ad37f2bf2275efb0 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Tue, 3 Jan 2012 09:38:34 +0000 -Subject: [PATCH 35/44] linux-user: improve fake /proc/self/stat making `ps` not segfault. +Subject: [PATCH] linux-user: improve fake /proc/self/stat making `ps` not segfault. With the current fake /proc/self/stat implementation `ps` is segfaulting because it expects to read PID and argv[0] as first and diff --git a/0036-linux-user-target_argv-is-placed-on-ts-bprm-argv.patch b/0036-linux-user-target_argv-is-placed-on-ts-bprm-argv.patch index b0ca2eaa..28ddb40e 100644 --- a/0036-linux-user-target_argv-is-placed-on-ts-bprm-argv.patch +++ b/0036-linux-user-target_argv-is-placed-on-ts-bprm-argv.patch @@ -1,7 +1,7 @@ From 7dc45b21c5ef8a9445463f8d3754e502621192a7 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Tue, 3 Jan 2012 09:38:35 +0000 -Subject: [PATCH 36/44] linux-user: target_argv is placed on ts->bprm->argv and can't be freed() +Subject: [PATCH] linux-user: target_argv is placed on ts->bprm->argv and can't be freed() TaskState contains linux_bprm struct which encapsulates argv among other things. diff --git a/0037-PPC-KVM-Ignore-SET_ONE_REG-failures.patch b/0037-PPC-KVM-Ignore-SET_ONE_REG-failures.patch index ea6404df..77d08e2d 100644 --- a/0037-PPC-KVM-Ignore-SET_ONE_REG-failures.patch +++ b/0037-PPC-KVM-Ignore-SET_ONE_REG-failures.patch @@ -1,7 +1,7 @@ From 0d04677df6aabf7404c7bbe454d7be973a773bb0 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 10 Jan 2012 16:25:27 +0100 -Subject: [PATCH 37/44] PPC: KVM: Ignore SET_ONE_REG failures +Subject: [PATCH] PPC: KVM: Ignore SET_ONE_REG failures The SET_ONE_REG interface didn't make it upstream in the form that is used in qemu-1.0, so the code won't work. Make the error a warning, so we can diff --git a/0038-PPC-KVM-Ignore-ENABLE_PAPR-to-support-very-old-HV.patch b/0038-PPC-KVM-Ignore-ENABLE_PAPR-to-support-very-old-HV.patch index f2c4c653..f65d5863 100644 --- a/0038-PPC-KVM-Ignore-ENABLE_PAPR-to-support-very-old-HV.patch +++ b/0038-PPC-KVM-Ignore-ENABLE_PAPR-to-support-very-old-HV.patch @@ -1,7 +1,7 @@ From 9ef61f2a197f9dbae104fc1d18634c29d91b4a4e Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 10 Jan 2012 17:03:02 +0100 -Subject: [PATCH 38/44] PPC: KVM: Ignore ENABLE_PAPR to support very old HV KVM kernels +Subject: [PATCH] PPC: KVM: Ignore ENABLE_PAPR to support very old HV KVM kernels Very old kernels (3.1) didn't expose the PAPR capability yet, but still did work with HV KVM. Make the error a warning so we can work on them. diff --git a/0039-console-Fix-segfault-on-screendump-without-VGA-adap.patch b/0039-console-Fix-segfault-on-screendump-without-VGA-adap.patch index 04674fbc..bb965ada 100644 --- a/0039-console-Fix-segfault-on-screendump-without-VGA-adap.patch +++ b/0039-console-Fix-segfault-on-screendump-without-VGA-adap.patch @@ -1,7 +1,7 @@ From 2b0fc5def570362c27ce526b8a08529a6ae22362 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 18 Nov 2011 16:41:59 +0100 -Subject: [PATCH 39/44] console: Fix segfault on screendump without VGA adapter +Subject: [PATCH] console: Fix segfault on screendump without VGA adapter When trying to create a screen dump without having any VGA adapter inside the guest, QEMU segfaults. diff --git a/0040-pseries-Fix-array-overrun-bug-in-PCI-code.patch b/0040-pseries-Fix-array-overrun-bug-in-PCI-code.patch index 8a98d2c4..1fce9b56 100644 --- a/0040-pseries-Fix-array-overrun-bug-in-PCI-code.patch +++ b/0040-pseries-Fix-array-overrun-bug-in-PCI-code.patch @@ -1,7 +1,7 @@ From 632e46dfa29a19ba656a5580b610fda0003cf3b0 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 28 Nov 2011 20:21:39 +0000 -Subject: [PATCH 40/44] pseries: Fix array overrun bug in PCI code +Subject: [PATCH] pseries: Fix array overrun bug in PCI code spapr_populate_pci_devices() containd a loop with PCI_NUM_REGIONS (7) iterations. However this overruns the 'bars' global array, which only has diff --git a/0041-kvm-ppc-halt-secondary-cpus-when-guest-reset.patch b/0041-kvm-ppc-halt-secondary-cpus-when-guest-reset.patch index e276a23d..b02a0176 100644 --- a/0041-kvm-ppc-halt-secondary-cpus-when-guest-reset.patch +++ b/0041-kvm-ppc-halt-secondary-cpus-when-guest-reset.patch @@ -1,7 +1,7 @@ From 0ae672e84c7f722aebdcca35f1573e7b6f83fddd Mon Sep 17 00:00:00 2001 From: Liu Yu-B13201 Date: Mon, 28 Nov 2011 20:41:18 +0000 -Subject: [PATCH 41/44] kvm-ppc: halt secondary cpus when guest reset +Subject: [PATCH] kvm-ppc: halt secondary cpus when guest reset When guest reset, we need to halt secondary cpus until guest kick them. This already works for tcg. The patch add the support for kvm. diff --git a/0042-pseries-Emit-device-tree-nodes-in-reg-order.patch b/0042-pseries-Emit-device-tree-nodes-in-reg-order.patch index 1bdae985..5eb82ae4 100644 --- a/0042-pseries-Emit-device-tree-nodes-in-reg-order.patch +++ b/0042-pseries-Emit-device-tree-nodes-in-reg-order.patch @@ -1,7 +1,7 @@ From 7fe6b9bf81290f708919ffb6065daa16e5dbe7e3 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 12 Dec 2011 18:24:32 +0000 -Subject: [PATCH 42/44] pseries: Emit device tree nodes in reg order +Subject: [PATCH] pseries: Emit device tree nodes in reg order Although in theory the device tree has no inherent ordering, in practice the order of nodes in the device tree does effect the order that devices diff --git a/0043-pseries-Add-a-routine-to-find-a-stable-default-vt.patch b/0043-pseries-Add-a-routine-to-find-a-stable-default-vt.patch index 41c714b5..df932362 100644 --- a/0043-pseries-Add-a-routine-to-find-a-stable-default-vt.patch +++ b/0043-pseries-Add-a-routine-to-find-a-stable-default-vt.patch @@ -1,7 +1,7 @@ From 2f5760ec14a8f595c347f8a6ad2f8b6adfc20bc2 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 12 Dec 2011 18:24:33 +0000 -Subject: [PATCH 43/44] pseries: Add a routine to find a stable "default" vty and use it +Subject: [PATCH] pseries: Add a routine to find a stable "default" vty and use it In vty_lookup() we have a special case for supporting early debug in the kernel. This accepts reg == 0 as a special case to mean "any vty". diff --git a/0044-pseries-Populate-chosen-linux-stdout-path-in-the.patch b/0044-pseries-Populate-chosen-linux-stdout-path-in-the.patch index cc5ba372..922ecab0 100644 --- a/0044-pseries-Populate-chosen-linux-stdout-path-in-the.patch +++ b/0044-pseries-Populate-chosen-linux-stdout-path-in-the.patch @@ -1,7 +1,7 @@ From cdec03dc7bb33b4ebf5bd286338e5c50be77a055 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Tue, 13 Dec 2011 15:24:34 +1100 -Subject: [PATCH 44/44] pseries: Populate "/chosen/linux,stdout-path" in the FDT +Subject: [PATCH] pseries: Populate "/chosen/linux,stdout-path" in the FDT There is a device tree property "/chosen/linux,stdout-path" which indicates which device should be used as stdout - ie. "the console". diff --git a/0045-linux-user-fix-segfault-deadlock.patch b/0045-linux-user-fix-segfault-deadlock.patch new file mode 100644 index 00000000..29c1d9b8 --- /dev/null +++ b/0045-linux-user-fix-segfault-deadlock.patch @@ -0,0 +1,67 @@ +From 8be1f86952a0239c1d9e89e47bc25831b1804570 Mon Sep 17 00:00:00 2001 +From: Alexander Graf +Date: Fri, 13 Jan 2012 17:05:41 +0100 +Subject: [PATCH] linux-user: fix segfault deadlock + +When entering the guest we take a lock to ensure that nobody else messes +with our TB chaining while we're doing it. If we get a segfault inside that +code, we manage to work on, but will not unlock the lock. + +This patch forces unlocking of that lock in the segv handler. I'm not sure +this is the right approach though. Maybe we should rather make sure we don't +segfault in the code? I would greatly appreciate someone more intelligible +than me to look at this :). + +Example code to trigger this is at: http://csgraf.de/tmp/conftest.c + +Reported-by: Fabio Erculiani +Signed-off-by: Alexander Graf +--- + qemu-lock.h | 10 ++++++++++ + user-exec.c | 4 ++++ + 2 files changed, 14 insertions(+), 0 deletions(-) + +diff --git a/qemu-lock.h b/qemu-lock.h +index a72edda..e460e12 100644 +--- a/qemu-lock.h ++++ b/qemu-lock.h +@@ -24,6 +24,12 @@ + #include + #define spin_lock pthread_mutex_lock + #define spin_unlock pthread_mutex_unlock ++static inline void spin_unlock_safe(pthread_mutex_t *lock) ++{ ++ /* unlocking an unlocked mutex results in undefined behavior */ ++ pthread_mutex_trylock(lock); ++ pthread_mutex_unlock(lock); ++} + #define spinlock_t pthread_mutex_t + #define SPIN_LOCK_UNLOCKED PTHREAD_MUTEX_INITIALIZER + +@@ -46,4 +52,8 @@ static inline void spin_unlock(spinlock_t *lock) + { + } + ++static inline void spin_unlock_safe(spinlock_t *lock) ++{ ++} ++ + #endif +diff --git a/user-exec.c b/user-exec.c +index abf6885..2826bd1 100644 +--- a/user-exec.c ++++ b/user-exec.c +@@ -96,6 +96,10 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address, + qemu_printf("qemu: SIGSEGV pc=0x%08lx address=%08lx w=%d oldset=0x%08lx\n", + pc, address, is_write, *(unsigned long *)old_set); + #endif ++ ++ /* Maybe we're still holding the TB fiddling lock? */ ++ spin_unlock_safe(&tb_lock); ++ + /* XXX: locking issue */ + if (is_write && page_unprotect(h2g(address), pc, puc)) { + return 1; +-- +1.6.0.2 + diff --git a/0046-linux-user-implement-device-mapper-ioctls.patch b/0046-linux-user-implement-device-mapper-ioctls.patch new file mode 100644 index 00000000..af9de8bd --- /dev/null +++ b/0046-linux-user-implement-device-mapper-ioctls.patch @@ -0,0 +1,380 @@ +From df8bec1f09754015f3b43591e1b8e9de70910c9a Mon Sep 17 00:00:00 2001 +From: Alexander Graf +Date: Tue, 31 Jan 2012 18:42:06 +0100 +Subject: [PATCH] linux-user: implement device mapper ioctls + +This patch implements all ioctls currently implemented by device mapper, +enabling us to run dmsetup and kpartx inside of linux-user. + +Signed-off-by: Alexander Graf +--- + linux-user/ioctls.h | 33 +++++++ + linux-user/syscall.c | 226 ++++++++++++++++++++++++++++++++++++++++++++ + linux-user/syscall_defs.h | 18 ++++ + linux-user/syscall_types.h | 36 +++++++ + 4 files changed, 313 insertions(+), 0 deletions(-) + +diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h +index 224dbc6..05b7290 100644 +--- a/linux-user/ioctls.h ++++ b/linux-user/ioctls.h +@@ -350,3 +350,36 @@ + IOCTL(VT_SETMODE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_vt_mode))) + IOCTL(VT_RELDISP, 0, TYPE_INT) + IOCTL(VT_DISALLOCATE, 0, TYPE_INT) ++ ++ IOCTL(DM_VERSION, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_REMOVE_ALL, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_LIST_DEVICES, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_DEV_CREATE, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_DEV_REMOVE, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_DEV_RENAME, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_DEV_SUSPEND, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_DEV_STATUS, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_DEV_WAIT, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_TABLE_LOAD, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_TABLE_CLEAR, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_TABLE_DEPS, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_TABLE_STATUS, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_LIST_VERSIONS,IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_TARGET_MSG, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ IOCTL_SPECIAL(DM_DEV_SET_GEOMETRY, IOC_RW, do_ioctl_dm, ++ MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) ++ +diff --git a/linux-user/syscall.c b/linux-user/syscall.c +index 3e8e3dd..7a20af4 100644 +--- a/linux-user/syscall.c ++++ b/linux-user/syscall.c +@@ -95,6 +95,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base, + #endif + #include + #include ++#include + #include "linux_loop.h" + #include "cpu-uname.h" + +@@ -3320,6 +3321,231 @@ static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, uint8_t *buf_temp, + return ret; + } + ++static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int fd, ++ abi_long cmd, abi_long arg) ++{ ++ void *argptr; ++ struct dm_ioctl *host_dm; ++ abi_long guest_data; ++ uint32_t guest_data_size; ++ int target_size; ++ const argtype *arg_type = ie->arg_type; ++ abi_long ret; ++ void *big_buf = NULL; ++ char *host_data; ++ ++ arg_type++; ++ target_size = thunk_type_size(arg_type, 0); ++ argptr = lock_user(VERIFY_READ, arg, target_size, 1); ++ if (!argptr) { ++ ret = -TARGET_EFAULT; ++ goto out; ++ } ++ thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); ++ unlock_user(argptr, arg, 0); ++ ++ /* buf_temp is too small, so fetch things into a bigger buffer */ ++ big_buf = g_malloc0(((struct dm_ioctl*)buf_temp)->data_size * 2); ++ memcpy(big_buf, buf_temp, target_size); ++ buf_temp = big_buf; ++ host_dm = big_buf; ++ ++ guest_data = arg + host_dm->data_start; ++ if ((guest_data - arg) < 0) { ++ ret = -EINVAL; ++ goto out; ++ } ++ guest_data_size = host_dm->data_size - host_dm->data_start; ++ host_data = (char*)host_dm + host_dm->data_start; ++ ++ argptr = lock_user(VERIFY_READ, guest_data, guest_data_size, 1); ++ switch (ie->host_cmd) { ++ case DM_REMOVE_ALL: ++ case DM_LIST_DEVICES: ++ case DM_DEV_CREATE: ++ case DM_DEV_REMOVE: ++ case DM_DEV_SUSPEND: ++ case DM_DEV_STATUS: ++ case DM_DEV_WAIT: ++ case DM_TABLE_STATUS: ++ case DM_TABLE_CLEAR: ++ case DM_TABLE_DEPS: ++ case DM_LIST_VERSIONS: ++ /* no input data */ ++ break; ++ case DM_DEV_RENAME: ++ case DM_DEV_SET_GEOMETRY: ++ /* data contains only strings */ ++ memcpy(host_data, argptr, guest_data_size); ++ break; ++ case DM_TARGET_MSG: ++ memcpy(host_data, argptr, guest_data_size); ++ *(uint64_t*)host_data = tswap64(*(uint64_t*)argptr); ++ break; ++ case DM_TABLE_LOAD: ++ { ++ void *gspec = argptr; ++ void *cur_data = host_data; ++ const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) }; ++ int spec_size = thunk_type_size(arg_type, 0); ++ int i; ++ ++ for (i = 0; i < host_dm->target_count; i++) { ++ struct dm_target_spec *spec = cur_data; ++ uint32_t next; ++ int slen; ++ ++ thunk_convert(spec, gspec, arg_type, THUNK_HOST); ++ slen = strlen((char*)gspec + spec_size) + 1; ++ next = spec->next; ++ spec->next = sizeof(*spec) + slen; ++ strcpy((char*)&spec[1], gspec + spec_size); ++ gspec += next; ++ cur_data += spec->next; ++ } ++ break; ++ } ++ default: ++ ret = -TARGET_EINVAL; ++ goto out; ++ } ++ unlock_user(argptr, guest_data, 0); ++ ++ ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp)); ++ if (!is_error(ret)) { ++ guest_data = arg + host_dm->data_start; ++ guest_data_size = host_dm->data_size - host_dm->data_start; ++ argptr = lock_user(VERIFY_WRITE, guest_data, guest_data_size, 0); ++ switch (ie->host_cmd) { ++ case DM_REMOVE_ALL: ++ case DM_DEV_CREATE: ++ case DM_DEV_REMOVE: ++ case DM_DEV_RENAME: ++ case DM_DEV_SUSPEND: ++ case DM_DEV_STATUS: ++ case DM_TABLE_LOAD: ++ case DM_TABLE_CLEAR: ++ case DM_TARGET_MSG: ++ case DM_DEV_SET_GEOMETRY: ++ /* no return data */ ++ break; ++ case DM_LIST_DEVICES: ++ { ++ struct dm_name_list *nl = (void*)host_dm + host_dm->data_start; ++ uint32_t remaining_data = guest_data_size; ++ void *cur_data = argptr; ++ const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_name_list) }; ++ int nl_size = 12; /* can't use thunk_size due to alignment */ ++ ++ while (1) { ++ uint32_t next = nl->next; ++ if (next) { ++ nl->next = nl_size + (strlen(nl->name) + 1); ++ } ++ if (remaining_data < nl->next) { ++ host_dm->flags |= DM_BUFFER_FULL_FLAG; ++ break; ++ } ++ thunk_convert(cur_data, nl, arg_type, THUNK_TARGET); ++ strcpy(cur_data + nl_size, nl->name); ++ cur_data += nl->next; ++ remaining_data -= nl->next; ++ if (!next) { ++ break; ++ } ++ nl = (void*)nl + next; ++ } ++ break; ++ } ++ case DM_DEV_WAIT: ++ case DM_TABLE_STATUS: ++ { ++ struct dm_target_spec *spec = (void*)host_dm + host_dm->data_start; ++ void *cur_data = argptr; ++ const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) }; ++ int spec_size = thunk_type_size(arg_type, 0); ++ int i; ++ ++ for (i = 0; i < host_dm->target_count; i++) { ++ uint32_t next = spec->next; ++ int slen = strlen((char*)&spec[1]) + 1; ++ spec->next = (cur_data - argptr) + spec_size + slen; ++ if (guest_data_size < spec->next) { ++ host_dm->flags |= DM_BUFFER_FULL_FLAG; ++ break; ++ } ++ thunk_convert(cur_data, spec, arg_type, THUNK_TARGET); ++ strcpy(cur_data + spec_size, (char*)&spec[1]); ++ cur_data = argptr + spec->next; ++ spec = (void*)host_dm + host_dm->data_start + next; ++ } ++ break; ++ } ++ case DM_TABLE_DEPS: ++ { ++ void *hdata = (void*)host_dm + host_dm->data_start; ++ int count = *(uint32_t*)hdata; ++ uint64_t *hdev = hdata + 8; ++ uint64_t *gdev = argptr + 8; ++ int i; ++ ++ *(uint32_t*)argptr = tswap32(count); ++ for (i = 0; i < count; i++) { ++ *gdev = tswap64(*hdev); ++ gdev++; ++ hdev++; ++ } ++ break; ++ } ++ case DM_LIST_VERSIONS: ++ { ++ struct dm_target_versions *vers = (void*)host_dm + host_dm->data_start; ++ uint32_t remaining_data = guest_data_size; ++ void *cur_data = argptr; ++ const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_versions) }; ++ int vers_size = thunk_type_size(arg_type, 0); ++ ++ while (1) { ++ uint32_t next = vers->next; ++ if (next) { ++ vers->next = vers_size + (strlen(vers->name) + 1); ++ } ++ if (remaining_data < vers->next) { ++ host_dm->flags |= DM_BUFFER_FULL_FLAG; ++ break; ++ } ++ thunk_convert(cur_data, vers, arg_type, THUNK_TARGET); ++ strcpy(cur_data + vers_size, vers->name); ++ cur_data += vers->next; ++ remaining_data -= vers->next; ++ if (!next) { ++ break; ++ } ++ vers = (void*)vers + next; ++ } ++ break; ++ } ++ default: ++ ret = -TARGET_EINVAL; ++ goto out; ++ } ++ unlock_user(argptr, guest_data, guest_data_size); ++ ++ argptr = lock_user(VERIFY_WRITE, arg, target_size, 0); ++ if (!argptr) { ++ ret = -TARGET_EFAULT; ++ goto out; ++ } ++ thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); ++ unlock_user(argptr, arg, target_size); ++ } ++out: ++ if (big_buf) { ++ free(big_buf); ++ } ++ return ret; ++} ++ + static IOCTLEntry ioctl_entries[] = { + #define IOCTL(cmd, access, ...) \ + { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } }, +diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h +index f0acc72..c8b57c9 100644 +--- a/linux-user/syscall_defs.h ++++ b/linux-user/syscall_defs.h +@@ -989,6 +989,24 @@ struct target_pollfd { + #define TARGET_VT_RELDISP 0x5605 + #define TARGET_VT_DISALLOCATE 0x5608 + ++/* device mapper */ ++#define TARGET_DM_VERSION TARGET_IOWRU(0xfd, 0x00) ++#define TARGET_DM_REMOVE_ALL TARGET_IOWRU(0xfd, 0x01) ++#define TARGET_DM_LIST_DEVICES TARGET_IOWRU(0xfd, 0x02) ++#define TARGET_DM_DEV_CREATE TARGET_IOWRU(0xfd, 0x03) ++#define TARGET_DM_DEV_REMOVE TARGET_IOWRU(0xfd, 0x04) ++#define TARGET_DM_DEV_RENAME TARGET_IOWRU(0xfd, 0x05) ++#define TARGET_DM_DEV_SUSPEND TARGET_IOWRU(0xfd, 0x06) ++#define TARGET_DM_DEV_STATUS TARGET_IOWRU(0xfd, 0x07) ++#define TARGET_DM_DEV_WAIT TARGET_IOWRU(0xfd, 0x08) ++#define TARGET_DM_TABLE_LOAD TARGET_IOWRU(0xfd, 0x09) ++#define TARGET_DM_TABLE_CLEAR TARGET_IOWRU(0xfd, 0x0a) ++#define TARGET_DM_TABLE_DEPS TARGET_IOWRU(0xfd, 0x0b) ++#define TARGET_DM_TABLE_STATUS TARGET_IOWRU(0xfd, 0x0c) ++#define TARGET_DM_LIST_VERSIONS TARGET_IOWRU(0xfd, 0x0d) ++#define TARGET_DM_TARGET_MSG TARGET_IOWRU(0xfd, 0x0e) ++#define TARGET_DM_DEV_SET_GEOMETRY TARGET_IOWRU(0xfd, 0x0f) ++ + /* from asm/termbits.h */ + + #define TARGET_NCC 8 +diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h +index 8fde25c..dea520e 100644 +--- a/linux-user/syscall_types.h ++++ b/linux-user/syscall_types.h +@@ -191,6 +191,42 @@ STRUCT(vt_mode, + TYPE_SHORT, /* acqsig */ + TYPE_SHORT) /* frsig */ + ++STRUCT(dm_ioctl, ++ MK_ARRAY(TYPE_INT, 3), /* version */ ++ TYPE_INT, /* data_size */ ++ TYPE_INT, /* data_start */ ++ TYPE_INT, /* target_count*/ ++ TYPE_INT, /* open_count */ ++ TYPE_INT, /* flags */ ++ TYPE_INT, /* event_nr */ ++ TYPE_INT, /* padding */ ++ TYPE_ULONGLONG, /* dev */ ++ MK_ARRAY(TYPE_CHAR, 128), /* name */ ++ MK_ARRAY(TYPE_CHAR, 129), /* uuid */ ++ MK_ARRAY(TYPE_CHAR, 7)) /* data */ ++ ++STRUCT(dm_target_spec, ++ TYPE_ULONGLONG, /* sector_start */ ++ TYPE_ULONGLONG, /* length */ ++ TYPE_INT, /* status */ ++ TYPE_INT, /* next */ ++ MK_ARRAY(TYPE_CHAR, 16)) /* target_type */ ++ ++STRUCT(dm_target_deps, ++ TYPE_INT, /* count */ ++ TYPE_INT) /* padding */ ++ ++STRUCT(dm_name_list, ++ TYPE_ULONGLONG, /* dev */ ++ TYPE_INT) /* next */ ++ ++STRUCT(dm_target_versions, ++ TYPE_INT, /* next */ ++ MK_ARRAY(TYPE_INT, 3)) /* version*/ ++ ++STRUCT(dm_target_msg, ++ TYPE_ULONGLONG) /* sector */ ++ + STRUCT(fiemap_extent, + TYPE_ULONGLONG, /* fe_logical */ + TYPE_ULONGLONG, /* fe_physical */ +-- +1.6.0.2 + diff --git a/0047-linux-user-add-struct-old_dev_t-compat.patch b/0047-linux-user-add-struct-old_dev_t-compat.patch new file mode 100644 index 00000000..e965736a --- /dev/null +++ b/0047-linux-user-add-struct-old_dev_t-compat.patch @@ -0,0 +1,136 @@ +From 2cca53754fbaf3902399ab5a96e8790d0bd27040 Mon Sep 17 00:00:00 2001 +From: Alexander Graf +Date: Tue, 31 Jan 2012 19:44:41 +0100 +Subject: [PATCH] linux-user: add struct old_dev_t compat + +The compat LOOP_SET_STATUS ioctl uses struct old_dev_t in its passed +struct. That variable type is vastly different between different +architectures. Implement wrapping around it so we can use it. + +This fixes running arm kpartx on an x86_64 host for me. + +Signed-off-by: Alexander Graf +--- + linux-user/syscall_types.h | 4 ++-- + thunk.c | 28 ++++++++++++++++++++++++++++ + thunk.h | 28 ++++++++++++++++++++++++++++ + 3 files changed, 58 insertions(+), 2 deletions(-) + +diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h +index dea520e..ad2ee7e 100644 +--- a/linux-user/syscall_types.h ++++ b/linux-user/syscall_types.h +@@ -88,9 +88,9 @@ STRUCT(mixer_info, + /* loop device ioctls */ + STRUCT(loop_info, + TYPE_INT, /* lo_number */ +- TYPE_SHORT, /* lo_device */ ++ TYPE_OLDDEVT, /* lo_device */ + TYPE_ULONG, /* lo_inode */ +- TYPE_SHORT, /* lo_rdevice */ ++ TYPE_OLDDEVT, /* lo_rdevice */ + TYPE_INT, /* lo_offset */ + TYPE_INT, /* lo_encrypt_type */ + TYPE_INT, /* lo_encrypt_key_size */ +diff --git a/thunk.c b/thunk.c +index 34bc7d1..bf43985 100644 +--- a/thunk.c ++++ b/thunk.c +@@ -47,6 +47,7 @@ static inline const argtype *thunk_type_next(const argtype *type_ptr) + case TYPE_LONG: + case TYPE_ULONG: + case TYPE_PTRVOID: ++ case TYPE_OLDDEVT: + return type_ptr; + case TYPE_PTR: + return thunk_type_next_ptr(type_ptr); +@@ -209,6 +210,33 @@ const argtype *thunk_convert(void *dst, const void *src, + #else + #warning unsupported conversion + #endif ++ case TYPE_OLDDEVT: ++ { ++ uint64_t val = 0; ++ switch (thunk_type_size(type_ptr - 1, !to_host)) { ++ case 2: ++ val = *(uint16_t *)src; ++ break; ++ case 4: ++ val = *(uint32_t *)src; ++ break; ++ case 8: ++ val = *(uint64_t *)src; ++ break; ++ } ++ switch (thunk_type_size(type_ptr - 1, to_host)) { ++ case 2: ++ *(uint16_t *)dst = tswap16(val); ++ break; ++ case 4: ++ *(uint32_t *)dst = tswap32(val); ++ break; ++ case 8: ++ *(uint64_t *)dst = tswap64(val); ++ break; ++ } ++ break; ++ } + case TYPE_ARRAY: + { + int array_length, i, dst_size, src_size; +diff --git a/thunk.h b/thunk.h +index 55890f3..a49552b 100644 +--- a/thunk.h ++++ b/thunk.h +@@ -38,6 +38,7 @@ typedef enum argtype { + TYPE_ARRAY, + TYPE_STRUCT, + TYPE_INTBITFIELD, ++ TYPE_OLDDEVT, + } argtype; + + #define MK_PTR(type) TYPE_PTR, type +@@ -106,6 +107,31 @@ static inline int thunk_type_size(const argtype *type_ptr, int is_host) + return TARGET_ABI_BITS / 8; + } + break; ++ case TYPE_OLDDEVT: ++ if (is_host) { ++#if defined(HOST_X86_64) ++ return 8; ++#elif defined(HOST_ALPHA) || defined(HOST_IA64) || defined(HOST_MIPS) || \ ++ defined(HOST_PARISC) || defined(HOST_SPARC64) ++ return 4; ++#elif defined(HOST_PPC) ++ return HOST_LONG_SIZE; ++#else ++ return 2; ++#endif ++ } else { ++#if defined(TARGET_X86_64) ++ return 8; ++#elif defined(TARGET_ALPHA) || defined(TARGET_IA64) || defined(TARGET_MIPS) || \ ++ defined(TARGET_PARISC) || defined(TARGET_SPARC64) ++ return 4; ++#elif defined(TARGET_PPC) ++ return TARGET_ABI_BITS / 8; ++#else ++ return 2; ++#endif ++ } ++ break; + case TYPE_ARRAY: + size = type_ptr[1]; + return size * thunk_type_size_array(type_ptr + 2, is_host); +@@ -144,6 +170,8 @@ static inline int thunk_type_align(const argtype *type_ptr, int is_host) + return TARGET_ABI_BITS / 8; + } + break; ++ case TYPE_OLDDEVT: ++ return thunk_type_size(type_ptr, is_host); + case TYPE_ARRAY: + return thunk_type_align_array(type_ptr + 2, is_host); + case TYPE_STRUCT: +-- +1.6.0.2 + diff --git a/0048-linux-user-fix-BLK-ioctl-arguments.patch b/0048-linux-user-fix-BLK-ioctl-arguments.patch new file mode 100644 index 00000000..f2117aeb --- /dev/null +++ b/0048-linux-user-fix-BLK-ioctl-arguments.patch @@ -0,0 +1,36 @@ +From 622f0316e3afa7aa8591440f3bde189f5f09b10b Mon Sep 17 00:00:00 2001 +From: Alexander Graf +Date: Tue, 31 Jan 2012 20:10:20 +0100 +Subject: [PATCH] linux-user: fix BLK ioctl arguments + +Some BLK ioctls passed sizeof(x) into a macro that already did sizeof() on +the passed in argument, rendering the size information inside the ioctl be +the size of the host default integer type. + +Signed-off-by: Alexander Graf +--- + linux-user/syscall_defs.h | 8 +++++--- + 1 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h +index c8b57c9..21b054c 100644 +--- a/linux-user/syscall_defs.h ++++ b/linux-user/syscall_defs.h +@@ -832,9 +832,11 @@ struct target_pollfd { + #define TARGET_BLKSECTGET TARGET_IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */ + #define TARGET_BLKSSZGET TARGET_IO(0x12,104)/* get block device sector size */ + /* A jump here: 108-111 have been used for various private purposes. */ +-#define TARGET_BLKBSZGET TARGET_IOR(0x12,112,sizeof(int)) +-#define TARGET_BLKBSZSET TARGET_IOW(0x12,113,sizeof(int)) +-#define TARGET_BLKGETSIZE64 TARGET_IOR(0x12,114,sizeof(uint64_t)) /* return device size in bytes (u64 *arg) */ ++#define TARGET_BLKBSZGET TARGET_IOR(0x12,112,int) ++#define TARGET_BLKBSZSET TARGET_IOW(0x12,113,int) ++#define TARGET_BLKGETSIZE64 TARGET_IOR(0x12,114,abi_ulong) ++ /* return device size in bytes ++ (u64 *arg) */ + #define TARGET_FIBMAP TARGET_IO(0x00,1) /* bmap access */ + #define TARGET_FIGETBSZ TARGET_IO(0x00,2) /* get the block size used for bmap */ + #define TARGET_FS_IOC_FIEMAP TARGET_IOWR('f',11,struct fiemap) +-- +1.6.0.2 + diff --git a/0049-linux-user-add-BLKSSZGET-ioctl-wrapper.patch b/0049-linux-user-add-BLKSSZGET-ioctl-wrapper.patch new file mode 100644 index 00000000..0b291fcf --- /dev/null +++ b/0049-linux-user-add-BLKSSZGET-ioctl-wrapper.patch @@ -0,0 +1,27 @@ +From eb301a32b39d8d7992b2092819740e9313864585 Mon Sep 17 00:00:00 2001 +From: Alexander Graf +Date: Tue, 31 Jan 2012 20:11:37 +0100 +Subject: [PATCH] linux-user: add BLKSSZGET ioctl wrapper + +This patch adds an ioctl definition for BLKSSZGET. + +Signed-off-by: Alexander Graf +--- + linux-user/ioctls.h | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h +index 05b7290..f938050 100644 +--- a/linux-user/ioctls.h ++++ b/linux-user/ioctls.h +@@ -74,6 +74,7 @@ + IOCTL(BLKFLSBUF, 0, TYPE_NULL) + IOCTL(BLKRASET, 0, TYPE_INT) + IOCTL(BLKRAGET, IOC_R, MK_PTR(TYPE_LONG)) ++ IOCTL(BLKSSZGET, IOC_R, MK_PTR(TYPE_LONG)) + #ifdef FIBMAP + IOCTL(FIBMAP, IOC_W | IOC_R, MK_PTR(TYPE_LONG)) + #endif +-- +1.6.0.2 + diff --git a/qemu.changes b/qemu.changes index 94f74f99..0d053d2b 100644 --- a/qemu.changes +++ b/qemu.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Jan 31 21:36:02 UTC 2012 - agraf@suse.de + +- qemu-user: add fix for deadloop with ulimit constraints +- qemu-user: add device mapper and loopback ioctls, enabling kpatkx + ------------------------------------------------------------------- Tue Jan 10 16:08:35 UTC 2012 - agraf@suse.de diff --git a/qemu.spec b/qemu.spec index b98b9cfb..648b3708 100644 --- a/qemu.spec +++ b/qemu.spec @@ -70,6 +70,11 @@ Patch0041: 0041-kvm-ppc-halt-secondary-cpus-when-guest-reset.patch Patch0042: 0042-pseries-Emit-device-tree-nodes-in-reg-order.patch Patch0043: 0043-pseries-Add-a-routine-to-find-a-stable-default-vt.patch Patch0044: 0044-pseries-Populate-chosen-linux-stdout-path-in-the.patch +Patch0045: 0045-linux-user-fix-segfault-deadlock.patch +Patch0046: 0046-linux-user-implement-device-mapper-ioctls.patch +Patch0047: 0047-linux-user-add-struct-old_dev_t-compat.patch +Patch0048: 0048-linux-user-fix-BLK-ioctl-arguments.patch +Patch0049: 0049-linux-user-add-BLKSSZGET-ioctl-wrapper.patch # this is to make lint happy Source300: rpmlintrc BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -173,6 +178,11 @@ run cross architectures builds %patch0042 -p1 %patch0043 -p1 %patch0044 -p1 +%patch0045 -p1 +%patch0046 -p1 +%patch0047 -p1 +%patch0048 -p1 +%patch0049 -p1 %build # build QEMU diff --git a/update_git.sh b/update_git.sh index e674b7a1..dca697c9 100644 --- a/update_git.sh +++ b/update_git.sh @@ -29,7 +29,7 @@ else fi cd qemu-tmp git checkout $GIT_BRANCH -git format-patch -n $GIT_UPSTREAM_TAG -o .. +git format-patch $GIT_UPSTREAM_TAG -o .. cd .. rm -rf qemu-tmp