From patchwork Thu May 3 21:38:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 134923 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp87626lji; Thu, 3 May 2018 14:42:33 -0700 (PDT) X-Google-Smtp-Source: AB8JxZprCWoCiKyG8j9WGWEngXHUp2qMB2BSPEPhfIbTxM9CGr6qSm4+bsBn3+38PRZjmWTQk/Zf X-Received: by 2002:aed:2984:: with SMTP id o4-v6mr21462046qtd.124.1525383753070; Thu, 03 May 2018 14:42:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525383753; cv=none; d=google.com; s=arc-20160816; b=B0vcPY+MTHXQzvsThWXr5XE4PV2+XHFKbMTTJJcTLuUQZ/oTaTOcy4TPqSx4nHZM8S ZgmZwayHggoeYWwEumjfTKfpzIV7LcVtuf6KTb1Te9lORJZpqwxMckyO2Bn2s0zMonPz G6rzj1nag3Ye8vdzmVVoC8OzXFRY6ZfDWFxBXfO7TOqzu37J52OK1hlplhSnCOfgrLbO a1QogCXKpG3X9ZGK8/zaGrzGGTG32LQgxBC+TJwIzFU4L5ei7+c7pcVX3Jbq5KiR2vN4 MddeJ2ZYHDnpJiyalmYd7klFQixq3R92GJa/F63uM7DI/rIiYuIVYIFEHVVpKRV19pCI hNqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:to:from:arc-authentication-results; bh=T0x84AvfFQFKTBe2C9nXINDxWvlYKAiIDSF4WQs5XEs=; b=C1kymhZDaP9BKJ7DUx9uAFI5s783PTmlZnLgPVVWfK18X+/yH6yEmpEOLXc0VoSJ50 Q4P/wzc2dknaTfTD2gAX/5sz3gpvXLmB9pi9+XcnNVNxvaj8JutdCy/bpaKl8+D4fRvm z4wImAUVrWrIlOQeU4fBcSPmxtaX0iNuIH+0fIVr45Onkkt9u5pH5iteUqG54vEFRALh TJJzRNGW1tgnGwJ6wfOq6r38cw9iDcPl98Q06opjFi5Pz/jaAwJQB3FLo97Lg/df3BED gv4z4/gJgawYxU7UDWJk2CVZp4Oge0+fyQ2bU0eSnUPXwQG8htAOqDYRNR13v2DSmeyw ERPQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id y9-v6si1785425qtf.398.2018.05.03.14.42.32 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 03 May 2018 14:42:33 -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; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Received: from localhost ([::1]:59213 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELzk-0007Qj-GT for patch@linaro.org; Thu, 03 May 2018 17:42:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54814) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELwo-0004jF-Bz for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fELwk-00055v-CZ for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:30 -0400 Received: from mout.kundenserver.de ([212.227.17.13]:58883) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fELwk-000542-35 for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:26 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0Mdund-1ezsO23A5N-00PhwJ; Thu, 03 May 2018 23:39:12 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 3 May 2018 23:38:58 +0200 Message-Id: <20180503213903.30335-2-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180503213903.30335-1-laurent@vivier.eu> References: <20180503213903.30335-1-laurent@vivier.eu> X-Provags-ID: V03:K1:87NQNua0dHp7eh3yi1/MBklG7Ft4P6KZzFrh+7KxpuTjbMidmPl AiIVfpXpy53Fh+06ZSPTLzG5YgDpVTpjpDFWBpBiN5eP1HpHbXHoZhd2b9nlx6OTwmPxrOJ IlZychUISu2tB9XoLy7BMuOWS8QMHeiFPid6cvxbnDqIWm+i7gPqzMH4hEZLtJmzxJzRbKh heiFNgvIzeIvybL+BmvAQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:bEuhkjQWoeo=:ZHeaB3H5yMpMZ5LNmOkFFF muwxj6VlcwFNYYywT+L2iHCFKOWiQGnyel/SfYfx8MaGDaaXNKX9masYhjYp0bWiiLpRF/LhS iYBC6ntnbYYS6/UV15ce9QdSAe1cRsC3BrvaGrAVje1Ukc9r6h9WmrhfYe6QY7sm+1TTviQTA AZJafCdO6obvXedibKoxSrT5OoUd5/KN3DyahawVC8xl0BjnjWZcTSgtkRSHxcTEqfbnVkR2i qTQYux1D0eh2eCvUvJo9SMt4OvafXfMPvBqBswlNvDo7uEcsg5out1TrnmnCH/kxyfLCn8U5X NZp6lOoQGiysisp5lNifU7MqqQ6tdgGZ8+Bu1i/7RXHFIB/kH/2tIE3V+ZYfmphXVE2Evue+D q6ZTKObmd3aEOBbJ/lBa+eoact9YkOZDfWinQ42PqV6XCQ/drsXIonWF85ClUfrwZ3N3nct06 Sradw7avZ2bNTJ68fbGl0UWdz89RdFJLlSpw4WcbRwV0uYObGFKkfxIDvw/GeX+HJ9ZSfBy32 kl9qH2u/LjZYcCWe0gdipzoJS4cXN5UlmLYSbUvllLUorZnTkZ5Kp6dYMjSr/jnPWV7OrZNJX M+G2w77g/eJHCzaivmP/JucmJIbma9B1tO1/3mMRfhBoyx2Kls9rjrEyNZN2McIFJGYVMpblR pnFpVRb8DCui1nTzUgEMa5c6Sbjk8oLaz+/LEhuiXPL0uDnKry2AiOaRXStDtRebBC7E= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.13 Subject: [Qemu-devel] [PULL 1/6] Remove CONFIG_USE_FDPIC. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Christophe Lyon , Riku Voipio , Laurent Vivier Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Christophe Lyon We want to avoid code disabled by default, because it ends up less tested. This patch removes all instances of #ifdef CONFIG_USE_FDPIC, most of which can be safely kept. For the ones that should be conditionally executed, we define elf_is_fdpic(). Without this patch, defining CONFIG_USE_FDPIC would prevent QEMU from building precisely because elf_is_fdpic is not defined. Signed-off-by: Christophe Lyon Reviewed-by: Peter Maydell Message-Id: <20180430080404.7323-2-christophe.lyon@st.com> Signed-off-by: Laurent Vivier --- linux-user/elfload.c | 18 +++++++----------- linux-user/qemu.h | 4 ++-- 2 files changed, 9 insertions(+), 13 deletions(-) -- 2.14.3 diff --git a/linux-user/elfload.c b/linux-user/elfload.c index c77ed1bb01..bbe93b03b6 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -1681,7 +1681,12 @@ static void zero_bss(abi_ulong elf_bss, abi_ulong last_bss, int prot) } } -#ifdef CONFIG_USE_FDPIC +/* Default implementation, always false. */ +static int elf_is_fdpic(struct elfhdr *exec) +{ + return 0; +} + static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_ulong sp) { uint16_t n; @@ -1706,7 +1711,6 @@ static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_ulong s return sp; } -#endif static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, struct elfhdr *exec, @@ -1725,7 +1729,6 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, sp = p; -#ifdef CONFIG_USE_FDPIC /* Needs to be before we load the env/argc/... */ if (elf_is_fdpic(exec)) { /* Need 4 byte alignment for these structs */ @@ -1737,7 +1740,6 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, sp = loader_build_fdpic_loadmap(interp_info, sp); } } -#endif u_platform = 0; k_platform = ELF_PLATFORM; @@ -2153,10 +2155,8 @@ static void load_elf_image(const char *image_name, int image_fd, } bswap_phdr(phdr, ehdr->e_phnum); -#ifdef CONFIG_USE_FDPIC info->nsegs = 0; info->pt_dynamic_addr = 0; -#endif mmap_lock(); @@ -2173,9 +2173,7 @@ static void load_elf_image(const char *image_name, int image_fd, if (a > hiaddr) { hiaddr = a; } -#ifdef CONFIG_USE_FDPIC ++info->nsegs; -#endif } } @@ -2200,8 +2198,7 @@ static void load_elf_image(const char *image_name, int image_fd, } load_bias = load_addr - loaddr; -#ifdef CONFIG_USE_FDPIC - { + if (elf_is_fdpic(ehdr)) { struct elf32_fdpic_loadseg *loadsegs = info->loadsegs = g_malloc(sizeof(*loadsegs) * info->nsegs); @@ -2219,7 +2216,6 @@ static void load_elf_image(const char *image_name, int image_fd, } } } -#endif info->load_bias = load_bias; info->load_addr = load_addr; diff --git a/linux-user/qemu.h b/linux-user/qemu.h index 192a0d2fef..da3b51724c 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -51,13 +51,13 @@ struct image_info { abi_ulong file_string; uint32_t elf_flags; int personality; -#ifdef CONFIG_USE_FDPIC + + /* The fields below are used in FDPIC mode. */ abi_ulong loadmap_addr; uint16_t nsegs; void *loadsegs; abi_ulong pt_dynamic_addr; struct image_info *other_info; -#endif }; #ifdef TARGET_I386 From patchwork Thu May 3 21:38:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 134925 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp87974lji; Thu, 3 May 2018 14:43:03 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrS91f3i7y2Vflabs2cpcktJR4+AxCeQMqkAOoLfSQT2cznzftD1NodFs3104ANFbYvMefS X-Received: by 10.55.116.2 with SMTP id p2mr2477497qkc.0.1525383783314; Thu, 03 May 2018 14:43:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525383783; cv=none; d=google.com; s=arc-20160816; b=qc0OQQM+fMimQwG3F/8EekBW0WIFz6uE/564nN0XO63BOoFcp6sc5ZLn5iYyiT99wF t1/KjP1Wuc8cRZatEjeqNw/I2Bi7dtw4P4hS1LsBNgUWfbts8ErE9vBmz+gH2WCovcgW wfaljC9ANmgL+ehZJT9YRNCohTCoF6gOkvKh7DM5MBy9EjujvK1QqDH/e8B/9Bodte1B yEtX5sfNn0rLjcip+SE7JZhWWOsXY+JmoZGHIdndUZexzIacYsmSSDYGRDEuMn54Ohkx iKhiaP8pKGBE40+PScKRXrwcy9dIclPxYXfwL4vmhJlgoUXjNWeBypHi+d4TPjzQ88QQ ytlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:to:from:arc-authentication-results; bh=s3ybsnT6I3Gp3l+W6T/GAqnWOuT3wQ5evI64dm5dLpA=; b=ppLvXXUqUi/xs4/Z2KaRuYT+ysdZgSj0Bq00NZ6XjZO17x6+aVLe1MkrHVcZh2vczM 7/VTMPWLfM+XJT2knbCh6oFzVFDMieb6/tDsDNgDvzoW0XlMvpkg+X7bqq+PbLw6YQIK WT8BRJwhPLA4oH4MgTrIxqD029fPZ8dsoIBAxYerNKo5F1o0HOjvjcuwOQHTlcYT8D+E /se/1vw5iBV8ySnIpGJLbL3QjFsoP2Knti5kXgbljAkdv5QmFvWXJU7Y6HBC7Z9cddiP b4iSHMMB85qbpQPykkpDPFQy7EI8WDO+UbUCiodOQFP1b87E+YfxHYzyNmEyrVxKQRE6 Zv7Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id c37-v6si1144289qta.384.2018.05.03.14.43.03 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 03 May 2018 14:43:03 -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; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Received: from localhost ([::1]:59219 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEM0E-0007Vb-NO for patch@linaro.org; Thu, 03 May 2018 17:43:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54861) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELwq-0004jQ-97 for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fELwm-00059B-48 for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:32 -0400 Received: from mout.kundenserver.de ([217.72.192.75]:57917) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fELwl-00056q-Qf for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:28 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0LnShi-1ehncU28AY-00heMa; Thu, 03 May 2018 23:39:12 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 3 May 2018 23:38:59 +0200 Message-Id: <20180503213903.30335-3-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180503213903.30335-1-laurent@vivier.eu> References: <20180503213903.30335-1-laurent@vivier.eu> MIME-Version: 1.0 X-Provags-ID: V03:K1:3YDDdwNbwj/icOaSG7yHKauSRBcv9ZjiTvFCsozlYFEhizF4PPR 9dBN+4WGuFReBG7lhT+aJG+5tIP98Q3Io9UfJ5Go3SMwzl/3LG5Hzd3Gl2I6MvQ/OFV/0hH yFJzzsIV5S5jhoud2udjuO82H7I69Z29vIiMJ6eh2f+tWju8syEgEQ0rDKIrV1jFD4llAKj nU33SjuuaTqY/3Tg5TVbQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:UBUFxmVQr9Q=:GCg0lI/dGZcqWv+Lz2o5f8 6m7MjRUa/Cc4tT+wy/6BYfIPXnLeyt+G50r91X1L7XtJMRsRDRbjaHdsgxHQ4ms/RWFBoQUOc wue94Gq+4Ur2QrqvibC7N3WyRpncZNarLNBfQzfcG3Co22QwFE2FG2RtYmBdhpuX+364MdwME 3CobaLv+BuTzaXMMnPJiM0Z4f0jTZrwGkuzfdMSwaBXT/7fz4yT6WXEDgtVvYvdwLP1WnH4Lw 4nNUkZ22Dxg7jzriOH6oqwRpbPTKi2jxU3RpVFFNJxaBCDGatkiBsr1YXmAa+8MlGy1WywaXb cojF60PPKY8BehXaOObWuCzkbX9MG/e7yHU1lmRVtMBj1JP53EYWc4kCgiDTBnS7t8sdzBgsA dOTcOOGQQWOjHpfFMko7iEnWTRyqLjOU3moaxoG7rX0wj4GS3znUVEvl2xN8KL6YqYKYjggS+ 8mJO5kbIE6Tf28HWsQKgnsq2j2b7s2A3CXRm32m4I2xf4Y/s8qUbDGN+ZYZ1URwVAGkTEbMk7 HzVJQfCUyVeBgoPpC3n3AkCkbkP8MwZH34IpUy+0VkhA9koMq0xBtxyAUoCcPh8EiLAO/tZUZ SqLbSKU6AhZfUpSgOgK1US8QPdXuPa3bMMNcJBUz9heqK0NTdFQ9ByFJJJQqPvbX40pXRviWe WCrQK8nqKFYz/wBubgvkDfNUrp5c8SySK0mLJeOYUOMRPpKhIzJT2DOmSMRATJv2KA2hNDfxP Ot6Q1Ug9aTv6hro7 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.75 Subject: [Qemu-devel] [PULL 2/6] linux-user: ARM-FDPIC: Identify ARM FDPIC binaries X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Christophe Lyon , Riku Voipio , Laurent Vivier Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Christophe Lyon Define an ARM-specific version of elf_is_fdpic: FDPIC ELF objects are identified with e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC. Co-Authored-By: Mickaël Guêné Signed-off-by: Christophe Lyon Reviewed-by: Peter Maydell Message-Id: <20180430080404.7323-3-christophe.lyon@st.com> Signed-off-by: Laurent Vivier --- include/elf.h | 1 + linux-user/elfload.c | 7 +++++++ 2 files changed, 8 insertions(+) -- 2.14.3 diff --git a/include/elf.h b/include/elf.h index c0dc9bb5fd..934dbbd6b3 100644 --- a/include/elf.h +++ b/include/elf.h @@ -1483,6 +1483,7 @@ typedef struct elf64_shdr { #define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */ #define ELFOSABI_MODESTO 11 /* Novell Modesto. */ #define ELFOSABI_OPENBSD 12 /* OpenBSD. */ +#define ELFOSABI_ARM_FDPIC 65 /* ARM FDPIC */ #define ELFOSABI_ARM 97 /* ARM */ #define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ diff --git a/linux-user/elfload.c b/linux-user/elfload.c index bbe93b03b6..76d7718b3d 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -1681,11 +1681,18 @@ static void zero_bss(abi_ulong elf_bss, abi_ulong last_bss, int prot) } } +#ifdef TARGET_ARM +static int elf_is_fdpic(struct elfhdr *exec) +{ + return exec->e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC; +} +#else /* Default implementation, always false. */ static int elf_is_fdpic(struct elfhdr *exec) { return 0; } +#endif static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_ulong sp) { From patchwork Thu May 3 21:39:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 134924 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp87646lji; Thu, 3 May 2018 14:42:34 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoZQ/3i1f93LYID7sEkuiI+gg1Th7R64bwy2QXqn8phtOox/9a26lyye7PoXHkqFmUni1Pi X-Received: by 2002:ac8:18f9:: with SMTP id o54-v6mr22420026qtk.353.1525383754416; Thu, 03 May 2018 14:42:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525383754; cv=none; d=google.com; s=arc-20160816; b=NRptiyGeWw4p8yNy/ixhwtogWssW82HKye+w9FTz9dCHvrgbbzEJGi/81tCXcSb/L4 f9f4J3TkjDBFSCuQOO8mEXeKU5Oo66MdL5cMPZhRYg96yanmzCbG2bgi8npUFdN7cjn7 fxYujuxjbhG00iGl4r9NuQpbnPJh7z6VBLOjXtLgGukw/+xDIsPcQdGNoOqG0pPnxvS5 a5Y3KNcPoq+YHZ6lmPOb8qw4y1lI7myeeXQWuDh55MdKBAxpSAM/GcWnU5ZBT9g32jcn Ja6GPnyyMlUgAejum9I5O3C3YzyJvAAh6GSZgg71BypnK1rNGr7dmrm41mN/ZWqYqCR1 IxoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:to:from:arc-authentication-results; bh=WCtgnzb1ZaG5e46DDwna7TSO7aC1sO7jhW5HlBdj/ZU=; b=jmvNr8SGZZbYOM2QWngQQlmtiXj2M4YjA7A1W5A4ak0v80DAoTswIZWgnnZdLi5pGF rFISO6Wx3v9g3YsRM7b9ZlqgN9ovm7Os6ZR5aJWrqYtRoXXPiM6pmBtoZ+1f279aEmZM /jVh8qy1aP6mYbwOmwNvJH/5Pxf783u0GhPldPd+0sfBb4oR8cdP+0Uw+Vfo/UzNlL/2 ZyEjfImkxTmIiiTaIHzCdb/C9S3jHa5iSKyxOTsVbXJ5aN39Kq3RFbV9pd6OMFvqlv0w FYNGAFJmabQm0IaloUwnw94Y9qhdzswdkSq3XQGJnGdi1HQCAnfgr5jIoTGfHSTbljNu m+vw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id j9si6604400qke.0.2018.05.03.14.42.34 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 03 May 2018 14:42:34 -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; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Received: from localhost ([::1]:59216 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELzl-0007Rn-SC for patch@linaro.org; Thu, 03 May 2018 17:42:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54821) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELwo-0004jG-OF for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fELwk-00056a-Oe for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:30 -0400 Received: from mout.kundenserver.de ([212.227.17.10]:57747) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fELwk-00054P-CN for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:26 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0LjsL3-1ecY9Y1bSr-00br4p; Thu, 03 May 2018 23:39:13 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 3 May 2018 23:39:00 +0200 Message-Id: <20180503213903.30335-4-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180503213903.30335-1-laurent@vivier.eu> References: <20180503213903.30335-1-laurent@vivier.eu> MIME-Version: 1.0 X-Provags-ID: V03:K1:yBA/G5LEImaQWJL6v6bSgbdgQvbfcu8KAOUOv62KmN7fTFQje+B hs11zmJmz3aKd6zUbZ2RUL9m2ijeWURzvwLhFd4OFWE+hTmpQ+eMqjN3uEUZfTb0xU+P3FJ qNPzH3J+ATMjTpBEQkITIHZfnKsfvncjB3C/0/S8tPqkHSZ4p2Fi1pdXoN3DL7teOP5uUfc lxybrN8TV4SsKVQn0KjiA== X-UI-Out-Filterresults: notjunk:1; V01:K0:FTohLbnJRhY=:HGIMddToXBYOKfL2FC3586 UsRqH0pJNiYWB0iDOsb7YvX6ZU+Cyna8YPGkS1CxyWq1+hurGmS2Oi6hNtptPEp23WQHCmBT0 fTzONOeXnh6itPo5QhkYLdv2ujHLXfFIStHqJgiS1Lt596lyzM3QDBi3aXlEWD2rdffpob+Wv XznZs1aNmcTT0AUgPYRqckXXiNU8YPVoPN5WO4yVGBGHG57Ykec7GlU6m+mKD9nwW0VDGG9XW 4J1CmwXXNNlPO/BFqZl1xjJe1CrLSr2vH6W7t41Ng9NBLdvskvp67rX/XsVIg/8cFmpxKgQjX Rr+owldZF1vkMk74dIMs6WMyf5Ma24Xn69kKeeRhgRD0mrjC3jYFAZwJLWwex5o3l1e55U0P/ 4Ob9I+tWqkpVwpEHcDAS8YGTHWduJpnowN4I/nyAG9/9iyT5HQDzzA0WdUcnjZU4EYZcDWB9N iw7sjMc8BqXAfxxFth0FtZeTxrbpecrxvWpT6w7XXeqYodueUWadUK6fG1rlUg/GrKrJnF5xb nynOhu9y69VyhLDa3NjrKmocOkVxLt8iqMnAxCTkjHI3ZOhOjFE8wD6fJEMAqxBjjGGUwwyVO +RjtEqx6x6Y5J1oQEgs3LtYTl95U08q4gz1pCH5ILEfonwJemS1yTiLZr9G2HVba+XxILio1T oRK0Os0BjAQO/ihU7bYcDegq1DRx5HUP5N2xksBo3yLMlzxr+3PE5ShbdiO2FxBlJeyGhSRVZ h7QEsFUyCSJ767xd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.10 Subject: [Qemu-devel] [PULL 3/6] linux-user: ARM-FDPIC: Add support of FDPIC for ARM. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Christophe Lyon , Riku Voipio , Laurent Vivier Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Christophe Lyon Add FDPIC info into image_info structure since interpreter info is on stack and needs to be saved to be accessed later on. Co-Authored-By: Mickaël Guêné Signed-off-by: Christophe Lyon Reviewed-by: Peter Maydell Message-Id: <20180430080404.7323-4-christophe.lyon@st.com> Signed-off-by: Laurent Vivier --- linux-user/elfload.c | 29 +++++++++++++++++++++++++++++ linux-user/qemu.h | 9 +++++++++ 2 files changed, 38 insertions(+) -- 2.14.3 diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 76d7718b3d..36d52194bc 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -78,6 +78,11 @@ enum { */ #define personality(pers) (pers & PER_MASK) +int info_is_fdpic(struct image_info *info) +{ + return info->personality == PER_LINUX_FDPIC; +} + /* this flag is uneffective under linux too, should be deleted */ #ifndef MAP_DENYWRITE #define MAP_DENYWRITE 0 @@ -287,6 +292,25 @@ static inline void init_thread(struct target_pt_regs *regs, /* For uClinux PIC binaries. */ /* XXX: Linux does this only on ARM with no MMU (do we care ?) */ regs->uregs[10] = infop->start_data; + + /* Support ARM FDPIC. */ + if (info_is_fdpic(infop)) { + /* As described in the ABI document, r7 points to the loadmap info + * prepared by the kernel. If an interpreter is needed, r8 points + * to the interpreter loadmap and r9 points to the interpreter + * PT_DYNAMIC info. If no interpreter is needed, r8 is zero, and + * r9 points to the main program PT_DYNAMIC info. + */ + regs->uregs[7] = infop->loadmap_addr; + if (infop->interpreter_loadmap_addr) { + /* Executable is dynamically loaded. */ + regs->uregs[8] = infop->interpreter_loadmap_addr; + regs->uregs[9] = infop->interpreter_pt_dynamic_addr; + } else { + regs->uregs[8] = 0; + regs->uregs[9] = infop->pt_dynamic_addr; + } + } } #define ELF_NREG 18 @@ -1745,6 +1769,11 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, if (interp_info) { interp_info->other_info = info; sp = loader_build_fdpic_loadmap(interp_info, sp); + info->interpreter_loadmap_addr = interp_info->loadmap_addr; + info->interpreter_pt_dynamic_addr = interp_info->pt_dynamic_addr; + } else { + info->interpreter_loadmap_addr = 0; + info->interpreter_pt_dynamic_addr = 0; } } diff --git a/linux-user/qemu.h b/linux-user/qemu.h index da3b51724c..c55c8e294b 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -57,6 +57,8 @@ struct image_info { uint16_t nsegs; void *loadsegs; abi_ulong pt_dynamic_addr; + abi_ulong interpreter_loadmap_addr; + abi_ulong interpreter_pt_dynamic_addr; struct image_info *other_info; }; @@ -183,6 +185,13 @@ int loader_exec(int fdexec, const char *filename, char **argv, char **envp, struct target_pt_regs * regs, struct image_info *infop, struct linux_binprm *); +/* Returns true if the image uses the FDPIC ABI. If this is the case, + * we have to provide some information (loadmap, pt_dynamic_info) such + * that the program can be relocated adequately. This is also useful + * when handling signals. + */ +int info_is_fdpic(struct image_info *info); + uint32_t get_elf_eflags(int fd); int load_elf_binary(struct linux_binprm *bprm, struct image_info *info); int load_flt_binary(struct linux_binprm *bprm, struct image_info *info); From patchwork Thu May 3 21:39:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 134922 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp85814lji; Thu, 3 May 2018 14:40:03 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqyBrxrqsygSWZEvAi81b/2u46JNi5RPM4O1++DNR7cIOHWv+RYTGn61eoz5NyfF4qZUTmo X-Received: by 10.55.31.24 with SMTP id f24mr20679559qkf.442.1525383603711; Thu, 03 May 2018 14:40:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525383603; cv=none; d=google.com; s=arc-20160816; b=znwSR0172wkJuy74JPIBXN1hu/OzDO1GxzcV8ekx9tenEVVJDy8mX8UuMTDUd/Kqr2 N5Ehc7rsJFdhmCIfiKiUo4vzjgRA4vibp+BZsj0XMsNchHWTGCBiCEmrbxYrOHDV75cI xHQX6eJRfUMe7nHKaoIJiEs5eHheFd+nndGlnmvxFVJ50daqAO0w5PSP7ARaec8aiDnl IGMH/rYCuU6iRHXvO3KA149B255ZQgYHPSH3qHvfLyXv78Ael2oLXwf1rIJSAcRAWBFf ayF+OvlNbc918Kf4cuQ0G4tQG7JNEmeX5upExTh7914pFmLiTX+91O8SgRebwY62rmLm O0XQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:to:from:arc-authentication-results; bh=FUn/eg1viLId54H1zVI0K0ZwOIZorK8kurxSMzQaV/c=; b=fRIDm7nMvUmCqNYE7faq5ezzGPTGHjUVyxY9DpED4Fdpd3+Xrct75dRPPXkSiIK6MC FyIyeGJ5FXZhXT3JHrWxFsVkhUb1V5CYU+XFtnksTaG/n2MUYJOlLSmF8Y9M6KmEyoeH w96oqkRmxuAGyRQNgI4RyMRxZtI4NfyDpP9GYotQQbaY78mdCPFvcI7I7KfFbi3nfJZS yQ7nNJyLokhAmUpsMan4TmjV/cX176KZDIC7YaKmLvgaR1fSkIlFZb+1uSoi0r59mhAP JaotHblYQ7DxLu5f/EE98+jFo1XLs0Ly/NhztlvLaClDkRFTrttR8nRTbkUTIMdjHZ/H dSdQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id p142si8430734qke.78.2018.05.03.14.40.03 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 03 May 2018 14:40:03 -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; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org Received: from localhost ([::1]:59201 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELxL-0004jt-4e for patch@linaro.org; Thu, 03 May 2018 17:40:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54809) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELwo-0004jD-9a for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fELwk-00055i-8Q for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:30 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:46273) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fELwj-00052j-Rf for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:26 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0M9XrD-1f3g2n1NvD-00Cw7t; Thu, 03 May 2018 23:39:14 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 3 May 2018 23:39:01 +0200 Message-Id: <20180503213903.30335-5-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180503213903.30335-1-laurent@vivier.eu> References: <20180503213903.30335-1-laurent@vivier.eu> MIME-Version: 1.0 X-Provags-ID: V03:K1:+h1q2GPJwbr6rO7T1imoa8FhgOYdKWFha1OlvG5Kxr+OOHu8lUr U9968Igd6nVDiBjJMFzT+x8MkgVToQBXzv8oWKpSu+TbUrmLwIJqmh/2jYONjE35jD7Wbz/ K+TsVud8rbZ2zf3i1zCvQmGrPvk7OrHkj+zMGZ/L7wPidzZZZcB/Rv43ZmAeJXsAmYua1Xt HqQXA+R4Iuro2b2nKl3Ug== X-UI-Out-Filterresults: notjunk:1; V01:K0:xqdIkOFFe5o=:HJ8d340aiUDXH4IZSesoNI L60ZW77KkKBjphSFlYFGT9RfM3tlGQabwq6KmAe22zCUizMw8N2zL5rtRC8PzDtZ/xe0LZpKU pgr13gO4wGN0yEnrFWm592zIQFJU43uJhM3hEcFDD+jNu8HJjIaYK6sG9GLQ176Rm2Xtl6an0 44EfwzXaue9icIfxdeYzgiUz+zJ4vXBT8tCDzw4AEUwRbnez6kYgAkXgGkVGwGXXFemu0Vjvm PrmfTZvbOr4XvDZ2yguoX+L9QzgrbFgZe0IG/ODV0Gcr3PoMMOpxT065npbC1d32azdVgB7Iw UK4vzHLMApDgO41OL52zEE1jFRTLglGv35/io4iFFwAaPh7lGOMEhNlRg24llf4HTl78X3UNN 0mekewMRRgH2bGYjqXHe5A1gvhuBV3IixkpwaNkMLbwSF2nvHxIBBwyNvr69orAdJLIHVfXos uC9vGzwemrR0dUHuKJi3zx41Jh6IebBKqvZto/IgUjUnbM34EKPx39rRR2wSAyqdreFvuNTj1 eSfma8g//gLBTaP4WD9GS4ObxqdRy+Ah0CqQSHWUcOrAFjwYS3OinctBMaEL4mv5kW+u7fK1b 8bpOJcGgeHi/gU69fZNAMb9aaqJy+wopAU8/dARMMvKj+SuHQCYFBjQJCqLIllRcX3JR0EUCm pSKPU2MhIGh2QZQqqAUtPiMbKIPHXqp9kOWpuJimYlgIO/e3UmS6KQXq9lBSTQLohL9jdL9df yE2lRG8jIzdQZc0M X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.73 Subject: [Qemu-devel] [PULL 4/6] linux-user: ARM-FDPIC: Add support for signals for FDPIC targets X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Christophe Lyon , Riku Voipio , Laurent Vivier Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Christophe Lyon The FDPIC restorer needs to deal with a function descriptor, hence we have to extend 'retcode' such that it can hold the instructions needed to perform this. The restorer sequence uses the same thumbness as the exception handler (mainly to support Thumb-only architectures). Co-Authored-By: Mickaël Guêné Signed-off-by: Christophe Lyon Reviewed-by: Peter Maydell Message-Id: <20180430080404.7323-5-christophe.lyon@st.com> [lv: moved the change to linux-user/arm/signal.c] Signed-off-by: Laurent Vivier --- linux-user/arm/signal.c | 105 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 89 insertions(+), 16 deletions(-) -- 2.14.3 diff --git a/linux-user/arm/signal.c b/linux-user/arm/signal.c index 0c1ec53025..eb72be5dd0 100644 --- a/linux-user/arm/signal.c +++ b/linux-user/arm/signal.c @@ -102,13 +102,13 @@ struct sigframe_v1 { struct target_sigcontext sc; abi_ulong extramask[TARGET_NSIG_WORDS-1]; - abi_ulong retcode; + abi_ulong retcode[4]; }; struct sigframe_v2 { struct target_ucontext_v2 uc; - abi_ulong retcode; + abi_ulong retcode[4]; }; struct rt_sigframe_v1 @@ -117,14 +117,14 @@ struct rt_sigframe_v1 abi_ulong puc; struct target_siginfo info; struct target_ucontext_v1 uc; - abi_ulong retcode; + abi_ulong retcode[4]; }; struct rt_sigframe_v2 { struct target_siginfo info; struct target_ucontext_v2 uc; - abi_ulong retcode; + abi_ulong retcode[4]; }; #define TARGET_CONFIG_CPU_32 1 @@ -147,6 +147,21 @@ static const abi_ulong retcodes[4] = { SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN }; +/* + * Stub needed to make sure the FD register (r9) contains the right + * value. + */ +static const unsigned long sigreturn_fdpic_codes[3] = { + 0xe59fc004, /* ldr r12, [pc, #4] to read function descriptor */ + 0xe59c9004, /* ldr r9, [r12, #4] to setup GOT */ + 0xe59cf000 /* ldr pc, [r12] to jump into restorer */ +}; + +static const unsigned long sigreturn_fdpic_thumb_codes[3] = { + 0xc008f8df, /* ldr r12, [pc, #8] to read function descriptor */ + 0x9004f8dc, /* ldr r9, [r12, #4] to setup GOT */ + 0xf000f8dc /* ldr pc, [r12] to jump into restorer */ +}; static inline int valid_user_regs(CPUARMState *regs) { @@ -200,13 +215,33 @@ get_sigframe(struct target_sigaction *ka, CPUARMState *regs, int framesize) return (sp - framesize) & ~7; } -static void +static int setup_return(CPUARMState *env, struct target_sigaction *ka, abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr) { - abi_ulong handler = ka->_sa_handler; + abi_ulong handler = 0; + abi_ulong handler_fdpic_GOT = 0; abi_ulong retcode; - int thumb = handler & 1; + + int thumb; + int is_fdpic = info_is_fdpic(((TaskState *)thread_cpu->opaque)->info); + + if (is_fdpic) { + /* In FDPIC mode, ka->_sa_handler points to a function + * descriptor (FD). The first word contains the address of the + * handler. The second word contains the value of the PIC + * register (r9). */ + abi_ulong funcdesc_ptr = ka->_sa_handler; + if (get_user_ual(handler, funcdesc_ptr) + || get_user_ual(handler_fdpic_GOT, funcdesc_ptr + 4)) { + return 1; + } + } else { + handler = ka->_sa_handler; + } + + thumb = handler & 1; + uint32_t cpsr = cpsr_read(env); cpsr &= ~CPSR_IT; @@ -217,7 +252,28 @@ setup_return(CPUARMState *env, struct target_sigaction *ka, } if (ka->sa_flags & TARGET_SA_RESTORER) { - retcode = ka->sa_restorer; + if (is_fdpic) { + /* For FDPIC we ensure that the restorer is called with a + * correct r9 value. For that we need to write code on + * the stack that sets r9 and jumps back to restorer + * value. + */ + if (thumb) { + __put_user(sigreturn_fdpic_thumb_codes[0], rc); + __put_user(sigreturn_fdpic_thumb_codes[1], rc + 1); + __put_user(sigreturn_fdpic_thumb_codes[2], rc + 2); + __put_user((abi_ulong)ka->sa_restorer, rc + 3); + } else { + __put_user(sigreturn_fdpic_codes[0], rc); + __put_user(sigreturn_fdpic_codes[1], rc + 1); + __put_user(sigreturn_fdpic_codes[2], rc + 2); + __put_user((abi_ulong)ka->sa_restorer, rc + 3); + } + + retcode = rc_addr + thumb; + } else { + retcode = ka->sa_restorer; + } } else { unsigned int idx = thumb; @@ -231,10 +287,15 @@ setup_return(CPUARMState *env, struct target_sigaction *ka, } env->regs[0] = usig; + if (is_fdpic) { + env->regs[9] = handler_fdpic_GOT; + } env->regs[13] = frame_addr; env->regs[14] = retcode; env->regs[15] = handler & (thumb ? ~1 : ~3); cpsr_write(env, cpsr, CPSR_IT | CPSR_T, CPSRWriteByInstr); + + return 0; } static abi_ulong *setup_sigframe_v2_vfp(abi_ulong *regspace, CPUARMState *env) @@ -327,12 +388,15 @@ static void setup_frame_v1(int usig, struct target_sigaction *ka, __put_user(set->sig[i], &frame->extramask[i - 1]); } - setup_return(regs, ka, &frame->retcode, frame_addr, usig, - frame_addr + offsetof(struct sigframe_v1, retcode)); + if (setup_return(regs, ka, frame->retcode, frame_addr, usig, + frame_addr + offsetof(struct sigframe_v1, retcode))) { + goto sigsegv; + } unlock_user_struct(frame, frame_addr, 1); return; sigsegv: + unlock_user_struct(frame, frame_addr, 1); force_sigsegv(usig); } @@ -349,12 +413,15 @@ static void setup_frame_v2(int usig, struct target_sigaction *ka, setup_sigframe_v2(&frame->uc, set, regs); - setup_return(regs, ka, &frame->retcode, frame_addr, usig, - frame_addr + offsetof(struct sigframe_v2, retcode)); + if (setup_return(regs, ka, frame->retcode, frame_addr, usig, + frame_addr + offsetof(struct sigframe_v2, retcode))) { + goto sigsegv; + } unlock_user_struct(frame, frame_addr, 1); return; sigsegv: + unlock_user_struct(frame, frame_addr, 1); force_sigsegv(usig); } @@ -404,8 +471,10 @@ static void setup_rt_frame_v1(int usig, struct target_sigaction *ka, __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); } - setup_return(env, ka, &frame->retcode, frame_addr, usig, - frame_addr + offsetof(struct rt_sigframe_v1, retcode)); + if (setup_return(env, ka, frame->retcode, frame_addr, usig, + frame_addr + offsetof(struct rt_sigframe_v1, retcode))) { + goto sigsegv; + } env->regs[1] = info_addr; env->regs[2] = uc_addr; @@ -413,6 +482,7 @@ static void setup_rt_frame_v1(int usig, struct target_sigaction *ka, unlock_user_struct(frame, frame_addr, 1); return; sigsegv: + unlock_user_struct(frame, frame_addr, 1); force_sigsegv(usig); } @@ -435,8 +505,10 @@ static void setup_rt_frame_v2(int usig, struct target_sigaction *ka, setup_sigframe_v2(&frame->uc, set, env); - setup_return(env, ka, &frame->retcode, frame_addr, usig, - frame_addr + offsetof(struct rt_sigframe_v2, retcode)); + if (setup_return(env, ka, frame->retcode, frame_addr, usig, + frame_addr + offsetof(struct rt_sigframe_v2, retcode))) { + goto sigsegv; + } env->regs[1] = info_addr; env->regs[2] = uc_addr; @@ -444,6 +516,7 @@ static void setup_rt_frame_v2(int usig, struct target_sigaction *ka, unlock_user_struct(frame, frame_addr, 1); return; sigsegv: + unlock_user_struct(frame, frame_addr, 1); force_sigsegv(usig); }