From dc193d92edc82c82c187e88670873c1e28a7afb517ac71ed7eab78816b3665cb Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Tue, 14 Apr 2015 15:27:44 +0000 Subject: [PATCH] fix qemu-linux-user on powerpc OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=249 --- ...-linux-user-Allocate-thunk-size-dyna.patch | 117 ++++++++++++++++++ libcacard.changes | 8 ++ libcacard.spec | 4 +- qemu-linux-user.changes | 8 ++ qemu-linux-user.spec | 4 +- qemu-testsuite.changes | 8 ++ qemu-testsuite.spec | 4 +- qemu.changes | 8 ++ qemu.spec | 4 +- 9 files changed, 161 insertions(+), 4 deletions(-) create mode 100644 0038-linux-user-Allocate-thunk-size-dyna.patch diff --git a/0038-linux-user-Allocate-thunk-size-dyna.patch b/0038-linux-user-Allocate-thunk-size-dyna.patch new file mode 100644 index 00000000..be787abc --- /dev/null +++ b/0038-linux-user-Allocate-thunk-size-dyna.patch @@ -0,0 +1,117 @@ +From 7c705cef722687b8f614f4b8c3a23c4285caedde Mon Sep 17 00:00:00 2001 +From: Alexander Graf +Date: Tue, 14 Apr 2015 17:12:29 +0200 +Subject: [PATCH] linux-user: Allocate thunk size dynamically + +We store all struct types in an array of static size without ever +checking whether we overrun it. Of course some day someone (like me +in another, ancient ALSA enabling patch set) will run into the limit +without realizing it. + +So let's make the allocation dynamic. We already know the number of +structs that we want to allocate, so we only need to pass the variable +into the respective piece of code. + +Also, to ensure we don't accidently overwrite random memory, add some +asserts to sanity check whether a thunk is actually part of our array. + +Signed-off-by: Alexander Graf +--- + include/exec/user/thunk.h | 4 +++- + linux-user/syscall.c | 3 +++ + thunk.c | 16 ++++++++++++---- + 3 files changed, 18 insertions(+), 5 deletions(-) + +diff --git a/include/exec/user/thunk.h b/include/exec/user/thunk.h +index 6c35e64..f26c7f4 100644 +--- a/include/exec/user/thunk.h ++++ b/include/exec/user/thunk.h +@@ -75,7 +75,7 @@ const argtype *thunk_convert(void *dst, const void *src, + const argtype *type_ptr, int to_host); + #ifndef NO_THUNK_TYPE_SIZE + +-extern StructEntry struct_entries[]; ++extern StructEntry *struct_entries; + + int thunk_type_size_array(const argtype *type_ptr, int is_host); + int thunk_type_align_array(const argtype *type_ptr, int is_host); +@@ -189,4 +189,6 @@ unsigned int target_to_host_bitmask(unsigned int x86_mask, + unsigned int host_to_target_bitmask(unsigned int alpha_mask, + const bitmask_transtbl * trans_tbl); + ++void thunk_init(unsigned int max_structs); ++ + #endif +diff --git a/linux-user/syscall.c b/linux-user/syscall.c +index 4917e20..49c0659 100644 +--- a/linux-user/syscall.c ++++ b/linux-user/syscall.c +@@ -3277,6 +3277,7 @@ static abi_long do_ipc(unsigned int call, abi_long first, + #define STRUCT_SPECIAL(name) STRUCT_ ## name, + enum { + #include "syscall_types.h" ++STRUCT_MAX + }; + #undef STRUCT + #undef STRUCT_SPECIAL +@@ -4911,6 +4912,8 @@ void syscall_init(void) + int size; + int i; + ++ thunk_init(STRUCT_MAX); ++ + #define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def); + #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def); + #include "syscall_types.h" +diff --git a/thunk.c b/thunk.c +index c6a78ca..8bb46d0 100644 +--- a/thunk.c ++++ b/thunk.c +@@ -25,10 +25,8 @@ + + //#define DEBUG + +-#define MAX_STRUCTS 128 +- +-/* XXX: make it dynamic */ +-StructEntry struct_entries[MAX_STRUCTS]; ++static unsigned int max_struct_entries; ++StructEntry *struct_entries; + + static const argtype *thunk_type_next_ptr(const argtype *type_ptr); + +@@ -71,6 +69,7 @@ void thunk_register_struct(int id, const char *name, const argtype *types) + StructEntry *se; + int nb_fields, offset, max_align, align, size, i, j; + ++ assert(id < max_struct_entries); + se = struct_entries + id; + + /* first we count the number of fields */ +@@ -118,6 +117,8 @@ void thunk_register_struct_direct(int id, const char *name, + const StructEntry *se1) + { + StructEntry *se; ++ ++ assert(id < max_struct_entries); + se = struct_entries + id; + *se = *se1; + se->name = name; +@@ -265,6 +266,7 @@ const argtype *thunk_convert(void *dst, const void *src, + const argtype *field_types; + const int *dst_offsets, *src_offsets; + ++ assert(*type_ptr < max_struct_entries); + se = struct_entries + *type_ptr++; + if (se->convert[0] != NULL) { + /* specific conversion is needed */ +@@ -335,3 +337,9 @@ int thunk_type_align_array(const argtype *type_ptr, int is_host) + return thunk_type_align(type_ptr, is_host); + } + #endif /* ndef NO_THUNK_TYPE_SIZE */ ++ ++void thunk_init(unsigned int max_structs) ++{ ++ max_struct_entries = max_structs; ++ struct_entries = g_new(StructEntry, max_structs); ++} diff --git a/libcacard.changes b/libcacard.changes index 0f1934b7..2654c422 100644 --- a/libcacard.changes +++ b/libcacard.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Tue Apr 14 15:19:42 UTC 2015 - agraf@suse.com + +- Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.3 +- Fix qemu-linux-user on powerpc +* Patches added: + 0038-linux-user-Allocate-thunk-size-dyna.patch + ------------------------------------------------------------------- Sat Apr 11 13:15:55 UTC 2015 - afaerber@suse.de diff --git a/libcacard.spec b/libcacard.spec index 0b7b1ed9..3d0a2792 100644 --- a/libcacard.spec +++ b/libcacard.spec @@ -1,7 +1,7 @@ # # spec file for package libcacard # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -62,6 +62,7 @@ Patch0034: 0034-configure-Enable-PIE-for-ppc-and-pp.patch Patch0035: 0035-qtest-Increase-socket-timeout.patch Patch0036: 0036-AIO-Reduce-number-of-threads-for-32.patch Patch0037: 0037-tcg-tcg-op.c-Fix-ld-st-of-64-bit-va.patch +Patch0038: 0038-linux-user-Allocate-thunk-size-dyna.patch # Please do not add patches manually here, run update_git.sh. # this is to make lint happy Source300: qemu-rpmlintrc @@ -158,6 +159,7 @@ This sub-package contains development files for the Smartcard library. %patch0035 -p1 %patch0036 -p1 %patch0037 -p1 +%patch0038 -p1 %build ./configure --prefix=%_prefix --sysconfdir=%_sysconfdir \ diff --git a/qemu-linux-user.changes b/qemu-linux-user.changes index a86b64ce..38fb5fc0 100644 --- a/qemu-linux-user.changes +++ b/qemu-linux-user.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Tue Apr 14 15:19:39 UTC 2015 - agraf@suse.com + +- Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.3 +- Fix qemu-linux-user on powerpc +* Patches added: + 0038-linux-user-Allocate-thunk-size-dyna.patch + ------------------------------------------------------------------- Sat Apr 11 13:15:51 UTC 2015 - afaerber@suse.de diff --git a/qemu-linux-user.spec b/qemu-linux-user.spec index e224aa55..04c12b7a 100644 --- a/qemu-linux-user.spec +++ b/qemu-linux-user.spec @@ -1,7 +1,7 @@ # # spec file for package qemu-linux-user # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -62,6 +62,7 @@ Patch0034: 0034-configure-Enable-PIE-for-ppc-and-pp.patch Patch0035: 0035-qtest-Increase-socket-timeout.patch Patch0036: 0036-AIO-Reduce-number-of-threads-for-32.patch Patch0037: 0037-tcg-tcg-op.c-Fix-ld-st-of-64-bit-va.patch +Patch0038: 0038-linux-user-Allocate-thunk-size-dyna.patch # Please do not add patches manually here, run update_git.sh. # this is to make lint happy Source300: qemu-rpmlintrc @@ -152,6 +153,7 @@ run cross-architecture builds. %patch0035 -p1 %patch0036 -p1 %patch0037 -p1 +%patch0038 -p1 %build ./configure --prefix=%_prefix --sysconfdir=%_sysconfdir \ diff --git a/qemu-testsuite.changes b/qemu-testsuite.changes index 72b88d00..78acac8d 100644 --- a/qemu-testsuite.changes +++ b/qemu-testsuite.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Tue Apr 14 15:19:36 UTC 2015 - agraf@suse.com + +- Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.3 +- Fix qemu-linux-user on powerpc +* Patches added: + 0038-linux-user-Allocate-thunk-size-dyna.patch + ------------------------------------------------------------------- Sat Apr 11 13:15:47 UTC 2015 - afaerber@suse.de diff --git a/qemu-testsuite.spec b/qemu-testsuite.spec index 2c304f40..82dddefa 100644 --- a/qemu-testsuite.spec +++ b/qemu-testsuite.spec @@ -1,7 +1,7 @@ # # spec file for package qemu-testsuite # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -93,6 +93,7 @@ Patch0034: 0034-configure-Enable-PIE-for-ppc-and-pp.patch Patch0035: 0035-qtest-Increase-socket-timeout.patch Patch0036: 0036-AIO-Reduce-number-of-threads-for-32.patch Patch0037: 0037-tcg-tcg-op.c-Fix-ld-st-of-64-bit-va.patch +Patch0038: 0038-linux-user-Allocate-thunk-size-dyna.patch # Please do not add QEMU patches manually here. # Run update_git.sh to regenerate this queue. @@ -590,6 +591,7 @@ This package provides a service file for starting and stopping KSM. %patch0035 -p1 %patch0036 -p1 %patch0037 -p1 +%patch0038 -p1 %if %{build_x86_fw_from_source} pushd roms/seabios diff --git a/qemu.changes b/qemu.changes index 72b88d00..78acac8d 100644 --- a/qemu.changes +++ b/qemu.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Tue Apr 14 15:19:36 UTC 2015 - agraf@suse.com + +- Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.3 +- Fix qemu-linux-user on powerpc +* Patches added: + 0038-linux-user-Allocate-thunk-size-dyna.patch + ------------------------------------------------------------------- Sat Apr 11 13:15:47 UTC 2015 - afaerber@suse.de diff --git a/qemu.spec b/qemu.spec index 3a7c67b3..847d8620 100644 --- a/qemu.spec +++ b/qemu.spec @@ -1,7 +1,7 @@ # # spec file for package qemu # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -93,6 +93,7 @@ Patch0034: 0034-configure-Enable-PIE-for-ppc-and-pp.patch Patch0035: 0035-qtest-Increase-socket-timeout.patch Patch0036: 0036-AIO-Reduce-number-of-threads-for-32.patch Patch0037: 0037-tcg-tcg-op.c-Fix-ld-st-of-64-bit-va.patch +Patch0038: 0038-linux-user-Allocate-thunk-size-dyna.patch # Please do not add QEMU patches manually here. # Run update_git.sh to regenerate this queue. @@ -590,6 +591,7 @@ This package provides a service file for starting and stopping KSM. %patch0035 -p1 %patch0036 -p1 %patch0037 -p1 +%patch0038 -p1 %if %{build_x86_fw_from_source} pushd roms/seabios