From nobody Wed Oct 29 09:10:29 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525383713709358.5071250958068; Thu, 3 May 2018 14:41:53 -0700 (PDT) Received: from localhost ([::1]:59209 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELyx-0006He-EH for importer@patchew.org; Thu, 03 May 2018 17:41:43 -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+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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(-) 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 la= st_bss, int prot) } } =20 -#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_u= long sp) { uint16_t n; @@ -1706,7 +1711,6 @@ static abi_ulong loader_build_fdpic_loadmap(struct im= age_info *info, abi_ulong s =20 return sp; } -#endif =20 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 a= rgc, int envc, =20 sp =3D p; =20 -#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 a= rgc, int envc, sp =3D loader_build_fdpic_loadmap(interp_info, sp); } } -#endif =20 u_platform =3D 0; k_platform =3D ELF_PLATFORM; @@ -2153,10 +2155,8 @@ static void load_elf_image(const char *image_name, i= nt image_fd, } bswap_phdr(phdr, ehdr->e_phnum); =20 -#ifdef CONFIG_USE_FDPIC info->nsegs =3D 0; info->pt_dynamic_addr =3D 0; -#endif =20 mmap_lock(); =20 @@ -2173,9 +2173,7 @@ static void load_elf_image(const char *image_name, in= t image_fd, if (a > hiaddr) { hiaddr =3D a; } -#ifdef CONFIG_USE_FDPIC ++info->nsegs; -#endif } } =20 @@ -2200,8 +2198,7 @@ static void load_elf_image(const char *image_name, in= t image_fd, } load_bias =3D load_addr - loaddr; =20 -#ifdef CONFIG_USE_FDPIC - { + if (elf_is_fdpic(ehdr)) { struct elf32_fdpic_loadseg *loadsegs =3D info->loadsegs =3D g_malloc(sizeof(*loadsegs) * info->nsegs); =20 @@ -2219,7 +2216,6 @@ static void load_elf_image(const char *image_name, in= t image_fd, } } } -#endif =20 info->load_bias =3D load_bias; info->load_addr =3D 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 }; =20 #ifdef TARGET_I386 --=20 2.14.3 From nobody Wed Oct 29 09:10:29 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525383875518582.4586048894004; Thu, 3 May 2018 14:44:35 -0700 (PDT) Received: from localhost ([::1]:59223 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEM1i-00008P-N0 for importer@patchew.org; Thu, 03 May 2018 17:44:34 -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 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 From: Christophe Lyon Define an ARM-specific version of elf_is_fdpic: FDPIC ELF objects are identified with e_ident[EI_OSABI] =3D=3D ELFOSABI_ARM_FDPIC. Co-Authored-By: Micka=C3=ABl Gu=C3=AAn=C3=A9 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(+) 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) applicati= on */ =20 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 l= ast_bss, int prot) } } =20 +#ifdef TARGET_ARM +static int elf_is_fdpic(struct elfhdr *exec) +{ + return exec->e_ident[EI_OSABI] =3D=3D ELFOSABI_ARM_FDPIC; +} +#else /* Default implementation, always false. */ static int elf_is_fdpic(struct elfhdr *exec) { return 0; } +#endif =20 static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_u= long sp) { --=20 2.14.3 From nobody Wed Oct 29 09:10:29 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525383713487437.94587084042587; Thu, 3 May 2018 14:41:53 -0700 (PDT) Received: from localhost ([::1]:59212 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELz0-0006J0-2v for importer@patchew.org; Thu, 03 May 2018 17:41:46 -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 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 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=C3=ABl Gu=C3=AAn=C3=A9 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(+) 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) =20 +int info_is_fdpic(struct image_info *info) +{ + return info->personality =3D=3D 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] =3D 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] =3D infop->loadmap_addr; + if (infop->interpreter_loadmap_addr) { + /* Executable is dynamically loaded. */ + regs->uregs[8] =3D infop->interpreter_loadmap_addr; + regs->uregs[9] =3D infop->interpreter_pt_dynamic_addr; + } else { + regs->uregs[8] =3D 0; + regs->uregs[9] =3D infop->pt_dynamic_addr; + } + } } =20 #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 =3D info; sp =3D loader_build_fdpic_loadmap(interp_info, sp); + info->interpreter_loadmap_addr =3D interp_info->loadmap_addr; + info->interpreter_pt_dynamic_addr =3D interp_info->pt_dynamic_= addr; + } else { + info->interpreter_loadmap_addr =3D 0; + info->interpreter_pt_dynamic_addr =3D 0; } } =20 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; }; =20 @@ -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 *); =20 +/* 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); --=20 2.14.3 From nobody Wed Oct 29 09:10:29 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525383714067118.0103462337828; Thu, 3 May 2018 14:41:54 -0700 (PDT) Received: from localhost ([::1]:59210 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELyz-0006Hz-3g for importer@patchew.org; Thu, 03 May 2018 17:41:45 -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 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable 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+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 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=C3=ABl Gu=C3=AAn=C3=A9 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(-) 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]; }; =20 struct sigframe_v2 { struct target_ucontext_v2 uc; - abi_ulong retcode; + abi_ulong retcode[4]; }; =20 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]; }; =20 struct rt_sigframe_v2 { struct target_siginfo info; struct target_ucontext_v2 uc; - abi_ulong retcode; + abi_ulong retcode[4]; }; =20 #define TARGET_CONFIG_CPU_32 1 @@ -147,6 +147,21 @@ static const abi_ulong retcodes[4] =3D { SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN }; =20 +/* + * Stub needed to make sure the FD register (r9) contains the right + * value. + */ +static const unsigned long sigreturn_fdpic_codes[3] =3D { + 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] =3D { + 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 */ +}; =20 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; } =20 -static void +static int setup_return(CPUARMState *env, struct target_sigaction *ka, abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_a= ddr) { - abi_ulong handler =3D ka->_sa_handler; + abi_ulong handler =3D 0; + abi_ulong handler_fdpic_GOT =3D 0; abi_ulong retcode; - int thumb =3D handler & 1; + + int thumb; + int is_fdpic =3D 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 =3D ka->_sa_handler; + if (get_user_ual(handler, funcdesc_ptr) + || get_user_ual(handler_fdpic_GOT, funcdesc_ptr + 4)) { + return 1; + } + } else { + handler =3D ka->_sa_handler; + } + + thumb =3D handler & 1; + uint32_t cpsr =3D cpsr_read(env); =20 cpsr &=3D ~CPSR_IT; @@ -217,7 +252,28 @@ setup_return(CPUARMState *env, struct target_sigaction= *ka, } =20 if (ka->sa_flags & TARGET_SA_RESTORER) { - retcode =3D 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 =3D rc_addr + thumb; + } else { + retcode =3D ka->sa_restorer; + } } else { unsigned int idx =3D thumb; =20 @@ -231,10 +287,15 @@ setup_return(CPUARMState *env, struct target_sigactio= n *ka, } =20 env->regs[0] =3D usig; + if (is_fdpic) { + env->regs[9] =3D handler_fdpic_GOT; + } env->regs[13] =3D frame_addr; env->regs[14] =3D retcode; env->regs[15] =3D handler & (thumb ? ~1 : ~3); cpsr_write(env, cpsr, CPSR_IT | CPSR_T, CPSRWriteByInstr); + + return 0; } =20 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_si= gaction *ka, __put_user(set->sig[i], &frame->extramask[i - 1]); } =20 - 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; + } =20 unlock_user_struct(frame, frame_addr, 1); return; sigsegv: + unlock_user_struct(frame, frame_addr, 1); force_sigsegv(usig); } =20 @@ -349,12 +413,15 @@ static void setup_frame_v2(int usig, struct target_si= gaction *ka, =20 setup_sigframe_v2(&frame->uc, set, regs); =20 - 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; + } =20 unlock_user_struct(frame, frame_addr, 1); return; sigsegv: + unlock_user_struct(frame, frame_addr, 1); force_sigsegv(usig); } =20 @@ -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]); } =20 - 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; + } =20 env->regs[1] =3D info_addr; env->regs[2] =3D uc_addr; @@ -413,6 +482,7 @@ static void setup_rt_frame_v1(int usig, struct target_s= igaction *ka, unlock_user_struct(frame, frame_addr, 1); return; sigsegv: + unlock_user_struct(frame, frame_addr, 1); force_sigsegv(usig); } =20 @@ -435,8 +505,10 @@ static void setup_rt_frame_v2(int usig, struct target_= sigaction *ka, =20 setup_sigframe_v2(&frame->uc, set, env); =20 - 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; + } =20 env->regs[1] =3D info_addr; env->regs[2] =3D uc_addr; @@ -444,6 +516,7 @@ static void setup_rt_frame_v2(int usig, struct target_s= igaction *ka, unlock_user_struct(frame, frame_addr, 1); return; sigsegv: + unlock_user_struct(frame, frame_addr, 1); force_sigsegv(usig); } =20 --=20 2.14.3 From nobody Wed Oct 29 09:10:29 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525383882016348.76478185418694; Thu, 3 May 2018 14:44:42 -0700 (PDT) Received: from localhost ([::1]:59224 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEM1p-0000Cg-58 for importer@patchew.org; Thu, 03 May 2018 17:44:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54892) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELwr-0004ji-KG for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fELwn-0005Bw-J9 for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:33 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:59269) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fELwn-00059t-31 for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:29 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0LfBVo-1eYThC3fD6-00olNe; Thu, 03 May 2018 23:39:15 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 3 May 2018 23:39:02 +0200 Message-Id: <20180503213903.30335-6-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:QLbrEAeI/8pcM1wW98H2U/4eF9Tckv6i8/3Pk2MlrYOzgIT6dMo PDZTbOzAO1C9zH+CyWIgowazWaedvowcwHvTee7z2wSU51A2TeYD2juD2+s9lE/rRM5/Vsx ymkagk2XTAmTwhWuXbRrWTP3UK4pRtOuqKh+IyV9kszv0vXAtdlFCSGoM8sbYFOEJzSO+q3 Rg6y44fL3LczPMOgi85ZQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:BLZBatlDAwQ=:TFhnkmsHUEq77Aze/mxFJg JJDXmh/SlaC7Aik75k8GPHC/hnrR2tje6QxbKydkPnxxXHpE3yuIrNt9dasiUkDislhj27m5f 5F/h8BYDO69FXUxQdg3FldxLOJJ0Z9cwzFHsFi700Ntj/fMhUkyQ/WukSC6Qz4IuoDTtBpnp4 ebrHXkLU4vX3rbc6Zq18nqnreLemyga4pGDRkE9ZuD0kkMO/Rbw5eko0NzbfZZuvd9rmQM120 zHvuGf2HHIpafkdUfaZt5SXyS4EpdI8dxSdDfNAivWuA5iSHxsbA4U3b88Vqkk21xFteunuuw htlg0xeMczGzLWrVagiS1vT+CzAWfV9ACDBPDsIWgxkvgHd9kJSQSnTU60SGMe+iJVkc12AUn 2QV9PUdSHmyLcsuailZD2qtZJaV0GBmp8Zt50IsR+uIJX6WcHnK/k4C7bHseCK/JSkgGVmxxn 4zRhTF2SF64eCruv1sORO3CckQLPsFxPUwpEFe1oaue4M3gASQmpeLOHdRbDjewkZTro1LVwt 4Q5NuwJrR7JP/VZUr52XyTXPLtDCcRBbj0d3dnt2tW9Ggl2IWqvi18dq1y3z+w97QV4BwJfJK 7fxKaQApolX+zJt0U+rESl63CTJxxl7Te5f4XtFn0hrJA8t/iVIxQLe7t9RFElUDcyddTXodt 77Ku47Lg3htney6UYN60wOxgB6G15Oi1RmDL1QYweYWW/9NMVS5CG37LvZGfl163V3iI= 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 5/6] linux-user: introduce target_sigsp() and target_save_altstack() 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: Riku Voipio , Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Laurent Vivier Reviewed-by: Richard Henderson Message-Id: <20180411192347.30228-1-laurent@vivier.eu> --- linux-user/aarch64/signal.c | 13 ++----------- linux-user/alpha/signal.c | 17 ++++++----------- linux-user/arm/signal.c | 17 ++++------------- linux-user/hppa/signal.c | 14 ++++---------- linux-user/i386/signal.c | 12 +++--------- linux-user/m68k/signal.c | 15 +++------------ linux-user/microblaze/signal.c | 4 +--- linux-user/mips/signal.c | 15 ++------------- linux-user/nios2/signal.c | 21 ++------------------- linux-user/openrisc/signal.c | 14 +++----------- linux-user/ppc/signal.c | 15 ++------------- linux-user/riscv/signal.c | 28 +++++++++------------------- linux-user/s390x/signal.c | 12 +++--------- linux-user/sh4/signal.c | 11 ++--------- linux-user/signal-common.h | 15 ++++----------- linux-user/signal.c | 32 ++++++++++++++++++++++++++++++++ linux-user/sparc/signal.c | 28 +++++++++++++++++++--------- linux-user/tilegx/signal.c | 13 +++---------- linux-user/xtensa/signal.c | 15 ++++----------- 19 files changed, 108 insertions(+), 203 deletions(-) diff --git a/linux-user/aarch64/signal.c b/linux-user/aarch64/signal.c index d90e10a113..f95dc61dfb 100644 --- a/linux-user/aarch64/signal.c +++ b/linux-user/aarch64/signal.c @@ -120,9 +120,7 @@ static void target_setup_general_frame(struct target_rt= _sigframe *sf, __put_user(0, &sf->uc.tuc_flags); __put_user(0, &sf->uc.tuc_link); =20 - __put_user(target_sigaltstack_used.ss_sp, &sf->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->xregs[31]), &sf->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, &sf->uc.tuc_stack.ss_size); + target_save_altstack(&sf->uc.tuc_stack, env); =20 for (i =3D 0; i < 31; i++) { __put_user(env->xregs[i], &sf->uc.tuc_mcontext.regs[i]); @@ -372,14 +370,7 @@ static abi_ulong get_sigframe(struct target_sigaction = *ka, { abi_ulong sp; =20 - sp =3D env->xregs[31]; - - /* - * This is the X/Open sanctioned signal stack switching. - */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } + sp =3D target_sigsp(get_sp_from_cpustate(env), ka); =20 sp =3D (sp - size) & ~15; =20 diff --git a/linux-user/alpha/signal.c b/linux-user/alpha/signal.c index a8c718f2c6..f24de02c6f 100644 --- a/linux-user/alpha/signal.c +++ b/linux-user/alpha/signal.c @@ -117,12 +117,10 @@ static inline abi_ulong get_sigframe(struct target_si= gaction *sa, CPUAlphaState *env, unsigned long framesize) { - abi_ulong sp =3D env->ir[IR_SP]; + abi_ulong sp; + + sp =3D target_sigsp(get_sp_from_cpustate(env), sa); =20 - /* This is the X/Open sanctioned signal stack switching. */ - if ((sa->sa_flags & TARGET_SA_ONSTACK) !=3D 0 && !sas_ss_flags(sp)) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } return (sp - framesize) & -32; } =20 @@ -187,12 +185,9 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, __put_user(0, &frame->uc.tuc_flags); __put_user(0, &frame->uc.tuc_link); __put_user(set->sig[0], &frame->uc.tuc_osf_sigmask); - __put_user(target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->ir[IR_SP]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); + + target_save_altstack(&frame->uc.tuc_stack, env); + setup_sigcontext(&frame->uc.tuc_mcontext, env, frame_addr, set); for (i =3D 0; i < TARGET_NSIG_WORDS; ++i) { __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); diff --git a/linux-user/arm/signal.c b/linux-user/arm/signal.c index eb72be5dd0..59b5b65ed1 100644 --- a/linux-user/arm/signal.c +++ b/linux-user/arm/signal.c @@ -201,14 +201,9 @@ setup_sigcontext(struct target_sigcontext *sc, /*struc= t _fpstate *fpstate,*/ static inline abi_ulong get_sigframe(struct target_sigaction *ka, CPUARMState *regs, int framesize) { - unsigned long sp =3D regs->regs[13]; + unsigned long sp; =20 - /* - * This is the X/Open sanctioned signal stack switching. - */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } + sp =3D target_sigsp(get_sp_from_cpustate(regs), ka); /* * ATPCS B01 mandates 8-byte alignment */ @@ -346,9 +341,7 @@ static void setup_sigframe_v2(struct target_ucontext_v2= *uc, memset(uc, 0, offsetof(struct target_ucontext_v2, tuc_mcontext)); =20 memset(&stack, 0, sizeof(stack)); - __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp); - __put_user(target_sigaltstack_used.ss_size, &stack.ss_size); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags); + target_save_altstack(&stack, env); memcpy(&uc->tuc_stack, &stack, sizeof(stack)); =20 setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]); @@ -461,9 +454,7 @@ static void setup_rt_frame_v1(int usig, struct target_s= igaction *ka, memset(&frame->uc, 0, offsetof(struct target_ucontext_v1, tuc_mcontext= )); =20 memset(&stack, 0, sizeof(stack)); - __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp); - __put_user(target_sigaltstack_used.ss_size, &stack.ss_size); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags); + target_save_altstack(&stack, env); memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack)); =20 setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]); diff --git a/linux-user/hppa/signal.c b/linux-user/hppa/signal.c index 585af3a37f..6e7a295aee 100644 --- a/linux-user/hppa/signal.c +++ b/linux-user/hppa/signal.c @@ -113,11 +113,9 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, struct target_rt_sigframe *frame; int i; =20 - sp =3D env->gr[30]; - if (ka->sa_flags & TARGET_SA_ONSTACK) { - if (sas_ss_flags(sp) =3D=3D 0) { - sp =3D (target_sigaltstack_used.ss_sp + 0x7f) & ~0x3f; - } + sp =3D get_sp_from_cpustate(env); + if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) { + sp =3D (target_sigaltstack_used.ss_sp + 0x7f) & ~0x3f; } frame_addr =3D QEMU_ALIGN_UP(sp, 64); sp =3D frame_addr + PARISC_RT_SIGFRAME_SIZE32; @@ -132,11 +130,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, frame->uc.tuc_flags =3D 0; frame->uc.tuc_link =3D 0; =20 - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); + target_save_altstack(&frame->uc.tuc_stack, env); =20 for (i =3D 0; i < TARGET_NSIG_WORDS; i++) { __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); diff --git a/linux-user/i386/signal.c b/linux-user/i386/signal.c index 4a190e6435..e9a23a2dec 100644 --- a/linux-user/i386/signal.c +++ b/linux-user/i386/signal.c @@ -283,16 +283,14 @@ get_sigframe(struct target_sigaction *ka, CPUX86State= *env, size_t frame_size) unsigned long esp; =20 /* Default to using normal stack */ - esp =3D env->regs[R_ESP]; + esp =3D get_sp_from_cpustate(env); #ifdef TARGET_X86_64 esp -=3D 128; /* this is the redzone */ #endif =20 /* This is the X/Open sanctioned signal stack switching. */ if (ka->sa_flags & TARGET_SA_ONSTACK) { - if (sas_ss_flags(esp) =3D=3D 0) { - esp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_use= d.ss_size; - } + esp =3D target_sigsp(esp, ka); } else { #ifndef TARGET_X86_64 /* This is the legacy signal stack switching. */ @@ -404,11 +402,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, /* Create the ucontext. */ __put_user(0, &frame->uc.tuc_flags); __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); + target_save_altstack(&frame->uc.tuc_stack, env); setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate, env, set->sig[0], frame_addr + offsetof(struct rt_sigframe, fpstate= )); =20 diff --git a/linux-user/m68k/signal.c b/linux-user/m68k/signal.c index fc72468a81..5dd8bb5f99 100644 --- a/linux-user/m68k/signal.c +++ b/linux-user/m68k/signal.c @@ -117,14 +117,10 @@ static inline abi_ulong get_sigframe(struct target_sigaction *ka, CPUM68KState *regs, size_t frame_size) { - unsigned long sp; + abi_ulong sp; =20 - sp =3D regs->aregs[7]; + sp =3D target_sigsp(get_sp_from_cpustate(regs), ka); =20 - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) =3D=3D 0)= ) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } =20 return ((sp - frame_size) & -8UL); } @@ -318,12 +314,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, =20 __put_user(0, &frame->uc.tuc_flags); __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->aregs[7]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); + target_save_altstack(&frame->uc.tuc_stack, env); err |=3D target_rt_setup_ucontext(&frame->uc, env); =20 if (err) diff --git a/linux-user/microblaze/signal.c b/linux-user/microblaze/signal.c index 5572baa7dc..fada0f1495 100644 --- a/linux-user/microblaze/signal.c +++ b/linux-user/microblaze/signal.c @@ -133,9 +133,7 @@ static abi_ulong get_sigframe(struct target_sigaction *= ka, { abi_ulong sp =3D env->regs[1]; =20 - if ((ka->sa_flags & TARGET_SA_ONSTACK) !=3D 0 && !on_sig_stack(sp)) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } + sp =3D target_sigsp(sp, ka); =20 return ((sp - frame_size) & -8UL); } diff --git a/linux-user/mips/signal.c b/linux-user/mips/signal.c index adeb5a4241..ed9849c7f6 100644 --- a/linux-user/mips/signal.c +++ b/linux-user/mips/signal.c @@ -179,20 +179,12 @@ get_sigframe(struct target_sigaction *ka, CPUMIPSStat= e *regs, size_t frame_size) { unsigned long sp; =20 - /* Default to using normal stack */ - sp =3D regs->active_tc.gpr[29]; - /* * FPU emulator may have its own trampoline active just * above the user stack, 16-bytes before the next lowest * 16 byte boundary. Try to avoid trashing it. */ - sp -=3D 32; - - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) =3D=3D 0)= ) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } + sp =3D target_sigsp(get_sp_from_cpustate(regs) - 32, ka); =20 return (sp - frame_size) & ~7; } @@ -323,10 +315,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, =20 __put_user(0, &frame->rs_uc.tuc_flags); __put_user(0, &frame->rs_uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->rs_uc.tuc_stack.ss_s= p); - __put_user(target_sigaltstack_used.ss_size, &frame->rs_uc.tuc_stack.ss= _size); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), - &frame->rs_uc.tuc_stack.ss_flags); + target_save_altstack(&frame->rs_uc.tuc_stack, env); =20 setup_sigcontext(env, &frame->rs_uc.tuc_mcontext); =20 diff --git a/linux-user/nios2/signal.c b/linux-user/nios2/signal.c index 816eed90f1..9a0b36e5ad 100644 --- a/linux-user/nios2/signal.c +++ b/linux-user/nios2/signal.c @@ -42,18 +42,6 @@ struct target_rt_sigframe { struct target_ucontext uc; }; =20 -static unsigned long sigsp(unsigned long sp, struct target_sigaction *ka) -{ - if (unlikely((ka->sa_flags & SA_ONSTACK)) && !sas_ss_flags(sp)) { -#ifdef CONFIG_STACK_GROWSUP - return target_sigaltstack_used.ss_sp; -#else - return target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; -#endif - } - return sp; -} - static int rt_setup_ucontext(struct target_ucontext *uc, CPUNios2State *en= v) { unsigned long *gregs =3D uc->tuc_mcontext.gregs; @@ -158,11 +146,8 @@ static void *get_sigframe(struct target_sigaction *ka,= CPUNios2State *env, { unsigned long usp; =20 - /* Default to using normal stack. */ - usp =3D env->regs[R_SP]; - /* This is the X/Open sanctioned signal stack switching. */ - usp =3D sigsp(usp, ka); + usp =3D target_sigsp(get_sp_from_cpustate(env), ka); =20 /* Verify, is it 32 or 64 bit aligned */ return (void *)((usp - frame_size) & -8UL); @@ -185,9 +170,7 @@ void setup_rt_frame(int sig, struct target_sigaction *k= a, /* Create the ucontext. */ __put_user(0, &frame->uc.tuc_flags); __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->regs[R_SP]), &frame->uc.tuc_stack.ss_flag= s); - __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_si= ze); + target_save_altstack(&frame->uc.tuc_stack, env); err |=3D rt_setup_ucontext(&frame->uc, env); for (i =3D 0; i < TARGET_NSIG_WORDS; i++) { __put_user((abi_ulong)set->sig[i], diff --git a/linux-user/openrisc/signal.c b/linux-user/openrisc/signal.c index 0276808b59..ecf2897ccd 100644 --- a/linux-user/openrisc/signal.c +++ b/linux-user/openrisc/signal.c @@ -124,14 +124,11 @@ static inline abi_ulong get_sigframe(struct target_si= gaction *ka, CPUOpenRISCState *regs, size_t frame_size) { - unsigned long sp =3D cpu_get_gpr(regs, 1); + unsigned long sp =3D get_sp_from_cpustate(regs); int onsigstack =3D on_sig_stack(sp); =20 /* redzone */ - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) !=3D 0 && !onsigstack) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } + sp =3D target_sigsp(sp, ka); =20 sp =3D align_sigframe(sp - frame_size); =20 @@ -175,12 +172,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, /*err |=3D __clear_user(&frame->uc, offsetof(ucontext_t, uc_mcontext))= ;*/ __put_user(0, &frame->uc.tuc_flags); __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(cpu_get_gpr(env, 1)), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); + target_save_altstack(&frame->uc.tuc_stack, env); setup_sigcontext(&frame->sc, env, set->sig[0]); =20 /*err |=3D copy_to_user(frame->uc.tuc_sigmask, set, sizeof(*set));*/ diff --git a/linux-user/ppc/signal.c b/linux-user/ppc/signal.c index 15148d54a9..cacc9afb5a 100644 --- a/linux-user/ppc/signal.c +++ b/linux-user/ppc/signal.c @@ -217,13 +217,7 @@ static target_ulong get_sigframe(struct target_sigacti= on *ka, { target_ulong oldsp; =20 - oldsp =3D env->gpr[1]; - - if ((ka->sa_flags & TARGET_SA_ONSTACK) && - (sas_ss_flags(oldsp) =3D=3D 0)) { - oldsp =3D (target_sigaltstack_used.ss_sp - + target_sigaltstack_used.ss_size); - } + oldsp =3D target_sigsp(get_sp_from_cpustate(env), ka); =20 return (oldsp - frame_size) & ~0xFUL; } @@ -515,12 +509,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, =20 __put_user(0, &rt_sf->uc.tuc_flags); __put_user(0, &rt_sf->uc.tuc_link); - __put_user((target_ulong)target_sigaltstack_used.ss_sp, - &rt_sf->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->gpr[1]), - &rt_sf->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &rt_sf->uc.tuc_stack.ss_size); + target_save_altstack(&rt_sf->uc.tuc_stack, env); #if !defined(TARGET_PPC64) __put_user(h2g (&rt_sf->uc.tuc_mcontext), &rt_sf->uc.tuc_regs); diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c index 718f3a5679..ef599e319a 100644 --- a/linux-user/riscv/signal.c +++ b/linux-user/riscv/signal.c @@ -54,24 +54,20 @@ struct target_rt_sigframe { static abi_ulong get_sigframe(struct target_sigaction *ka, CPURISCVState *regs, size_t framesize) { - abi_ulong sp =3D regs->gpr[xSP]; - int onsigstack =3D on_sig_stack(sp); - - /* redzone */ - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) !=3D 0 && !onsigstack) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } - - sp -=3D framesize; - sp &=3D ~3UL; /* align sp on 4-byte boundary */ + abi_ulong sp =3D get_sp_from_cpustate(regs); =20 /* If we are on the alternate signal stack and would overflow it, don'= t. Return an always-bogus address instead so we will die with SIGSEGV.= */ - if (onsigstack && !likely(on_sig_stack(sp))) { + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) { return -1L; } =20 + /* This is the X/Open sanctioned signal stack switching. */ + sp =3D target_sigsp(sp, ka) - framesize; + + /* XXX: kernel aligns with 0xf ? */ + sp &=3D ~3UL; /* align sp on 4-byte boundary */ + return sp; } =20 @@ -95,16 +91,10 @@ static void setup_sigcontext(struct target_sigcontext *= sc, CPURISCVState *env) static void setup_ucontext(struct target_ucontext *uc, CPURISCVState *env, target_sigset_t *set) { - abi_ulong ss_sp =3D (target_ulong)target_sigaltstack_used.ss_sp; - abi_ulong ss_flags =3D sas_ss_flags(env->gpr[xSP]); - abi_ulong ss_size =3D target_sigaltstack_used.ss_size; - __put_user(0, &(uc->uc_flags)); __put_user(0, &(uc->uc_link)); =20 - __put_user(ss_sp, &(uc->uc_stack.ss_sp)); - __put_user(ss_flags, &(uc->uc_stack.ss_flags)); - __put_user(ss_size, &(uc->uc_stack.ss_size)); + target_save_altstack(&uc->uc_stack, env); =20 int i; for (i =3D 0; i < TARGET_NSIG_WORDS; i++) { diff --git a/linux-user/s390x/signal.c b/linux-user/s390x/signal.c index a204a85e4a..e35cbe6870 100644 --- a/linux-user/s390x/signal.c +++ b/linux-user/s390x/signal.c @@ -86,14 +86,11 @@ get_sigframe(struct target_sigaction *ka, CPUS390XState= *env, size_t frame_size) abi_ulong sp; =20 /* Default to using normal stack */ - sp =3D env->regs[15]; + sp =3D get_sp_from_cpustate(env); =20 /* This is the X/Open sanctioned signal stack switching. */ if (ka->sa_flags & TARGET_SA_ONSTACK) { - if (!sas_ss_flags(sp)) { - sp =3D target_sigaltstack_used.ss_sp + - target_sigaltstack_used.ss_size; - } + sp =3D target_sigsp(sp, ka); } =20 /* This is the legacy signal stack switching. */ @@ -205,10 +202,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, /* Create the ucontext. */ __put_user(0, &frame->uc.tuc_flags); __put_user((abi_ulong)0, (abi_ulong *)&frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_si= ze); + target_save_altstack(&frame->uc.tuc_stack, env); save_sigregs(env, &frame->uc.tuc_mcontext); for (i =3D 0; i < TARGET_NSIG_WORDS; i++) { __put_user((abi_ulong)set->sig[i], diff --git a/linux-user/sh4/signal.c b/linux-user/sh4/signal.c index 5ce182aff7..2a5378e16e 100644 --- a/linux-user/sh4/signal.c +++ b/linux-user/sh4/signal.c @@ -78,9 +78,7 @@ struct target_rt_sigframe static abi_ulong get_sigframe(struct target_sigaction *ka, unsigned long sp, size_t frame_size) { - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) =3D=3D 0))= { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } + sp =3D target_sigsp(sp, ka); =20 return (sp - frame_size) & -8ul; } @@ -238,12 +236,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, /* Create the ucontext. */ __put_user(0, &frame->uc.tuc_flags); __put_user(0, (unsigned long *)&frame->uc.tuc_link); - __put_user((unsigned long)target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(regs->gregs[15]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); + target_save_altstack(&frame->uc.tuc_stack, regs); setup_sigcontext(&frame->uc.tuc_mcontext, regs, set->sig[0]); for(i =3D 0; i < TARGET_NSIG_WORDS; i++) { diff --git a/linux-user/signal-common.h b/linux-user/signal-common.h index fbb8d4365c..51030a9306 100644 --- a/linux-user/signal-common.h +++ b/linux-user/signal-common.h @@ -21,17 +21,10 @@ #define SIGNAL_COMMON_H extern struct target_sigaltstack target_sigaltstack_used; =20 -static inline int on_sig_stack(unsigned long sp) -{ - return (sp - target_sigaltstack_used.ss_sp - < target_sigaltstack_used.ss_size); -} - -static inline int sas_ss_flags(unsigned long sp) -{ - return (target_sigaltstack_used.ss_size =3D=3D 0 ? SS_DISABLE - : on_sig_stack(sp) ? SS_ONSTACK : 0); -} +int on_sig_stack(unsigned long sp); +int sas_ss_flags(unsigned long sp); +abi_ulong target_sigsp(abi_ulong sp, struct target_sigaction *ka); +void target_save_altstack(target_stack_t *uss, CPUArchState *env); =20 static inline void target_sigemptyset(target_sigset_t *set) { diff --git a/linux-user/signal.c b/linux-user/signal.c index a3022c2f04..01de433e3a 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -249,6 +249,38 @@ void set_sigmask(const sigset_t *set) } #endif =20 +/* sigaltstack management */ + +int on_sig_stack(unsigned long sp) +{ + return (sp - target_sigaltstack_used.ss_sp + < target_sigaltstack_used.ss_size); +} + +int sas_ss_flags(unsigned long sp) +{ + return (target_sigaltstack_used.ss_size =3D=3D 0 ? SS_DISABLE + : on_sig_stack(sp) ? SS_ONSTACK : 0); +} + +abi_ulong target_sigsp(abi_ulong sp, struct target_sigaction *ka) +{ + /* + * This is the X/Open sanctioned signal stack switching. + */ + if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) { + return target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; + } + return sp; +} + +void target_save_altstack(target_stack_t *uss, CPUArchState *env) +{ + __put_user(target_sigaltstack_used.ss_sp, &uss->ss_sp); + __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &uss->ss_flags); + __put_user(target_sigaltstack_used.ss_size, &uss->ss_size); +} + /* siginfo conversion */ =20 static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo, diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c index c823e61cee..45e922f328 100644 --- a/linux-user/sparc/signal.c +++ b/linux-user/sparc/signal.c @@ -123,18 +123,28 @@ static inline abi_ulong get_sigframe(struct target_si= gaction *sa, CPUSPARCState *env, unsigned long framesize) { - abi_ulong sp; + abi_ulong sp =3D get_sp_from_cpustate(env); =20 - sp =3D env->regwptr[UREG_FP]; + /* + * If we are on the alternate signal stack and would overflow it, don'= t. + * Return an always-bogus address instead so we will die with SIGSEGV. + */ + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) { + return -1; + } =20 /* This is the X/Open sanctioned signal stack switching. */ - if (sa->sa_flags & TARGET_SA_ONSTACK) { - if (!on_sig_stack(sp) - && !((target_sigaltstack_used.ss_sp + target_sigaltstack_u= sed.ss_size) & 7)) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used= .ss_size; - } - } - return sp - framesize; + sp =3D target_sigsp(sp, sa) - framesize; + + /* Always align the stack frame. This handles two cases. First, + * sigaltstack need not be mindful of platform specific stack + * alignment. Second, if we took this signal because the stack + * is not aligned properly, we'd like to take the signal cleanly + * and report that. + */ + sp &=3D ~15UL; + + return sp; } =20 static int diff --git a/linux-user/tilegx/signal.c b/linux-user/tilegx/signal.c index 8f54f54f95..d0ed3de569 100644 --- a/linux-user/tilegx/signal.c +++ b/linux-user/tilegx/signal.c @@ -86,17 +86,13 @@ static void restore_sigcontext(CPUTLGState *env, struct= target_sigcontext *sc) static abi_ulong get_sigframe(struct target_sigaction *ka, CPUArchState *e= nv, size_t frame_size) { - unsigned long sp =3D env->regs[TILEGX_R_SP]; + unsigned long sp =3D get_sp_from_cpustate(env); =20 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size))) { return -1UL; } =20 - if ((ka->sa_flags & SA_ONSTACK) && !sas_ss_flags(sp)) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } - - sp -=3D frame_size; + sp =3D target_sigsp(sp, ka) - frame_size; sp &=3D -16UL; return sp; } @@ -127,10 +123,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, /* Create the ucontext. */ __put_user(0, &frame->uc.tuc_flags); __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->regs[TILEGX_R_SP]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_si= ze); + target_save_altstack(&frame->uc.tuc_stack, env); setup_sigcontext(&frame->uc.tuc_mcontext, env, info->si_signo); =20 if (ka->sa_flags & TARGET_SA_RESTORER) { diff --git a/linux-user/xtensa/signal.c b/linux-user/xtensa/signal.c index 1e98910c1b..3e483efc61 100644 --- a/linux-user/xtensa/signal.c +++ b/linux-user/xtensa/signal.c @@ -55,12 +55,10 @@ static abi_ulong get_sigframe(struct target_sigaction *= sa, CPUXtensaState *env, unsigned long framesize) { - abi_ulong sp =3D env->regs[1]; + abi_ulong sp; + + sp =3D target_sigsp(get_sp_from_cpustate(env), sa); =20 - /* This is the X/Open sanctioned signal stack switching. */ - if ((sa->sa_flags & TARGET_SA_ONSTACK) !=3D 0 && !sas_ss_flags(sp)) { - sp =3D target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_= size; - } return (sp - framesize) & -16; } =20 @@ -152,12 +150,7 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, =20 __put_user(0, &frame->uc.tuc_flags); __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->regs[1]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); + target_save_altstack(&frame->uc.tuc_stack, env); if (!setup_sigcontext(frame, env)) { unlock_user_struct(frame, frame_addr, 0); goto give_sigsegv; --=20 2.14.3 From nobody Wed Oct 29 09:10:29 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525383875381604.3143701886828; Thu, 3 May 2018 14:44:35 -0700 (PDT) Received: from localhost ([::1]:59222 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEM1i-00008N-Li for importer@patchew.org; Thu, 03 May 2018 17:44:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54909) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fELws-0004lL-SA for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fELwo-0005DZ-Jy for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:34 -0400 Received: from mout.kundenserver.de ([217.72.192.74]:58933) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fELwo-0005Au-1J for qemu-devel@nongnu.org; Thu, 03 May 2018 17:39:30 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MVd4p-1eqZ2q3Sk3-00Z1LV; Thu, 03 May 2018 23:39:16 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Thu, 3 May 2018 23:39:03 +0200 Message-Id: <20180503213903.30335-7-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:vPvLcTToK3H9VyZG/KwqkN3HVNgCYWRfXmTainEI2ON9VO4Vrpo pfKd/MZVziUahif0xXilf00+FYBXiaXu6E4ngcisAHeRhC6MDDgd0uTRhsX80d7dzwul4P5 suRY6W/Fnvgo8woiWcVFeQ3rI781qg3h3R/DkpT8E8BIKRCf7uZACnBLiMm26z9dkZbUaS1 cbFaDPuNJ5xCju5XrVimw== X-UI-Out-Filterresults: notjunk:1;V01:K0:JCOPgl9CHHg=:uh35kSYkqV0yxxRnMWxgAh /mm+gDGMDzjYJ4sTTDOU+JPQxaXsK2lEVljI1LO8aWandIp6NqUM40GUKHbSrsl99da0A9z9G eGyU9RZDxHxmiME21SjUKenZm1TUu1sdWW29CuCGsMwF8gvm6cIzFF8OHN4KSZd5WMZEj9P+H 1AHqRxtd9WFFw/B4yckLW6nLJfrxu+TZzR8pZGOZ0rsCT/KFI4BNzbEhfZzXaIUUzZgHjiyYN j5QG6QVljQKSxe2/NNjtZusb4U9xa73fB5TEXLKBGFMk7oF//TRr852sqhRP2Lvm5U+c3O+NG AykJKOM0WZ9xHQ6E2hKQepZwpVxBaEcxcEjLZSY6YHQLp7pC3Lq5B8PyYZK6Xf9k7VllVs8cw pNF9BcR+DOJvmQhab/Avr33cp0uk0QUuvsq0dCRcZzmI7zANJKW7JxXc6UqEC5vIGViFBhV4x eGS78hGG9sF6JrLaE3vGWFaqWu01M4ZZCDqj0KSOmY3L57iDo6z0CkERtItli6ucHLIyPmpvd MJkD/3vEjmyUsFEa0ARizfLgPG986+qTb8KTlLFl0l1JlxjWw/89VZyu3MAHoGxQ6KkCwQc1K FbdSMFY1DPNn8ZRrWMDecZjHVRunJp2QdchGlQzy3Po96pv4lPXplyQbwQiDPuYZQLpFlX0ls 1TRV/qdJGXUegyuxAzmFbxbd1iwhnS78AU02yVd5oQqmEWvFYNTvj0R7J6YCsSHgHsTI= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.74 Subject: [Qemu-devel] [PULL 6/6] linux-user: remove useless padding in flock64 structure 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: Riku Voipio , Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Since commit 8efb2ed5ec ("linux-user: Correct signedness of target_flock l_start and l_len fields"), flock64 structure uses abi_llong for l_start and l_len in place of "unsigned long long" this should force them to be aligned accordingly to the target rules. So we can remove the padding field and the QEMU_PACKED attribute. I have compared the result of the following program before and after the change: cat -> flock64_dump <l_type p/d &((struct target_flock64 *)0)->l_whence p/d &((struct target_flock64 *)0)->l_start p/d &((struct target_flock64 *)0)->l_len p/d &((struct target_flock64 *)0)->l_pid quit EOF for file in build/all/*-linux-user/qemu-* ; do echo $file gdb -batch -nx -x flock64_dump $file 2> /dev/null done The sizeof() changes because we remove the QEMU_PACKED. The new size is 32 (except for i386 and m68k) and this is the real size of "struct flock64" on the target architecture. The following architectures differ: aarch64_be, aarch64, alpha, armeb, arm, cris, hppa, nios2, or1k, riscv32, riscv64, s390x. For a subset of these architectures, I have checked with the following program the new structure is the correct one: #include #define __USE_LARGEFILE64 #include int main(void) { printf("struct flock64 %d\n", sizeof(struct flock64)); printf("l_type %d\n", &((struct flock64 *)0)->l_type); printf("l_whence %d\n", &((struct flock64 *)0)->l_whence); printf("l_start %d\n", &((struct flock64 *)0)->l_start); printf("l_len %d\n", &((struct flock64 *)0)->l_len); printf("l_pid %d\n", &((struct flock64 *)0)->l_pid); } [I have checked aarch64, alpha, hppa, s390x] For ARM, the target_flock64 becomes the EABI definition, so we need to define the OABI one in place of the EABI one and use it when it is needed. I have also fixed the alignment value for sh4 (to align llong on 4 bytes) (see c2e3dee6e0 "linux-user: Define target alignment size") [We should check alignment properties for cris, nios2 and or1k] Signed-off-by: Laurent Vivier Reviewed-by: Richard Henderson Message-Id: <20180502215730.28162-1-laurent@vivier.eu> --- include/exec/user/abitypes.h | 2 +- linux-user/arm/target_structs.h | 7 +++++++ linux-user/syscall.c | 14 +++++++------- linux-user/syscall_defs.h | 25 ++++--------------------- 4 files changed, 19 insertions(+), 29 deletions(-) diff --git a/include/exec/user/abitypes.h b/include/exec/user/abitypes.h index ba188608c2..743b8bb9ea 100644 --- a/include/exec/user/abitypes.h +++ b/include/exec/user/abitypes.h @@ -15,7 +15,7 @@ #define ABI_LLONG_ALIGNMENT 2 #endif =20 -#if defined(TARGET_I386) && !defined(TARGET_X86_64) +#if (defined(TARGET_I386) && !defined(TARGET_X86_64)) || defined(TARGET_SH= 4) #define ABI_LLONG_ALIGNMENT 4 #endif =20 diff --git a/linux-user/arm/target_structs.h b/linux-user/arm/target_struct= s.h index 0bf034cc25..9a3dbce03d 100644 --- a/linux-user/arm/target_structs.h +++ b/linux-user/arm/target_structs.h @@ -49,4 +49,11 @@ struct target_shmid_ds { abi_ulong __unused5; }; =20 +struct target_oabi_flock64 { + abi_short l_type; + abi_short l_whence; + abi_llong l_start; + abi_llong l_len; + abi_int l_pid; +} QEMU_PACKED; #endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 404be44ad5..e4825747f9 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6600,10 +6600,10 @@ typedef abi_long from_flock64_fn(struct flock64 *fl= , abi_ulong target_addr); typedef abi_long to_flock64_fn(abi_ulong target_addr, const struct flock64= *fl); =20 #if defined(TARGET_ARM) && TARGET_ABI_BITS =3D=3D 32 -static inline abi_long copy_from_user_eabi_flock64(struct flock64 *fl, +static inline abi_long copy_from_user_oabi_flock64(struct flock64 *fl, abi_ulong target_flock_= addr) { - struct target_eabi_flock64 *target_fl; + struct target_oabi_flock64 *target_fl; short l_type; =20 if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) { @@ -6620,10 +6620,10 @@ static inline abi_long copy_from_user_eabi_flock64(= struct flock64 *fl, return 0; } =20 -static inline abi_long copy_to_user_eabi_flock64(abi_ulong target_flock_ad= dr, +static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_ad= dr, const struct flock64 *fl) { - struct target_eabi_flock64 *target_fl; + struct target_oabi_flock64 *target_fl; short l_type; =20 if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) { @@ -11629,9 +11629,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_lon= g arg1, to_flock64_fn *copyto =3D copy_to_user_flock64; =20 #ifdef TARGET_ARM - if (((CPUARMState *)cpu_env)->eabi) { - copyfrom =3D copy_from_user_eabi_flock64; - copyto =3D copy_to_user_eabi_flock64; + if (!((CPUARMState *)cpu_env)->eabi) { + copyfrom =3D copy_from_user_oabi_flock64; + copyto =3D copy_to_user_oabi_flock64; } #endif =20 diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 23f5bccf0e..361bb83a29 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -2649,29 +2649,12 @@ struct target_flock { }; =20 struct target_flock64 { - short l_type; - short l_whence; -#if defined(TARGET_PPC) || defined(TARGET_X86_64) || defined(TARGET_MIPS) \ - || defined(TARGET_SPARC) || defined(TARGET_HPPA) \ - || defined(TARGET_MICROBLAZE) || defined(TARGET_TILEGX) \ - || defined(TARGET_XTENSA) - int __pad; -#endif - abi_llong l_start; - abi_llong l_len; - int l_pid; -} QEMU_PACKED; - -#ifdef TARGET_ARM -struct target_eabi_flock64 { - short l_type; - short l_whence; - int __pad; + abi_short l_type; + abi_short l_whence; abi_llong l_start; abi_llong l_len; - int l_pid; -} QEMU_PACKED; -#endif + abi_int l_pid; +}; =20 struct target_f_owner_ex { int type; /* Owner type of ID. */ --=20 2.14.3