From patchwork Tue Jun 16 07:06:27 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Riku Voipio X-Patchwork-Id: 49945 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f198.google.com (mail-lb0-f198.google.com [209.85.217.198]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 8FF6B205DE for ; Tue, 16 Jun 2015 07:07:56 +0000 (UTC) Received: by lbbwc1 with SMTP id wc1sf2038604lbb.3 for ; Tue, 16 Jun 2015 00:07:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:date :message-id:in-reply-to:references:cc:subject:precedence:list-id :list-unsubscribe:list-archive:list-post:list-help:list-subscribe :errors-to:sender:x-original-sender :x-original-authentication-results:mailing-list; bh=9Oa82KDC1p1DqdIccwLzQxfTO2QCGb6Dje2n+b21xrk=; b=Xkcn41U1wmvyK9N4ky9Ns00B5itTqPmteiIwdsFnd+JqXRz8+RF6d6fG6lR8H5Qdqu IH2v99N/k5+BYKaXeXH/Uz4UIMYhw/c0HXa8o8EE11LvpRPmWdBnuS0NS8B9rjck37WK LuLM7A2htX4wEZ110odNcgdhny5JAhR5gS+16rRjDBrmKi6OicfuJL9xNsZEAqK+RYWn x7nrFujnosHl9O+VjpuDqCet4jW3oKOiEaFklx45JfDzUrNssFyx1p6XnAopeY3Y0+/s EObnaSxC0DIh2vYfzZtSAibuTZuQOfscn2yx84Jp4+LG3VOKt+by/HlJncT8SQeGLE29 buUw== X-Gm-Message-State: ALoCoQmgYmWwoOZ2u62yvHHwHRsauXBAlhMEWQLDoefEQeohtdmk853y89sn1003wcxYKMxkSg7F X-Received: by 10.180.36.172 with SMTP id r12mr23490952wij.6.1434438475572; Tue, 16 Jun 2015 00:07:55 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.5.129 with SMTP id s1ls40724las.89.gmail; Tue, 16 Jun 2015 00:07:55 -0700 (PDT) X-Received: by 10.112.54.225 with SMTP id m1mr4628120lbp.34.1434438475403; Tue, 16 Jun 2015 00:07:55 -0700 (PDT) Received: from mail-lb0-f169.google.com (mail-lb0-f169.google.com. [209.85.217.169]) by mx.google.com with ESMTPS id t6si78750lal.117.2015.06.16.00.07.55 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jun 2015 00:07:55 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.169 as permitted sender) client-ip=209.85.217.169; Received: by lbbqq2 with SMTP id qq2so4710284lbb.3 for ; Tue, 16 Jun 2015 00:07:55 -0700 (PDT) X-Received: by 10.152.88.68 with SMTP id be4mr12449001lab.76.1434438475252; Tue, 16 Jun 2015 00:07:55 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.108.230 with SMTP id hn6csp1913266lbb; Tue, 16 Jun 2015 00:07:53 -0700 (PDT) X-Received: by 10.55.33.38 with SMTP id h38mr6426672qkh.44.1434438472071; Tue, 16 Jun 2015 00:07:52 -0700 (PDT) Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id 81si85561qhv.86.2015.06.16.00.07.50 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 16 Jun 2015 00:07:52 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Received: from localhost ([::1]:38158 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4kyM-0005WJ-Ah for patch@linaro.org; Tue, 16 Jun 2015 03:07:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60880) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4kxD-0004DQ-Pq for qemu-devel@nongnu.org; Tue, 16 Jun 2015 03:06:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z4kxA-0006mY-DT for qemu-devel@nongnu.org; Tue, 16 Jun 2015 03:06:39 -0400 Received: from mail-la0-f54.google.com ([209.85.215.54]:36009) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4kxA-0006mI-2K for qemu-devel@nongnu.org; Tue, 16 Jun 2015 03:06:36 -0400 Received: by lacny3 with SMTP id ny3so4782893lac.3 for ; Tue, 16 Jun 2015 00:06:35 -0700 (PDT) X-Received: by 10.152.42.230 with SMTP id r6mr30910442lal.30.1434438395481; Tue, 16 Jun 2015 00:06:35 -0700 (PDT) Received: from localhost.localdomain (91-157-196-38.elisa-laajakaista.fi. [91.157.196.38]) by mx.google.com with ESMTPSA id wc8sm27104lbb.37.2015.06.16.00.06.34 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 16 Jun 2015 00:06:34 -0700 (PDT) From: riku.voipio@linaro.org To: qemu-devel@nongnu.org Date: Tue, 16 Jun 2015 10:06:27 +0300 Message-Id: <8be656b87c6bb1b9f8af3ff78094413d71e4443a.1434438233.git.riku.voipio@linaro.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.215.54 Cc: peter.maydell@linaro.org, Alexander Graf Subject: [Qemu-devel] [PULL v2 1/6] linux-user: Allocate thunk size dynamically X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: riku.voipio@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.169 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 From: Alexander Graf 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 Signed-off-by: Riku Voipio --- 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 87025c3..3b67462 100644 --- a/include/exec/user/thunk.h +++ b/include/exec/user/thunk.h @@ -74,7 +74,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); @@ -186,4 +186,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 1622ad6..f56f3e0 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 @@ -4879,6 +4880,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 3cca047..f501fd7 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); @@ -70,6 +68,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 */ @@ -117,6 +116,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; @@ -244,6 +245,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 */ @@ -314,3 +316,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_new0(StructEntry, max_structs); +}