SHA256
1
0
forked from pool/qemu

fix qemu-linux-user on powerpc

OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=249
This commit is contained in:
Alexander Graf 2015-04-14 15:27:44 +00:00 committed by Git OBS Bridge
parent 66bc8c37ca
commit dc193d92ed
9 changed files with 161 additions and 4 deletions

View File

@ -0,0 +1,117 @@
From 7c705cef722687b8f614f4b8c3a23c4285caedde Mon Sep 17 00:00:00 2001
From: Alexander Graf <agraf@suse.de>
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 <agraf@suse.de>
---
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);
+}

View File

@ -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

View File

@ -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 \

View File

@ -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

View File

@ -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 \

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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