From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426237; cv=none; d=zohomail.com; s=zohoarc; b=Q0tjp5G1RcQul6THVy6tMAyzLMPObvZ4otU94DYezfwgku18TIDgaW+a0lIHgFO5k2lCP9f0mGnykmk4UEQp2uaqovz9+/PQErKCpc/LfSWhStJLWt/xDafIAR4dwvv7DuQ5lWsANDfEEhDIv9njjD4S727Mqf2zv47L66Cq9ao= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426237; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=m/S7kO9TVAY5h9AXp3Rhk6dYJIKvvZfYNmVBr4WCkpo=; b=BXtij235MZIRiN6csoHLycs/pZiP5t8/fvT3N2mjHxIY1c4gEZZEDXtu6ZrIM3ZewZl6m9FNyco9YTHjiDxu4FxQeoyKomMnPheY38OWtK67j1FtSzC08XJS1ipwVanIR71dtDgvPl20vXvG/PYPJoZoIgSnTbkoq0FaNzVIJeg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426237070462.62090949171056; Mon, 7 Aug 2023 09:37:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EG-00072f-OX; Mon, 07 Aug 2023 12:37:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EF-000700-CR for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:11 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3ED-0002fp-2f for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:11 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-1bc6bfc4b58so7164165ad.1 for ; Mon, 07 Aug 2023 09:37:08 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426227; x=1692031027; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=m/S7kO9TVAY5h9AXp3Rhk6dYJIKvvZfYNmVBr4WCkpo=; b=aVq26DmAbXKGwBYvPnyi0T7cZiAIjbQVjYeTTHXWnvAnmgh6sAF/FvsCWTagbt9+2+ D2zJbke/wnihNY9N5H9vKAwGzw9P9knNuPyH5MUIVhx1SFmAlGQxrPvrmLHmsgxUpyik bS+q0D5n15av9ZARyD9kZy/86LaPXI+iAgSVOXsOgfR5CTv93GBIh/BS/ZYNgiMhl5Lf FiFwo0dlpHQloOaUIWLAFZ6yfC0ZLIx+ZB14744Ickpt/S8ngBYVU4qImawTdACEzzYK yUBAUW/21m9dtaiVxpS/ohHJpY6C0fAkR9Iu0sPGndclg5DwSpdHLDflEDxTbwW4sahD qd3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426227; x=1692031027; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=m/S7kO9TVAY5h9AXp3Rhk6dYJIKvvZfYNmVBr4WCkpo=; b=L1yMCHKEvyitoByv/6NdDZDnfvDPTOe9XW1qw8m/qqEECgciUxYw16OvMRrqsQm/gv vG2w01iGu9gsYpIqGvZNz8odwUkHMCwi0km/TZOsNSGU7TZQf4cStPkv1bl+agzHhiPS PtyKGiiijOvOGMA+BMLqEJr4lvphyDiXuQDQ23JKo3JvOkRiTY6g7lKvp+xZuH4HUo2c HFxsmysRC5+iajxfcc8MPBsCPQIX8OSeYKoUAUMuN+510nH9bUPAeGVqDBCU3V0W59ef SAxlqpBilQfxekm7ZfzeGqtWSz245l21WU2oFWwVpnN6kb/nrsSs50U5zbgGOtiX8iUZ 54dQ== X-Gm-Message-State: AOJu0YyWIjeFyHTwAm18RwjGZocWYvbL80kwvSJBapQpcLXuwo0vvCI9 DCd8XUCh9pmsjhdzV/F8gqsAYi8IEDxKP/0Fz28= X-Google-Smtp-Source: AGHT+IGdBwlNBvCFW3oGmGTnB/LjwHKiAwyey0UWDqpV502gU5mZoMAHZMzMA8n+KcOlcNYFNG//HQ== X-Received: by 2002:a17:903:2351:b0:1bb:d280:5e0b with SMTP id c17-20020a170903235100b001bbd2805e0bmr9039209plh.18.1691426227604; Mon, 07 Aug 2023 09:37:07 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de, Akihiko Odaki Subject: [PATCH for-8.1 v10 01/14] linux-user: Adjust task_unmapped_base for reserved_va Date: Mon, 7 Aug 2023 09:36:52 -0700 Message-Id: <20230807163705.9848-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426238227100001 Content-Type: text/plain; charset="utf-8" Ensure that the chosen values for mmap_next_start and task_unmapped_base are within the guest address space. Tested-by: Helge Deller Reviewed-by: Akihiko Odaki Signed-off-by: Richard Henderson Tested-by: Alex Benn=C3=A9e --- linux-user/user-mmap.h | 18 +++++++++++++++++- linux-user/main.c | 28 ++++++++++++++++++++++++++++ linux-user/mmap.c | 18 +++--------------- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/linux-user/user-mmap.h b/linux-user/user-mmap.h index 7265c2c116..fd456e024e 100644 --- a/linux-user/user-mmap.h +++ b/linux-user/user-mmap.h @@ -18,6 +18,23 @@ #ifndef LINUX_USER_USER_MMAP_H #define LINUX_USER_USER_MMAP_H =20 +#if HOST_LONG_BITS =3D=3D 64 && TARGET_ABI_BITS =3D=3D 64 +#ifdef TARGET_AARCH64 +# define TASK_UNMAPPED_BASE 0x5500000000 +#else +# define TASK_UNMAPPED_BASE (1ul << 38) +#endif +#else +#ifdef TARGET_HPPA +# define TASK_UNMAPPED_BASE 0xfa000000 +#else +# define TASK_UNMAPPED_BASE 0x40000000 +#endif +#endif + +extern abi_ulong task_unmapped_base; +extern abi_ulong mmap_next_start; + int target_mprotect(abi_ulong start, abi_ulong len, int prot); abi_long target_mmap(abi_ulong start, abi_ulong len, int prot, int flags, int fd, off_t offset); @@ -26,7 +43,6 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_= size, abi_ulong new_size, unsigned long flags, abi_ulong new_addr); abi_long target_madvise(abi_ulong start, abi_ulong len_in, int advice); -extern abi_ulong mmap_next_start; abi_ulong mmap_find_vma(abi_ulong, abi_ulong, abi_ulong); void mmap_fork_start(void); void mmap_fork_end(int child); diff --git a/linux-user/main.c b/linux-user/main.c index 556956c363..be621dc792 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -821,6 +821,34 @@ int main(int argc, char **argv, char **envp) reserved_va =3D max_reserved_va; } =20 + /* + * Temporarily disable + * "comparison is always false due to limited range of data type" + * due to comparison between (possible) uint64_t and uintptr_t. + */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" + + /* + * Select an initial value for task_unmapped_base that is in range. + */ + if (reserved_va) { + if (TASK_UNMAPPED_BASE < reserved_va) { + task_unmapped_base =3D TASK_UNMAPPED_BASE; + } else { + /* The most common default formula is TASK_SIZE / 3. */ + task_unmapped_base =3D TARGET_PAGE_ALIGN(reserved_va / 3); + } + } else if (TASK_UNMAPPED_BASE < UINTPTR_MAX) { + task_unmapped_base =3D TASK_UNMAPPED_BASE; + } else { + /* 32-bit host: pick something medium size. */ + task_unmapped_base =3D 0x10000000; + } + mmap_next_start =3D task_unmapped_base; + +#pragma GCC diagnostic pop + { Error *err =3D NULL; if (seed_optarg !=3D NULL) { diff --git a/linux-user/mmap.c b/linux-user/mmap.c index eb04fab8ab..84436d45c8 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -299,20 +299,8 @@ static bool mmap_frag(abi_ulong real_start, abi_ulong = start, abi_ulong last, return true; } =20 -#if HOST_LONG_BITS =3D=3D 64 && TARGET_ABI_BITS =3D=3D 64 -#ifdef TARGET_AARCH64 -# define TASK_UNMAPPED_BASE 0x5500000000 -#else -# define TASK_UNMAPPED_BASE (1ul << 38) -#endif -#else -#ifdef TARGET_HPPA -# define TASK_UNMAPPED_BASE 0xfa000000 -#else -# define TASK_UNMAPPED_BASE 0x40000000 -#endif -#endif -abi_ulong mmap_next_start =3D TASK_UNMAPPED_BASE; +abi_ulong task_unmapped_base; +abi_ulong mmap_next_start; =20 /* * Subroutine of mmap_find_vma, used when we have pre-allocated @@ -391,7 +379,7 @@ abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size= , abi_ulong align) =20 if ((addr & (align - 1)) =3D=3D 0) { /* Success. */ - if (start =3D=3D mmap_next_start && addr >=3D TASK_UNMAPPE= D_BASE) { + if (start =3D=3D mmap_next_start && addr >=3D task_unmappe= d_base) { mmap_next_start =3D addr + size; } return addr; --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426264; cv=none; d=zohomail.com; s=zohoarc; b=HjlcydlH9FkGC8u8xR/2QLieU4jzhc2QR5n+FTlgwWsx9rjW0+IOPwuvTjuAETmc2Qb6CXeO+r6MztTSpUdvRYUb1no5F+yioRasi3hzVO0ZiFrlS3WcS1fQ+Bty1A59/z7u0f146jnVmN6eqNzYQSyBrTLKE6Rip2Y6EZ66M3M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426264; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=nsfMjTlh4URCmzpsUVnlBQkKHMyACEHtsPPiByh/vaY=; b=D+udyheFRLL1UGqNzgvVS81VvIHTys5ZgrHbXL4JsEJIJBemnjowhxhvJWO42qJlogxaBEeI59oHIBckNquRbCk/73B/dvPfgOGz9x26RXGjzcbr1MioPT2XZSGjprMNV3rhlqT/vQnr4NWbAhJsRvFwKcOrBiJZsObqMvadd5Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426264989117.77276299321898; Mon, 7 Aug 2023 09:37:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3Ec-0007dS-90; Mon, 07 Aug 2023 12:37:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EH-00072u-DP for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:14 -0400 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EE-0002g6-4W for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:13 -0400 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-1bb2468257fso28817105ad.0 for ; Mon, 07 Aug 2023 09:37:09 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426229; x=1692031029; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nsfMjTlh4URCmzpsUVnlBQkKHMyACEHtsPPiByh/vaY=; b=qgN7hEIC8lY0a/po+yzWfVddfX/vX6eiR0lTbDEstvM95aNqd/FISBI0m7mGBqviEz pb9DeJjJxaer+FCYezsL/o+9ncJzlWZvHj7ZP/f25SkXBAKu7HYGyGlfTMzJzErKBDma Eq5mthjvu2W74vZfQlqgFAu1UrdnLkUj7r8ibKXORdWiire7kiTxe8IhjGADG1eU5p6e cFAqfAzY9AiUoUdcWtL1DCqZjh0DYGbKlK1Me6yDJuRwnA9n0jYrVai8rtK3yJLjZS8W 4Dwc3hAIAbnjTiZCDGSpHLVH0FRv39zcIans7psn5+Hyn70omnBpIrljgDm39T5sv2Th VhEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426229; x=1692031029; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nsfMjTlh4URCmzpsUVnlBQkKHMyACEHtsPPiByh/vaY=; b=Q51+2hb7+yYjiO2MJdzNLvn0T7jt/vxeP0EInVlsh3K86VN+XvhhH9AHxPL2dLPYud aTn8kLTHMoOBsgA/DKOaf+yMIuvSn60HnxWJ86iew6so5pGg+ZgcgTvC2cUWWVXLEEen ZufRSoWlrxLWcX3oTKeyVaQFcrewxA+R+mQ0i55M1Y70Q4N37kaiai2r7kWCTCbBESOa 3jco3dYVCUtLDZDNkn4JlwfPVD8kKyOY9MBHaRWZ2o7CoNZPrNzoAMiT/dp5PRVQmA5H eLgsT7nwEeDOVnHZlbMTkT12+qVja573BqvYlOYsrrc2oco9U31MBmdjuPVF8mEc2jxA xT0g== X-Gm-Message-State: AOJu0YytdKLXKvWtFh9lwX4ojJM98xA1StKb6TuQuhYfNyyZ/bee+5qM F4LFd6c02QtZDPHmuaRkaw/OnxzNR/U4dmRMWAQ= X-Google-Smtp-Source: AGHT+IFU8qyK0cd1vz8+JF9JhZvuNXOab3kW7tZXUK9x5Zq9s7PneR1uMG0L90HFlVQ7LXuGeNxPYQ== X-Received: by 2002:a17:902:db05:b0:1bc:7833:f5 with SMTP id m5-20020a170902db0500b001bc783300f5mr1638724plx.62.1691426228725; Mon, 07 Aug 2023 09:37:08 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de, Akihiko Odaki Subject: [PATCH for-8.1 v10 02/14] linux-user: Define TASK_UNMAPPED_BASE in $guest/target_mman.h Date: Mon, 7 Aug 2023 09:36:53 -0700 Message-Id: <20230807163705.9848-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::634; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x634.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426266415100001 Content-Type: text/plain; charset="utf-8" Provide default values that are as close as possible to the values used by the guest's kernel. Tested-by: Helge Deller Reviewed-by: Helge Deller Reviewed-by: Akihiko Odaki Signed-off-by: Richard Henderson Reviewed-by: Alex Benn=C3=A9e Tested-by: Alex Benn=C3=A9e --- linux-user/aarch64/target_mman.h | 10 ++++++++++ linux-user/alpha/target_mman.h | 8 ++++++++ linux-user/arm/target_mman.h | 8 ++++++++ linux-user/cris/target_mman.h | 9 +++++++++ linux-user/hexagon/target_mman.h | 10 ++++++++++ linux-user/hppa/target_mman.h | 3 +++ linux-user/i386/target_mman.h | 13 +++++++++++++ linux-user/loongarch64/target_mman.h | 8 ++++++++ linux-user/m68k/target_mman.h | 3 +++ linux-user/microblaze/target_mman.h | 8 ++++++++ linux-user/mips/target_mman.h | 7 +++++++ linux-user/nios2/target_mman.h | 7 +++++++ linux-user/openrisc/target_mman.h | 7 +++++++ linux-user/ppc/target_mman.h | 13 +++++++++++++ linux-user/riscv/target_mman.h | 7 +++++++ linux-user/s390x/target_mman.h | 10 ++++++++++ linux-user/sh4/target_mman.h | 4 ++++ linux-user/sparc/target_mman.h | 14 ++++++++++++++ linux-user/user-mmap.h | 14 -------------- linux-user/x86_64/target_mman.h | 12 ++++++++++++ linux-user/xtensa/target_mman.h | 6 ++++++ 21 files changed, 167 insertions(+), 14 deletions(-) diff --git a/linux-user/aarch64/target_mman.h b/linux-user/aarch64/target_m= man.h index f721295fe1..4d3eecfb26 100644 --- a/linux-user/aarch64/target_mman.h +++ b/linux-user/aarch64/target_mman.h @@ -4,6 +4,16 @@ #define TARGET_PROT_BTI 0x10 #define TARGET_PROT_MTE 0x20 =20 +/* + * arch/arm64/include/asm/processor.h: + * + * TASK_UNMAPPED_BASE DEFAULT_MAP_WINDOW / 4 + * DEFAULT_MAP_WINDOW DEFAULT_MAP_WINDOW_64 + * DEFAULT_MAP_WINDOW_64 UL(1) << VA_BITS_MIN + * VA_BITS_MIN 48 (unless explicitly configured smaller) + */ +#define TASK_UNMAPPED_BASE (1ull << (48 - 2)) + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/alpha/target_mman.h b/linux-user/alpha/target_mman.h index 6bb03e7336..c90b493711 100644 --- a/linux-user/alpha/target_mman.h +++ b/linux-user/alpha/target_mman.h @@ -20,6 +20,14 @@ #define TARGET_MS_SYNC 2 #define TARGET_MS_INVALIDATE 4 =20 +/* + * arch/alpha/include/asm/processor.h: + * + * TASK_UNMAPPED_BASE TASK_SIZE / 2 + * TASK_SIZE 0x40000000000UL + */ +#define TASK_UNMAPPED_BASE 0x20000000000ull + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/arm/target_mman.h b/linux-user/arm/target_mman.h index e7ba6070fe..76275b2c7e 100644 --- a/linux-user/arm/target_mman.h +++ b/linux-user/arm/target_mman.h @@ -1 +1,9 @@ +/* + * arch/arm/include/asm/memory.h + * TASK_UNMAPPED_BASE ALIGN(TASK_SIZE / 3, SZ_16M) + * TASK_SIZE CONFIG_PAGE_OFFSET + * CONFIG_PAGE_OFFSET 0xC0000000 (default in Kconfig) + */ +#define TASK_UNMAPPED_BASE 0x40000000 + #include "../generic/target_mman.h" diff --git a/linux-user/cris/target_mman.h b/linux-user/cris/target_mman.h index e7ba6070fe..9df7b1eda5 100644 --- a/linux-user/cris/target_mman.h +++ b/linux-user/cris/target_mman.h @@ -1 +1,10 @@ +/* + * arch/cris/include/asm/processor.h: + * TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) + * + * arch/cris/include/arch-v32/arch/processor.h + * TASK_SIZE 0xb0000000 + */ +#define TASK_UNMAPPED_BASE TARGET_PAGE_ALIGN(0xb0000000 / 3) + #include "../generic/target_mman.h" diff --git a/linux-user/hexagon/target_mman.h b/linux-user/hexagon/target_m= man.h index e7ba6070fe..c5ae336e07 100644 --- a/linux-user/hexagon/target_mman.h +++ b/linux-user/hexagon/target_mman.h @@ -1 +1,11 @@ +/* + * arch/hexgon/include/asm/processor.h + * TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE / 3) + * + * arch/hexagon/include/asm/mem-layout.h + * TASK_SIZE PAGE_OFFSET + * PAGE_OFFSET 0xc0000000 + */ +#define TASK_UNMAPPED_BASE 0x40000000 + #include "../generic/target_mman.h" diff --git a/linux-user/hppa/target_mman.h b/linux-user/hppa/target_mman.h index 97f87d042a..6459e7dbdd 100644 --- a/linux-user/hppa/target_mman.h +++ b/linux-user/hppa/target_mman.h @@ -24,6 +24,9 @@ #define TARGET_MS_ASYNC 2 #define TARGET_MS_INVALIDATE 4 =20 +/* arch/parisc/include/asm/processor.h: DEFAULT_MAP_BASE32 */ +#define TASK_UNMAPPED_BASE 0x40000000 + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/i386/target_mman.h b/linux-user/i386/target_mman.h index e7ba6070fe..cc3382007f 100644 --- a/linux-user/i386/target_mman.h +++ b/linux-user/i386/target_mman.h @@ -1 +1,14 @@ +/* + * arch/x86/include/asm/processor.h: + * TASK_UNMAPPED_BASE __TASK_UNMAPPED_BASE(TASK_SIZE_LOW) + * __TASK_UNMAPPED_BASE(S) PAGE_ALIGN(S / 3) + * + * arch/x86/include/asm/page_32_types.h: + * TASK_SIZE_LOW TASK_SIZE + * TASK_SIZE __PAGE_OFFSET + * __PAGE_OFFSET CONFIG_PAGE_OFFSET + * CONFIG_PAGE_OFFSET 0xc0000000 (default in Kconfig) + */ +#define TASK_UNMAPPED_BASE 0x40000000 + #include "../generic/target_mman.h" diff --git a/linux-user/loongarch64/target_mman.h b/linux-user/loongarch64/= target_mman.h index e7ba6070fe..d70e44d44c 100644 --- a/linux-user/loongarch64/target_mman.h +++ b/linux-user/loongarch64/target_mman.h @@ -1 +1,9 @@ +/* + * arch/loongarch/include/asm/processor.h: + * TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE / 3) + * TASK_SIZE64 0x1UL << (... ? VA_BITS : ...) + */ +#define TASK_UNMAPPED_BASE \ + TARGET_PAGE_ALIGN((1ull << TARGET_VIRT_ADDR_SPACE_BITS) / 3) + #include "../generic/target_mman.h" diff --git a/linux-user/m68k/target_mman.h b/linux-user/m68k/target_mman.h index e7ba6070fe..d3eceb663b 100644 --- a/linux-user/m68k/target_mman.h +++ b/linux-user/m68k/target_mman.h @@ -1 +1,4 @@ +/* arch/m68k/include/asm/processor.h */ +#define TASK_UNMAPPED_BASE 0xC0000000 + #include "../generic/target_mman.h" diff --git a/linux-user/microblaze/target_mman.h b/linux-user/microblaze/ta= rget_mman.h index e7ba6070fe..ffee869db4 100644 --- a/linux-user/microblaze/target_mman.h +++ b/linux-user/microblaze/target_mman.h @@ -1 +1,9 @@ +/* + * arch/microblaze/include/asm/processor.h: + * TASK_UNMAPPED_BASE (TASK_SIZE / 8 * 3) + * TASK_SIZE CONFIG_KERNEL_START + * CONFIG_KERNEL_START 0xc0000000 (default in Kconfig) + */ +#define TASK_UNMAPPED_BASE 0x48000000 + #include "../generic/target_mman.h" diff --git a/linux-user/mips/target_mman.h b/linux-user/mips/target_mman.h index e97694aa4e..fe1eec2d0b 100644 --- a/linux-user/mips/target_mman.h +++ b/linux-user/mips/target_mman.h @@ -14,6 +14,13 @@ #define TARGET_MAP_STACK 0x40000 #define TARGET_MAP_HUGETLB 0x80000 =20 +/* + * arch/mips/include/asm/processor.h: + * TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE / 3) + */ +#define TASK_UNMAPPED_BASE \ + TARGET_PAGE_ALIGN((1ull << TARGET_VIRT_ADDR_SPACE_BITS) / 3) + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/nios2/target_mman.h b/linux-user/nios2/target_mman.h index e7ba6070fe..ce18f4f871 100644 --- a/linux-user/nios2/target_mman.h +++ b/linux-user/nios2/target_mman.h @@ -1 +1,8 @@ +/* + * arch/nios2/include/asm/processor.h: + * TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE / 3) + * TASK_SIZE 0x7FFF0000UL + */ +#define TASK_UNMAPPED_BASE TARGET_PAGE_ALIGN(0x7FFF0000 / 3) + #include "../generic/target_mman.h" diff --git a/linux-user/openrisc/target_mman.h b/linux-user/openrisc/target= _mman.h index e7ba6070fe..f1aaad809d 100644 --- a/linux-user/openrisc/target_mman.h +++ b/linux-user/openrisc/target_mman.h @@ -1 +1,8 @@ +/* + * arch/openrisc/include/asm/processor.h: + * TASK_UNMAPPED_BASE (TASK_SIZE / 8 * 3) + * TASK_SIZE (0x80000000UL) + */ +#define TASK_UNMAPPED_BASE 0x30000000 + #include "../generic/target_mman.h" diff --git a/linux-user/ppc/target_mman.h b/linux-user/ppc/target_mman.h index 67cc218f2e..04f99c6077 100644 --- a/linux-user/ppc/target_mman.h +++ b/linux-user/ppc/target_mman.h @@ -4,6 +4,19 @@ #define TARGET_MAP_NORESERVE 0x40 #define TARGET_MAP_LOCKED 0x80 =20 +/* + * arch/powerpc/include/asm/task_size_64.h + * TASK_UNMAPPED_BASE_USER32 (PAGE_ALIGN(TASK_SIZE_USER32 / 4)) + * TASK_UNMAPPED_BASE_USER64 (PAGE_ALIGN(DEFAULT_MAP_WINDOW_USER64 / 4)) + * TASK_SIZE_USER32 (0x0000000100000000UL - (1 * PAGE_SIZE)) + * DEFAULT_MAP_WINDOW_USER64 TASK_SIZE_64TB (with 4k pages) + */ +#ifdef TARGET_PPC64 +#define TASK_UNMAPPED_BASE 0x0000100000000000ull +#else +#define TASK_UNMAPPED_BASE 0x40000000 +#endif + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/riscv/target_mman.h b/linux-user/riscv/target_mman.h index e7ba6070fe..0f06dadbd4 100644 --- a/linux-user/riscv/target_mman.h +++ b/linux-user/riscv/target_mman.h @@ -1 +1,8 @@ +/* + * arch/loongarch/include/asm/processor.h: + * TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE / 3) + */ +#define TASK_UNMAPPED_BASE \ + TARGET_PAGE_ALIGN((1ull << (TARGET_VIRT_ADDR_SPACE_BITS - 1)) / 3) + #include "../generic/target_mman.h" diff --git a/linux-user/s390x/target_mman.h b/linux-user/s390x/target_mman.h index e7ba6070fe..40d149b329 100644 --- a/linux-user/s390x/target_mman.h +++ b/linux-user/s390x/target_mman.h @@ -1 +1,11 @@ +/* + * arch/s390/include/asm/processor.h: + * TASK_UNMAPPED_BASE (... : (_REGION2_SIZE >> 1)) + * + * arch/s390/include/asm/pgtable.h: + * _REGION2_SIZE (1UL << _REGION2_SHIFT) + * _REGION2_SHIFT 42 + */ +#define TASK_UNMAPPED_BASE (1ull << 41) + #include "../generic/target_mman.h" diff --git a/linux-user/sh4/target_mman.h b/linux-user/sh4/target_mman.h index e7ba6070fe..bbbc223398 100644 --- a/linux-user/sh4/target_mman.h +++ b/linux-user/sh4/target_mman.h @@ -1 +1,5 @@ +/* arch/sh/include/asm/processor_32.h */ +#define TASK_UNMAPPED_BASE \ + TARGET_PAGE_ALIGN((1u << TARGET_VIRT_ADDR_SPACE_BITS) / 3) + #include "../generic/target_mman.h" diff --git a/linux-user/sparc/target_mman.h b/linux-user/sparc/target_mman.h index 9bad99c852..692ebf9dd7 100644 --- a/linux-user/sparc/target_mman.h +++ b/linux-user/sparc/target_mman.h @@ -5,6 +5,20 @@ #define TARGET_MAP_LOCKED 0x100 #define TARGET_MAP_GROWSDOWN 0x0200 =20 +/* + * arch/sparc/include/asm/page_64.h: + * TASK_UNMAPPED_BASE (test_thread_flag(TIF_32BIT) ? \ + * _AC(0x0000000070000000,UL) : \ + * VA_EXCLUDE_END) + * But VA_EXCLUDE_END is > 0xffff800000000000UL which doesn't work + * in userland emulation. + */ +#ifdef TARGET_ABI32 +#define TASK_UNMAPPED_BASE 0x70000000 +#else +#define TASK_UNMAPPED_BASE (1ull << (TARGET_VIRT_ADDR_SPACE_BITS - 2)) +#endif + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/user-mmap.h b/linux-user/user-mmap.h index fd456e024e..bae49059e0 100644 --- a/linux-user/user-mmap.h +++ b/linux-user/user-mmap.h @@ -18,20 +18,6 @@ #ifndef LINUX_USER_USER_MMAP_H #define LINUX_USER_USER_MMAP_H =20 -#if HOST_LONG_BITS =3D=3D 64 && TARGET_ABI_BITS =3D=3D 64 -#ifdef TARGET_AARCH64 -# define TASK_UNMAPPED_BASE 0x5500000000 -#else -# define TASK_UNMAPPED_BASE (1ul << 38) -#endif -#else -#ifdef TARGET_HPPA -# define TASK_UNMAPPED_BASE 0xfa000000 -#else -# define TASK_UNMAPPED_BASE 0x40000000 -#endif -#endif - extern abi_ulong task_unmapped_base; extern abi_ulong mmap_next_start; =20 diff --git a/linux-user/x86_64/target_mman.h b/linux-user/x86_64/target_mma= n.h index e7ba6070fe..f9ff652b37 100644 --- a/linux-user/x86_64/target_mman.h +++ b/linux-user/x86_64/target_mman.h @@ -1 +1,13 @@ +/* + * arch/x86/include/asm/processor.h: + * TASK_UNMAPPED_BASE __TASK_UNMAPPED_BASE(TASK_SIZE_LOW) + * __TASK_UNMAPPED_BASE(S) PAGE_ALIGN(S / 3) + * + * arch/x86/include/asm/page_64_types.h: + * TASK_SIZE_LOW DEFAULT_MAP_WINDOW + * DEFAULT_MAP_WINDOW ((1UL << 47) - PAGE_SIZE) + */ +#define TASK_UNMAPPED_BASE \ + TARGET_PAGE_ALIGN((1ull << TARGET_VIRT_ADDR_SPACE_BITS) / 3) + #include "../generic/target_mman.h" diff --git a/linux-user/xtensa/target_mman.h b/linux-user/xtensa/target_mma= n.h index 3933771b5b..c4f671adb7 100644 --- a/linux-user/xtensa/target_mman.h +++ b/linux-user/xtensa/target_mman.h @@ -14,6 +14,12 @@ #define TARGET_MAP_STACK 0x40000 #define TARGET_MAP_HUGETLB 0x80000 =20 +/* + * arch/xtensa/include/asm/processor.h: + * TASK_UNMAPPED_BASE (TASK_SIZE / 2) + */ +#define TASK_UNMAPPED_BASE (1u << (TARGET_VIRT_ADDR_SPACE_BITS - 1)) + #include "../generic/target_mman.h" =20 #endif --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426316; cv=none; d=zohomail.com; s=zohoarc; b=Hj8LCZx1GDHJgwt+IJtlXrRa5Clcwn/jk8Sr9y6/rJR742C6HBZtOag0OXzbo0pPAwSKPdqVWbJypbj58UMd19fY6s7C5rwv1cRM0Ej7X0Yz09IDcJ1AiNQ3Tmb17Nw7Xu600mYfLAr1na9gjw5xOdkvfA/ZpkkfMkJeVdVNFkg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426316; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=YQiLPVCfyeMX/HaaqqWD824ZzDbo71gJMZBplamcMFg=; b=LMpcGxzwzfGfUzE08yjw/IhsONQoSAEwgREvznwLu5ZWaEyHEVU2qLhEWPyVO1iqyC9cPKZ9y6obyohq3VKZBhOG6oBFDO5LXOeppGSF9Nez5b03n5v4oHadON3DGFPZJQn8QX8hXJvh9ccYneP5q75Y/XDFPa9twbUdvNwwoRs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 169142631631729.455605965205677; Mon, 7 Aug 2023 09:38:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EW-0007MP-Oc; Mon, 07 Aug 2023 12:37:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EH-00072t-CB for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:14 -0400 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EF-0002gJ-4u for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:13 -0400 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-1b8b4748fe4so30495325ad.1 for ; Mon, 07 Aug 2023 09:37:10 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426229; x=1692031029; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YQiLPVCfyeMX/HaaqqWD824ZzDbo71gJMZBplamcMFg=; b=JA26p7Yve1850Z5Nu90y1TEL4FQajHlGbJYBRs432wn8oJR4BG/gUn5TtAep0T0A2r r+JcVFvLKCOryKqccL4slnUr9pcMOc7zNGoP3U7LgoLPwvBrUA44osLiYFTsYkWuEpKV gKwNPua328QhF/g9HxNT3S4qgjY9dCN/kQ5mse06g2e6ygi00s2LTvoEVg6oCtGoII6+ GPEJXi9SIO3bs4r7XIcTlwWwrlcl0qrKtbj2d4i7QvioL49rj1rjeWh3bDF1bSuaWGqn mgV1aV+2Xi3qa68Ioi2IBXsBtFVepzfqPiG/FO2pOZkYvLKHr5cpvq1WCKkmq/lVv5Ik 5V8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426229; x=1692031029; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YQiLPVCfyeMX/HaaqqWD824ZzDbo71gJMZBplamcMFg=; b=UYScA77E7oXlQZJLRLb0A10sspRghTvo4A4xgaShgQE4DoEwmQ5Y2LA0YTXOqerUmP M8DeZ5wLlc+wKEIX2l78uFGTp/dqMKU6PYJZeGa6PtDYLAdhkgPlvcFBzJ1sia+INYQx 4xt/JDhfPdd31G9DHPnU3WA/6KjECMHAntC0z0nPmhg+ZPSvSPkSI0nbEOl2Sv4bDsrO ZTLOhqpCqfh6tVX4ITJEEwqzLZAw6RnoBcVz4f+1ZT893Bzes+51+v+OziBXMbYgKPPz NSkbygDq2gXftya9yLJJbofHrvSRmBYPH4UGX8B8qQxQzetsD9aLaq1xzzugknavlcbA RC/A== X-Gm-Message-State: AOJu0Yzd6/l/aMcG6MiTVzSNAGb+nU4MyTLf5y0tzdn02jHzFMzBRtK3 r1KTU+L4KbDOwI5gJosbdTcT5uh61dgADiHZZXY= X-Google-Smtp-Source: AGHT+IFeiaz+6EyYbhv7GMJcX8m0h9jeqtbbbTghEB1rCoYy6CCRAHWZRXhzDBtCIsNNGK1Xn1CxVQ== X-Received: by 2002:a17:902:f691:b0:1b6:bced:1dc2 with SMTP id l17-20020a170902f69100b001b6bced1dc2mr9833518plg.0.1691426229581; Mon, 07 Aug 2023 09:37:09 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de Subject: [PATCH for-8.1 v10 03/14] linux-user: Define ELF_ET_DYN_BASE in $guest/target_mman.h Date: Mon, 7 Aug 2023 09:36:54 -0700 Message-Id: <20230807163705.9848-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62f; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62f.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426316974100003 Content-Type: text/plain; charset="utf-8" Copy each guest kernel's default value, then bound it against reserved_va or the host address space. Tested-by: Helge Deller Reviewed-by: Helge Deller Signed-off-by: Richard Henderson Tested-by: Alex Benn=C3=A9e --- linux-user/aarch64/target_mman.h | 3 +++ linux-user/alpha/target_mman.h | 3 +++ linux-user/arm/target_mman.h | 3 +++ linux-user/cris/target_mman.h | 3 +++ linux-user/hexagon/target_mman.h | 3 +++ linux-user/hppa/target_mman.h | 3 +++ linux-user/i386/target_mman.h | 3 +++ linux-user/loongarch64/target_mman.h | 3 +++ linux-user/m68k/target_mman.h | 2 ++ linux-user/microblaze/target_mman.h | 3 +++ linux-user/mips/target_mman.h | 3 +++ linux-user/nios2/target_mman.h | 3 +++ linux-user/openrisc/target_mman.h | 3 +++ linux-user/ppc/target_mman.h | 7 +++++++ linux-user/riscv/target_mman.h | 3 +++ linux-user/s390x/target_mman.h | 10 ++++++++++ linux-user/sh4/target_mman.h | 3 +++ linux-user/sparc/target_mman.h | 11 +++++++++++ linux-user/user-mmap.h | 1 + linux-user/x86_64/target_mman.h | 3 +++ linux-user/xtensa/target_mman.h | 4 ++++ linux-user/main.c | 15 +++++++++++++++ linux-user/mmap.c | 1 + 23 files changed, 96 insertions(+) diff --git a/linux-user/aarch64/target_mman.h b/linux-user/aarch64/target_m= man.h index 4d3eecfb26..69ec5d5739 100644 --- a/linux-user/aarch64/target_mman.h +++ b/linux-user/aarch64/target_mman.h @@ -14,6 +14,9 @@ */ #define TASK_UNMAPPED_BASE (1ull << (48 - 2)) =20 +/* arch/arm64/include/asm/elf.h */ +#define ELF_ET_DYN_BASE TARGET_PAGE_ALIGN((1ull << 48) / 3 * 2) + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/alpha/target_mman.h b/linux-user/alpha/target_mman.h index c90b493711..8edfe2b88c 100644 --- a/linux-user/alpha/target_mman.h +++ b/linux-user/alpha/target_mman.h @@ -28,6 +28,9 @@ */ #define TASK_UNMAPPED_BASE 0x20000000000ull =20 +/* arch/alpha/include/asm/elf.h */ +#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/arm/target_mman.h b/linux-user/arm/target_mman.h index 76275b2c7e..51005da869 100644 --- a/linux-user/arm/target_mman.h +++ b/linux-user/arm/target_mman.h @@ -6,4 +6,7 @@ */ #define TASK_UNMAPPED_BASE 0x40000000 =20 +/* arch/arm/include/asm/elf.h */ +#define ELF_ET_DYN_BASE 0x00400000 + #include "../generic/target_mman.h" diff --git a/linux-user/cris/target_mman.h b/linux-user/cris/target_mman.h index 9df7b1eda5..9ace8ac292 100644 --- a/linux-user/cris/target_mman.h +++ b/linux-user/cris/target_mman.h @@ -7,4 +7,7 @@ */ #define TASK_UNMAPPED_BASE TARGET_PAGE_ALIGN(0xb0000000 / 3) =20 +/* arch/cris/include/uapi/asm/elf.h */ +#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE * 2) + #include "../generic/target_mman.h" diff --git a/linux-user/hexagon/target_mman.h b/linux-user/hexagon/target_m= man.h index c5ae336e07..e6b5e2ca36 100644 --- a/linux-user/hexagon/target_mman.h +++ b/linux-user/hexagon/target_mman.h @@ -8,4 +8,7 @@ */ #define TASK_UNMAPPED_BASE 0x40000000 =20 +/* arch/hexagon/include/asm/elf.h */ +#define ELF_ET_DYN_BASE 0x08000000 + #include "../generic/target_mman.h" diff --git a/linux-user/hppa/target_mman.h b/linux-user/hppa/target_mman.h index 6459e7dbdd..ccda46e842 100644 --- a/linux-user/hppa/target_mman.h +++ b/linux-user/hppa/target_mman.h @@ -27,6 +27,9 @@ /* arch/parisc/include/asm/processor.h: DEFAULT_MAP_BASE32 */ #define TASK_UNMAPPED_BASE 0x40000000 =20 +/* arch/parisc/include/asm/elf.h */ +#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x01000000) + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/i386/target_mman.h b/linux-user/i386/target_mman.h index cc3382007f..e3b8e1eaa6 100644 --- a/linux-user/i386/target_mman.h +++ b/linux-user/i386/target_mman.h @@ -11,4 +11,7 @@ */ #define TASK_UNMAPPED_BASE 0x40000000 =20 +/* arch/x86/include/asm/elf.h */ +#define ELF_ET_DYN_BASE 0x00400000 + #include "../generic/target_mman.h" diff --git a/linux-user/loongarch64/target_mman.h b/linux-user/loongarch64/= target_mman.h index d70e44d44c..8c2a3d5596 100644 --- a/linux-user/loongarch64/target_mman.h +++ b/linux-user/loongarch64/target_mman.h @@ -6,4 +6,7 @@ #define TASK_UNMAPPED_BASE \ TARGET_PAGE_ALIGN((1ull << TARGET_VIRT_ADDR_SPACE_BITS) / 3) =20 +/* arch/loongarch/include/asm/elf.h */ +#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE * 2) + #include "../generic/target_mman.h" diff --git a/linux-user/m68k/target_mman.h b/linux-user/m68k/target_mman.h index d3eceb663b..20cfe750c5 100644 --- a/linux-user/m68k/target_mman.h +++ b/linux-user/m68k/target_mman.h @@ -1,4 +1,6 @@ /* arch/m68k/include/asm/processor.h */ #define TASK_UNMAPPED_BASE 0xC0000000 +/* arch/m68k/include/asm/elf.h */ +#define ELF_ET_DYN_BASE 0xD0000000 =20 #include "../generic/target_mman.h" diff --git a/linux-user/microblaze/target_mman.h b/linux-user/microblaze/ta= rget_mman.h index ffee869db4..6b3dd54f89 100644 --- a/linux-user/microblaze/target_mman.h +++ b/linux-user/microblaze/target_mman.h @@ -6,4 +6,7 @@ */ #define TASK_UNMAPPED_BASE 0x48000000 =20 +/* arch/microblaze/include/uapi/asm/elf.h */ +#define ELF_ET_DYN_BASE 0x08000000 + #include "../generic/target_mman.h" diff --git a/linux-user/mips/target_mman.h b/linux-user/mips/target_mman.h index fe1eec2d0b..b84fe1e8a8 100644 --- a/linux-user/mips/target_mman.h +++ b/linux-user/mips/target_mman.h @@ -21,6 +21,9 @@ #define TASK_UNMAPPED_BASE \ TARGET_PAGE_ALIGN((1ull << TARGET_VIRT_ADDR_SPACE_BITS) / 3) =20 +/* arch/mips/include/asm/elf.h */ +#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE * 2) + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/nios2/target_mman.h b/linux-user/nios2/target_mman.h index ce18f4f871..ab16ad4f03 100644 --- a/linux-user/nios2/target_mman.h +++ b/linux-user/nios2/target_mman.h @@ -5,4 +5,7 @@ */ #define TASK_UNMAPPED_BASE TARGET_PAGE_ALIGN(0x7FFF0000 / 3) =20 +/* arch/nios2/include/asm/elf.h */ +#define ELF_ET_DYN_BASE 0xD0000000 + #include "../generic/target_mman.h" diff --git a/linux-user/openrisc/target_mman.h b/linux-user/openrisc/target= _mman.h index f1aaad809d..243c1d5f26 100644 --- a/linux-user/openrisc/target_mman.h +++ b/linux-user/openrisc/target_mman.h @@ -5,4 +5,7 @@ */ #define TASK_UNMAPPED_BASE 0x30000000 =20 +/* arch/openrisc/include/asm/elf.h */ +#define ELF_ET_DYN_BASE 0x08000000 + #include "../generic/target_mman.h" diff --git a/linux-user/ppc/target_mman.h b/linux-user/ppc/target_mman.h index 04f99c6077..646d1ccae7 100644 --- a/linux-user/ppc/target_mman.h +++ b/linux-user/ppc/target_mman.h @@ -17,6 +17,13 @@ #define TASK_UNMAPPED_BASE 0x40000000 #endif =20 +/* arch/powerpc/include/asm/elf.h */ +#ifdef TARGET_PPC64 +#define ELF_ET_DYN_BASE 0x100000000ull +#else +#define ELF_ET_DYN_BASE 0x000400000 +#endif + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/riscv/target_mman.h b/linux-user/riscv/target_mman.h index 0f06dadbd4..3049bcc67d 100644 --- a/linux-user/riscv/target_mman.h +++ b/linux-user/riscv/target_mman.h @@ -5,4 +5,7 @@ #define TASK_UNMAPPED_BASE \ TARGET_PAGE_ALIGN((1ull << (TARGET_VIRT_ADDR_SPACE_BITS - 1)) / 3) =20 +/* arch/riscv/include/asm/elf.h */ +#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE * 2) + #include "../generic/target_mman.h" diff --git a/linux-user/s390x/target_mman.h b/linux-user/s390x/target_mman.h index 40d149b329..c82435e381 100644 --- a/linux-user/s390x/target_mman.h +++ b/linux-user/s390x/target_mman.h @@ -8,4 +8,14 @@ */ #define TASK_UNMAPPED_BASE (1ull << 41) =20 +/* + * arch/s390/include/asm/elf.h: + * ELF_ET_DYN_BASE (STACK_TOP / 3 * 2) & ~((1UL << 32) - 1) + * + * arch/s390/include/asm/processor.h: + * STACK_TOP VDSO_LIMIT - VDSO_SIZE - PAGE_SIZE + * VDSO_LIMIT _REGION2_SIZE + */ +#define ELF_ET_DYN_BASE (((1ull << 42) / 3 * 2) & ~0xffffffffull) + #include "../generic/target_mman.h" diff --git a/linux-user/sh4/target_mman.h b/linux-user/sh4/target_mman.h index bbbc223398..dd9016081e 100644 --- a/linux-user/sh4/target_mman.h +++ b/linux-user/sh4/target_mman.h @@ -2,4 +2,7 @@ #define TASK_UNMAPPED_BASE \ TARGET_PAGE_ALIGN((1u << TARGET_VIRT_ADDR_SPACE_BITS) / 3) =20 +/* arch/sh/include/asm/elf.h */ +#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE * 2) + #include "../generic/target_mman.h" diff --git a/linux-user/sparc/target_mman.h b/linux-user/sparc/target_mman.h index 692ebf9dd7..696ca73fe4 100644 --- a/linux-user/sparc/target_mman.h +++ b/linux-user/sparc/target_mman.h @@ -19,6 +19,17 @@ #define TASK_UNMAPPED_BASE (1ull << (TARGET_VIRT_ADDR_SPACE_BITS - 2)) #endif =20 +/* + * arch/sparc/include/asm/elf_64.h + * Except that COMPAT_ELF_ET_DYN_BASE exactly matches TASK_UNMAPPED_BASE, + * so move it up a bit. + */ +#ifdef TARGET_ABI32 +#define ELF_ET_DYN_BASE 0x78000000 +#else +#define ELF_ET_DYN_BASE 0x0000010000000000ull +#endif + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/user-mmap.h b/linux-user/user-mmap.h index bae49059e0..5dd48a458d 100644 --- a/linux-user/user-mmap.h +++ b/linux-user/user-mmap.h @@ -20,6 +20,7 @@ =20 extern abi_ulong task_unmapped_base; extern abi_ulong mmap_next_start; +extern abi_ulong elf_et_dyn_base; =20 int target_mprotect(abi_ulong start, abi_ulong len, int prot); abi_long target_mmap(abi_ulong start, abi_ulong len, int prot, diff --git a/linux-user/x86_64/target_mman.h b/linux-user/x86_64/target_mma= n.h index f9ff652b37..48fbf20b42 100644 --- a/linux-user/x86_64/target_mman.h +++ b/linux-user/x86_64/target_mman.h @@ -10,4 +10,7 @@ #define TASK_UNMAPPED_BASE \ TARGET_PAGE_ALIGN((1ull << TARGET_VIRT_ADDR_SPACE_BITS) / 3) =20 +/* arch/x86/include/asm/elf.h */ +#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE * 2) + #include "../generic/target_mman.h" diff --git a/linux-user/xtensa/target_mman.h b/linux-user/xtensa/target_mma= n.h index c4f671adb7..8fa6337a97 100644 --- a/linux-user/xtensa/target_mman.h +++ b/linux-user/xtensa/target_mman.h @@ -20,6 +20,10 @@ */ #define TASK_UNMAPPED_BASE (1u << (TARGET_VIRT_ADDR_SPACE_BITS - 1)) =20 +/* arch/xtensa/include/asm/elf.h */ +#define ELF_ET_DYN_BASE \ + TARGET_PAGE_ALIGN((1u << TARGET_VIRT_ADDR_SPACE_BITS) / 3) + #include "../generic/target_mman.h" =20 #endif diff --git a/linux-user/main.c b/linux-user/main.c index be621dc792..96be354897 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -847,6 +847,21 @@ int main(int argc, char **argv, char **envp) } mmap_next_start =3D task_unmapped_base; =20 + /* Similarly for elf_et_dyn_base. */ + if (reserved_va) { + if (ELF_ET_DYN_BASE < reserved_va) { + elf_et_dyn_base =3D ELF_ET_DYN_BASE; + } else { + /* The most common default formula is TASK_SIZE / 3 * 2. */ + elf_et_dyn_base =3D TARGET_PAGE_ALIGN(reserved_va / 3) * 2; + } + } else if (ELF_ET_DYN_BASE < UINTPTR_MAX) { + elf_et_dyn_base =3D ELF_ET_DYN_BASE; + } else { + /* 32-bit host: pick something medium size. */ + elf_et_dyn_base =3D 0x18000000; + } + #pragma GCC diagnostic pop =20 { diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 84436d45c8..949c4090f3 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -301,6 +301,7 @@ static bool mmap_frag(abi_ulong real_start, abi_ulong s= tart, abi_ulong last, =20 abi_ulong task_unmapped_base; abi_ulong mmap_next_start; +abi_ulong elf_et_dyn_base; =20 /* * Subroutine of mmap_find_vma, used when we have pre-allocated --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426255; cv=none; d=zohomail.com; s=zohoarc; b=dThpbbxvma3U3znlaPRoNgWc3pdf/uM7tI0gdMItGGymf6YogBkhtIY0zciNvXCNM7GlCDUcktytVbP8y2xrxtz1a6LolWq74Mmc43JOdbrHpL0N99fTXIDKN69w/EES+9IKLWCiJ3XAQZBbbS0LXtAquHB83uQIs3M09oaxnKE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426255; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=SJUFfIS4Wr1y8fuwf4as7ebNw3oHaTbxYse/4v8c7ug=; b=cq4GBXalaZJPC5CfRAfDshGQgudmSEuSxwmy1qlimuI4ExiOWjzaASMo7zawSfXhGqxcR2yX+93s0Sm+vrpfhTMuHJJ09043noM0LZv3ukvLb9e2IVJ/+Sx0uhDdZHcwmJ6ac+RxC0nbkGZgHjqPhLnyKDMWqYoEzkxnjMDiwWE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426255829108.19216541830099; Mon, 7 Aug 2023 09:37:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3ES-00079R-UW; Mon, 07 Aug 2023 12:37:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EH-00072s-92 for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:14 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EF-0002gU-Nk for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:13 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-1bc73a2b0easo5470265ad.0 for ; Mon, 07 Aug 2023 09:37:11 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426230; x=1692031030; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SJUFfIS4Wr1y8fuwf4as7ebNw3oHaTbxYse/4v8c7ug=; b=E/VEtqppstgRkSvtLGxvUOl/Gdqzl9f/roRZtLAClsJKncpE1H3Id8ICCtNnqdc7fC 5JD8DE7aiPvhCmpnocjUtn6dTwtayqFkAVACOPxOcrGVgkGoTnwvap94sVCb1zO80Cfs ExLHIitUKXmpL+IfN6dG8Zsnx6T8aQNmu+e6rhcFLVGqHWb+eJqaqxipab9wWuvcF/PC lEPWtbF0MMJJS/N5uIMfP8JdWeVkUqPgQ2ffWF//3WPwgka48a3sR/aSfscUv6CQRmHN 6PjeIdHbq8Ltca/RfwnSY4ohB8ZrPsZGwWIXISvOBk3xgVtSkDZBQx5zaAbBbvZJwq0X RxLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426230; x=1692031030; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SJUFfIS4Wr1y8fuwf4as7ebNw3oHaTbxYse/4v8c7ug=; b=P5O6iaGuim8QADuPfC60+nqT2KomfkK8ojplzZz7GvJPOWe5lbXPvbeEb9TeEzkH8w vtDNlTSSQisSeLCV/W6i/XSGorqw9X/tgUTDp3oWAjSBss7RldQU7yQWj7fyEKy4s9r5 d925uENk4XZbvLCn7sKC1Xg2A/pAm1BHGhGneaRfDMZK81B3sQa9oSWRWkOL2uvUv91P 3En7NnP1v6NYlpfEQ6iLp+WnafzwiOhrO1xOcHkumj9ykO/UjDpqI9Bp/BpYd0NVDuZ0 g3EJJB5d0ORqlks9h1J3B3Ifa08DP/z3BBuZ4pP+oFHOuQ7XQFh1jSu0T5DQPcyLhoE0 dQvA== X-Gm-Message-State: AOJu0Ywtviy7GdIQTpzzxUII8VLkYH6hKlb6F8ikQIhyIV4MkJ8FIrg8 V2lelJZwfE9e5VYh6O7m+yTUq+GWg+VTFCRon8Y= X-Google-Smtp-Source: AGHT+IEMw/7iF7jUCvDa72dNVMtpeRQ2F0cwogCT8cFTUqMoDhBvgg5CDKSNLu+swCemPANwl3R6RQ== X-Received: by 2002:a17:902:82c5:b0:1b8:6cae:4400 with SMTP id u5-20020a17090282c500b001b86cae4400mr7659675plz.37.1691426230493; Mon, 07 Aug 2023 09:37:10 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de, Akihiko Odaki Subject: [PATCH for-8.1 v10 04/14] linux-user: Use MAP_FIXED_NOREPLACE for initial image mmap Date: Mon, 7 Aug 2023 09:36:55 -0700 Message-Id: <20230807163705.9848-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426256203100001 Content-Type: text/plain; charset="utf-8" Use this as extra protection for the guest mapping over any qemu host mappings. Tested-by: Helge Deller Reviewed-by: Helge Deller Reviewed-by: Akihiko Odaki Signed-off-by: Richard Henderson Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 36e4026f05..1b4bb2d5af 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -3147,8 +3147,11 @@ static void load_elf_image(const char *image_name, i= nt image_fd, /* * Reserve address space for all of this. * - * In the case of ET_EXEC, we supply MAP_FIXED so that we get - * exactly the address range that is required. + * In the case of ET_EXEC, we supply MAP_FIXED_NOREPLACE so that we get + * exactly the address range that is required. Without reserved_va, + * the guest address space is not isolated. We have attempted to avoid + * conflict with the host program itself via probe_guest_base, but usi= ng + * MAP_FIXED_NOREPLACE instead of MAP_FIXED provides an extra check. * * Otherwise this is ET_DYN, and we are searching for a location * that can hold the memory space required. If the image is @@ -3160,7 +3163,7 @@ static void load_elf_image(const char *image_name, in= t image_fd, */ load_addr =3D target_mmap(loaddr, (size_t)hiaddr - loaddr + 1, PROT_NO= NE, MAP_PRIVATE | MAP_ANON | MAP_NORESERVE | - (ehdr->e_type =3D=3D ET_EXEC ? MAP_FIXED : 0), + (ehdr->e_type =3D=3D ET_EXEC ? MAP_FIXED_NOREP= LACE : 0), -1, 0); if (load_addr =3D=3D -1) { goto exit_mmap; --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426322; cv=none; d=zohomail.com; s=zohoarc; b=YNt5+FO49FJZtwsQlEKQ15pmgSa1b1QXzjn204BGagmmtno/CO/qCVDqF9zLzKXeystnGcnTYkFfRxgStHxWc1A2RoZk674iBz4ixyonUwz09c60cNB0ppLZflUrNVmNkmb9AeWKFK2OWZbBQKuGkDvYGgP1pqXhDnm+SA31OOE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426322; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=gdGMnmtdSmtXaxIRFinY8s6zOHM1AhXo+8V5ig/K9Os=; b=jTnYA+akKYuO40IsYNCWbej8jCIqo14tGClMXmCuyzyevmig3R9C4ZNPlkvtKLcgTYA4z0vTdblhNtwF6sFXnvr+LQoWzcGJGPNHbb99qK48ML9TL9Iz5U6sIOeytbK6dN92nhN3u/lX8K5mvj7KOhvP8hHaY5sxOtARR9NCvu0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 169142632259984.62592843571292; Mon, 7 Aug 2023 09:38:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EV-0007Ed-KD; Mon, 07 Aug 2023 12:37:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EI-00072v-AO for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:14 -0400 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EG-0002gn-LB for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:14 -0400 Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-1bbf8cb61aeso29993225ad.2 for ; Mon, 07 Aug 2023 09:37:12 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426231; x=1692031031; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gdGMnmtdSmtXaxIRFinY8s6zOHM1AhXo+8V5ig/K9Os=; b=UVG7G/CadsGT6SZkxRHBTw6gJdpmAysIbdAt3gNz/0BM7H7fy6AINFopvYVHOKHfvn gHI/0FEGAc8OFnfnhKvsPeF9384P9CO7hJwGD6BGgvI0HTn2TQbjQ+BFb8V/elY7SXCX Yz3bLiIG7WB2izulCWNKH0e6a66hJiu7vuBYMa5JRWt5Tea2AOMhI8srMylWsaSFIDFx tocacSySoD3IDZkHXnqkZp1xfZhmWZiUwsFB/m/OkFHCfhahJc7TgrWckMOFBuFDn8ia NzPpbz4XWY9TSeO1k3nkeR85UurTDqQE/RQe4HzQ5ot3DPjgW5htsoUZyXAKvvWuU50H hXNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426231; x=1692031031; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gdGMnmtdSmtXaxIRFinY8s6zOHM1AhXo+8V5ig/K9Os=; b=Nw4y3mWhxmYeFouhRUo/OdkZwkpUEzoPfXInq683Ng6TvXwETNtrKJMO2UC2r24hBN NAy7pBWgldB68ifu56VEL3wPwS5CgMmoE7keJJATppH4H9Y76RHWtpCCDUTT3pSGoEMz ulmAAnns1p1KTMJF3K+QDwTECsfL+iXU5VWnL5rXmUI40A03WPQhcV0OtKb7+OoWMUK4 BQUUaV4rLvlkv7KgtXlsOhdmKhE+5JAz+BdInQGoXgAGP/iRvznlzfWL34OCEGx1C49P VXTOt6T/Typ7dQpcIEcWVCkL6T3GUHyUo/QUGGa2G8Zs5hRsKou4lYYD3K1VhdmW5jw1 U4iQ== X-Gm-Message-State: AOJu0Yy8P9VOZJSFmmO6XRhiFeIJmIi1mBHCZJ5padhPC2elNlwuBgo5 Aw1s3k+b3drXJL94QD5a+kZdXMgoMvQ29fUxK8U= X-Google-Smtp-Source: AGHT+IEbrIrtGerOtTRQcA7XkSXQ/ZVkxc+QI7dbnyRzzpi1cLMt0qQlc61L6pizBS8ifbKEn04lcw== X-Received: by 2002:a17:902:ba95:b0:1b7:f546:44d7 with SMTP id k21-20020a170902ba9500b001b7f54644d7mr7401608pls.17.1691426231284; Mon, 07 Aug 2023 09:37:11 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de, Akihiko Odaki Subject: [PATCH for-8.1 v10 05/14] linux-user: Use elf_et_dyn_base for ET_DYN with interpreter Date: Mon, 7 Aug 2023 09:36:56 -0700 Message-Id: <20230807163705.9848-6-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::636; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x636.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426323102100001 Content-Type: text/plain; charset="utf-8" Follow the lead of the linux kernel in fs/binfmt_elf.c, in which an ET_DYN executable which uses an interpreter (usually a PIE executable) is loaded away from where the interpreter itself will be loaded. Tested-by: Helge Deller Reviewed-by: Helge Deller Reviewed-by: Akihiko Odaki Signed-off-by: Richard Henderson Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 1b4bb2d5af..d1b278d799 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -3107,6 +3107,8 @@ static void load_elf_image(const char *image_name, in= t image_fd, } } =20 + load_addr =3D loaddr; + if (pinterp_name !=3D NULL) { /* * This is the main executable. @@ -3136,11 +3138,32 @@ static void load_elf_image(const char *image_name, = int image_fd, */ probe_guest_base(image_name, loaddr, hiaddr); } else { + abi_ulong align; + /* * The binary is dynamic, but we still need to * select guest_base. In this case we pass a size. */ probe_guest_base(image_name, 0, hiaddr - loaddr); + + /* + * Avoid collision with the loader by providing a different + * default load address. + */ + load_addr +=3D elf_et_dyn_base; + + /* + * TODO: Better support for mmap alignment is desirable. + * Since we do not have complete control over the guest + * address space, we prefer the kernel to choose some address + * rather than force the use of LOAD_ADDR via MAP_FIXED. + * But without MAP_FIXED we cannot guarantee alignment, + * only suggest it. + */ + align =3D pow2ceil(info->alignment); + if (align) { + load_addr &=3D -align; + } } } =20 @@ -3155,13 +3178,13 @@ static void load_elf_image(const char *image_name, = int image_fd, * * Otherwise this is ET_DYN, and we are searching for a location * that can hold the memory space required. If the image is - * pre-linked, LOADDR will be non-zero, and the kernel should + * pre-linked, LOAD_ADDR will be non-zero, and the kernel should * honor that address if it happens to be free. * * In both cases, we will overwrite pages in this range with mappings * from the executable. */ - load_addr =3D target_mmap(loaddr, (size_t)hiaddr - loaddr + 1, PROT_NO= NE, + load_addr =3D target_mmap(load_addr, (size_t)hiaddr - loaddr + 1, PROT= _NONE, MAP_PRIVATE | MAP_ANON | MAP_NORESERVE | (ehdr->e_type =3D=3D ET_EXEC ? MAP_FIXED_NOREP= LACE : 0), -1, 0); --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426306; cv=none; d=zohomail.com; s=zohoarc; b=OAVgnKgLcAepKRHEeofaz4Ki7HI3lBSQyQFVrj5cYk79Vr0qq9+c5g128TG5NOtBA3GKNW4q4J3vyrtJiKuzw8R9Zdd0yW6pcntBa0iSSE5DdMMFAEKcdD7j8lfcO3hHpQBMT0UxMJjg81F6FAW9ODaZJ8GGv+67gZRYqoWMWko= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426306; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=AMertvkjKANJvxbefrHCxJAv2awwG2qfsSApx0ejDkI=; b=iYKg8I5XIAo8euvOY6+5qPTXkaGusRLq+RFx+CMgQMoj5UtQ4JBn8gvS0CukUUgT5DV4SXr2fCbqmqKn4JguKL/QJIAEwVUOu9kTsbJLW0QIssB/9p9OkRV3HsuhBCwxg9SQ8Hwm04PaHgs4AVyOVF4nnszku0QUxrwiH9XYalw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 169142630603680.06457997500706; Mon, 7 Aug 2023 09:38:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EW-0007NE-Tc; Mon, 07 Aug 2023 12:37:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EJ-00073r-EL for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:18 -0400 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EH-0002h0-M6 for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:15 -0400 Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-1b9c5e07c1bso42277055ad.2 for ; Mon, 07 Aug 2023 09:37:13 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426232; x=1692031032; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AMertvkjKANJvxbefrHCxJAv2awwG2qfsSApx0ejDkI=; b=SN6+KaU16CQ7BBO0ZWGlSIhpncMDd+HHOAFPUgHasS1BYRV8UZc1hZW0aLtX3pnNk3 Nk1Ceun6lCpgq+L0Fi4WCbC6lo5aiGteW351gE8Hz6BJAinLdXJ7r6e4kpEn9cui21hq f/k5jfFVXDtQ5g3NYzYf/blpixECY4TWfIi8xWkBc1FGuZ+Uo+52rnzWEaBxa0A3Moj3 MzfOYHG59/BKcREWwbYWqV+h2rdna/Aq9MVwvZr8ahGJkRLO8E9AkKf9q5ZWR2K60ylK GL+yjVsX/nEiGH+VUrLFbs1mBwITF/W9UhJglxAxH7DsAZ4mhxAmGJNTvalGJpTJJuii wrdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426232; x=1692031032; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AMertvkjKANJvxbefrHCxJAv2awwG2qfsSApx0ejDkI=; b=e8Jcyx/XzklzVo0Fg+QakO4yu16qDKqWVXR+vIWVYBebFbVqK8AfdSBbVAVmau8uO6 Cz9PUeeK6honWjkvRe/wofa4hQgE2W7ml9m2slGZNsG+jZK81BupC/tZ5pjmcOoEV5Zr 2c18aDBe/MreaUHLFoiWt2GbRQ1mR7NL5z2qYIQ+bbJpI9bkxS4II2kjSzybYmptmNXG gGaDYksQayAULHDMzDcMJWNS0q8AB101eeYl1OLNcYziWR2BqalITjJ/PZbBwtR/qM4a 6NRRJoFCnaEyTm5yhnluKeavRQVWVYNgO3FqEhzdc2ALIz/+iwZEyrPDq9pl8lMOMnnS 2xaw== X-Gm-Message-State: AOJu0YwJ8eWu02UjES9Gp+/abbxFbXOGrpODfKOZZ3FmAUcdvFm2kj0k 8isTkih2Aw0ycTSY0czv83E8e7aXNqwSURkH4mU= X-Google-Smtp-Source: AGHT+IEdhJzRE4WX4jUEIFl8QerJ787vgu3JodjZ9i2YIlV3ojEjRDzYbgmpPqTzyT+ehL/VjzwUdw== X-Received: by 2002:a17:902:f68c:b0:1b3:d4d5:beb2 with SMTP id l12-20020a170902f68c00b001b3d4d5beb2mr12616858plg.9.1691426232309; Mon, 07 Aug 2023 09:37:12 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de, Akihiko Odaki Subject: [PATCH for-8.1 v10 06/14] linux-user: Adjust initial brk when interpreter is close to executable Date: Mon, 7 Aug 2023 09:36:57 -0700 Message-Id: <20230807163705.9848-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::629; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x629.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426308434100001 Content-Type: text/plain; charset="utf-8" From: Helge Deller While we attempt to load a ET_DYN executable far away from TASK_UNMAPPED_BASE, we are not completely in control of the address space layout. If the interpreter lands close to the executable, leaving insufficient heap space, move brk. Tested-by: Helge Deller Signed-off-by: Helge Deller [rth: Re-order after ELF_ET_DYN_BASE patch so that we do not "temporarily break" tsan, and also to minimize the changes required. Remove image_info.reserve_brk as unused.] Reviewed-by: Akihiko Odaki Signed-off-by: Richard Henderson Reviewed-by: Alex Benn=C3=A9e Tested-by: Alex Benn=C3=A9e --- linux-user/qemu.h | 1 - linux-user/elfload.c | 51 +++++++++++++------------------------------- 2 files changed, 15 insertions(+), 37 deletions(-) diff --git a/linux-user/qemu.h b/linux-user/qemu.h index 2046a23037..4f8b55e2fb 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -30,7 +30,6 @@ struct image_info { abi_ulong start_data; abi_ulong end_data; abi_ulong brk; - abi_ulong reserve_brk; abi_ulong start_mmap; abi_ulong start_stack; abi_ulong stack_limit; diff --git a/linux-user/elfload.c b/linux-user/elfload.c index d1b278d799..3553a3eaef 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -3110,27 +3110,6 @@ static void load_elf_image(const char *image_name, i= nt image_fd, load_addr =3D loaddr; =20 if (pinterp_name !=3D NULL) { - /* - * This is the main executable. - * - * Reserve extra space for brk. - * We hold on to this space while placing the interpreter - * and the stack, lest they be placed immediately after - * the data segment and block allocation from the brk. - * - * 16MB is chosen as "large enough" without being so large as - * to allow the result to not fit with a 32-bit guest on a - * 32-bit host. However some 64 bit guests (e.g. s390x) - * attempt to place their heap further ahead and currently - * nothing stops them smashing into QEMUs address space. - */ -#if TARGET_LONG_BITS =3D=3D 64 - info->reserve_brk =3D 32 * MiB; -#else - info->reserve_brk =3D 16 * MiB; -#endif - hiaddr +=3D info->reserve_brk; - if (ehdr->e_type =3D=3D ET_EXEC) { /* * Make sure that the low address does not conflict with @@ -3221,7 +3200,8 @@ static void load_elf_image(const char *image_name, in= t image_fd, info->end_code =3D 0; info->start_data =3D -1; info->end_data =3D 0; - info->brk =3D 0; + /* Usual start for brk is after all sections of the main executable. */ + info->brk =3D TARGET_PAGE_ALIGN(hiaddr); info->elf_flags =3D ehdr->e_flags; =20 prot_exec =3D PROT_EXEC; @@ -3315,9 +3295,6 @@ static void load_elf_image(const char *image_name, in= t image_fd, info->end_data =3D vaddr_ef; } } - if (vaddr_em > info->brk) { - info->brk =3D vaddr_em; - } #ifdef TARGET_MIPS } else if (eppnt->p_type =3D=3D PT_MIPS_ABIFLAGS) { Mips_elf_abiflags_v0 abiflags; @@ -3646,6 +3623,19 @@ int load_elf_binary(struct linux_binprm *bprm, struc= t image_info *info) if (elf_interpreter) { load_elf_interp(elf_interpreter, &interp_info, bprm->buf); =20 + /* + * While unusual because of ELF_ET_DYN_BASE, if we are unlucky + * with the mappings the interpreter can be loaded above but + * near the main executable, which can leave very little room + * for the heap. + * If the current brk has less than 16MB, use the end of the + * interpreter. + */ + if (interp_info.brk > info->brk && + interp_info.load_bias - info->brk < 16 * MiB) { + info->brk =3D interp_info.brk; + } + /* If the program interpreter is one of these two, then assume an iBCS2 image. Otherwise assume a native linux image. */ =20 @@ -3699,17 +3689,6 @@ int load_elf_binary(struct linux_binprm *bprm, struc= t image_info *info) bprm->core_dump =3D &elf_core_dump; #endif =20 - /* - * If we reserved extra space for brk, release it now. - * The implementation of do_brk in syscalls.c expects to be able - * to mmap pages in this space. - */ - if (info->reserve_brk) { - abi_ulong start_brk =3D TARGET_PAGE_ALIGN(info->brk); - abi_ulong end_brk =3D TARGET_PAGE_ALIGN(info->brk + info->reserve_= brk); - target_munmap(start_brk, end_brk - start_brk); - } - return 0; } =20 --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426513; cv=none; d=zohomail.com; s=zohoarc; b=P4kcWiw3QocchX64EuBgRokp20RKQ9zIsfiYRsj2aZPCuZ5jXKNco1ic2JSBLJY3Sco/3XEcEiCGm/PqHfr6jQ2Q2POJfgmSt/AwTmW1PsbARpNyANw/XQKNyFlMWEqSieyxYFYjZc0AEZ3PkXZ3nXllYFBDqiId8d1AnKz8obg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426513; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=TbCJ8DmT72t6xcy/KS1lARRJzdw3e4AQqay5Lza2sjc=; b=nszbos4t8f+PltIL9vWkrfNDoQDYrOybiwgZ34uPgYZ3VGLqvoMt113N1dZL0ppnJT6eo4V1x8GWEihgNfUkC13d5G4+PpHrkYsE2YnFj1ar5UUBIFCrJ82lk6rkzJ83Ouejw+5QSyFaLqBhd8reUEc+I+5fQHR5iVtLhPMlegk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426513848790.6292867260536; Mon, 7 Aug 2023 09:41:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EX-0007QH-JE; Mon, 07 Aug 2023 12:37:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EK-00074K-CN for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:18 -0400 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EI-0002hG-D1 for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:16 -0400 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-1b8b4748fe4so30496535ad.1 for ; Mon, 07 Aug 2023 09:37:14 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426233; x=1692031033; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TbCJ8DmT72t6xcy/KS1lARRJzdw3e4AQqay5Lza2sjc=; b=tca7KPmtrOwNCoWQHPjzXFDIPcIDJNknAvtwAU2lIB3GfE1NbcvJsoSh3xriaKk/bq WkOPfaj+Btt6yVRQySwCYdFTpFNPnwqyXuHjJEgyja9Lh6ZrNZ8PUutHUojn/FS+1ua8 2JJbjHkvCmDeaWSIFNgUaOejCeI+VXCLuKQTfU+zyWtzKGaigXQWLLsh5OH7iGhXnlJX oH3erq0OvGlRiQYwJg6n/52Dc6j3p4eWR2G37YHIr20x3hmMo+RFc6M/cw8JzKEmipFF lZnG3TTm41NGPi3rJKU+gIPk2euHmooBl6FH/1q5fC89CSN4b/wsBiL1k8t7N1lEY9cM hyTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426233; x=1692031033; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TbCJ8DmT72t6xcy/KS1lARRJzdw3e4AQqay5Lza2sjc=; b=Aea611AQz03DzcRTYx+YNCQj7MSd9/myquuUGAkOMZgXEREaasZq1AODfUoF4xFndd VOSoKMDwqzBjbAXZ0jZoYJhLP+4Z27A2ORpF3htmvpoqwaeWYFTdP5Z2zreiyuus6V9K 3OU7J0HFoXhQoT33Va+koKTB2XCrhjEapfGe8M3znfy/KWODTcbqxfYOTE7YPE7D06tU KPoC5ZZYNPMMLQxxAC56AUSZ8QOpL+Ifbe09SiKlY4TA6g+bfJKOkkOf13JmQ7KPI7IE +dZb9G76A6OA7jRuloZ0qp5/ZoGkXvqjwv5+MFYM8eHV+ORPOfd/zWCw/lgFnSDwNpoE knHA== X-Gm-Message-State: AOJu0YwoQIkSjuRk7mhyHgP3xB96TgnMNI4dD59eoI49ZcZu+QTFz6Qk qcMU3YBh4nmGCUAjZiK+E5Z6bDRYlUXOrmWfQWs= X-Google-Smtp-Source: AGHT+IFCgUqqKVKf1XohZvJW97eBv/a3DX22HfGcZx4r8zwPquGntRW9ZQcjqxr1T5HWSrmJOOK07g== X-Received: by 2002:a17:902:cec1:b0:1bc:6a89:86ba with SMTP id d1-20020a170902cec100b001bc6a8986bamr4338259plg.16.1691426233129; Mon, 07 Aug 2023 09:37:13 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de, Akihiko Odaki Subject: [PATCH for-8.1 v10 07/14] linux-user: Do not adjust image mapping for host page size Date: Mon, 7 Aug 2023 09:36:58 -0700 Message-Id: <20230807163705.9848-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::630; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x630.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426515137100001 Content-Type: text/plain; charset="utf-8" Remove TARGET_ELF_EXEC_PAGESIZE, and 3 other TARGET_ELF_PAGE* macros based off of that. Rely on target_mmap to handle guest vs host page size mismatch. Tested-by: Helge Deller Reviewed-by: Helge Deller Reviewed-by: Akihiko Odaki Signed-off-by: Richard Henderson Reviewed-by: Alex Benn=C3=A9e Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 3553a3eaef..964b21f997 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -1960,15 +1960,6 @@ struct exec #define ZMAGIC 0413 #define QMAGIC 0314 =20 -/* Necessary parameters */ -#define TARGET_ELF_EXEC_PAGESIZE \ - (((eppnt->p_align & ~qemu_host_page_mask) !=3D 0) ? \ - TARGET_PAGE_SIZE : MAX(qemu_host_page_size, TARGET_PAGE_SIZE)) -#define TARGET_ELF_PAGELENGTH(_v) ROUND_UP((_v), TARGET_ELF_EXEC_PAGESIZE) -#define TARGET_ELF_PAGESTART(_v) ((_v) & \ - ~(abi_ulong)(TARGET_ELF_EXEC_PAGESIZE-1)) -#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1)) - #define DLINFO_ITEMS 16 =20 static inline void memcpy_fromfs(void * to, const void * from, unsigned lo= ng n) @@ -3241,8 +3232,8 @@ static void load_elf_image(const char *image_name, in= t image_fd, } =20 vaddr =3D load_bias + eppnt->p_vaddr; - vaddr_po =3D TARGET_ELF_PAGEOFFSET(vaddr); - vaddr_ps =3D TARGET_ELF_PAGESTART(vaddr); + vaddr_po =3D vaddr & ~TARGET_PAGE_MASK; + vaddr_ps =3D vaddr & TARGET_PAGE_MASK; =20 vaddr_ef =3D vaddr + eppnt->p_filesz; vaddr_em =3D vaddr + eppnt->p_memsz; @@ -3252,7 +3243,7 @@ static void load_elf_image(const char *image_name, in= t image_fd, * but no backing file segment. */ if (eppnt->p_filesz !=3D 0) { - vaddr_len =3D TARGET_ELF_PAGELENGTH(eppnt->p_filesz + vadd= r_po); + vaddr_len =3D eppnt->p_filesz + vaddr_po; error =3D target_mmap(vaddr_ps, vaddr_len, elf_prot, MAP_PRIVATE | MAP_FIXED, image_fd, eppnt->p_offset - vaddr_po); @@ -3268,7 +3259,7 @@ static void load_elf_image(const char *image_name, in= t image_fd, zero_bss(vaddr_ef, vaddr_em, elf_prot); } } else if (eppnt->p_memsz !=3D 0) { - vaddr_len =3D TARGET_ELF_PAGELENGTH(eppnt->p_memsz + vaddr= _po); + vaddr_len =3D eppnt->p_memsz + vaddr_po; error =3D target_mmap(vaddr_ps, vaddr_len, elf_prot, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOU= S, -1, 0); --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426509; cv=none; d=zohomail.com; s=zohoarc; b=Kd4df6leqifVOG0vqyCb4PMgJphcr08qug38KyjtvVC3ynFDEgIql0G+tnNVZzImazyTY6a6Q9EdnP/4ucAI6QizvwYyMuePPw5+Ve9WSC0dakX4m5LUZ/7w8QfrbyTyQ4bEsATRLaBK+Wt/R9BdezyDy2E2AxG41InzSG3ct8s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426509; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=H3Tim9UDK/YyEXiyy7lP2/6WWteP8ml5X65zqKKrj48=; b=fNZXMs1Kb+O5qUtRTh9R5CrXK6ReaOeVb5G8MooVmzLb4hua2jOa1o7Gk9J//SXaJuvy5BEl7tg3Ct1h+lFSAC4hRERfB5l81utILwnV7zt4mbQi5ilJN9MJgHmZrl765Vv80hmUTUiOd3joLmbQAPu9HHTc9wV9p/NFJ4Br+Y8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426509684587.5709212121039; Mon, 7 Aug 2023 09:41:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EW-0007MR-Nf; Mon, 07 Aug 2023 12:37:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EK-00075f-QV for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:18 -0400 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EJ-0002hT-5B for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:16 -0400 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-1bc63ef9959so15798455ad.2 for ; Mon, 07 Aug 2023 09:37:14 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426234; x=1692031034; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=H3Tim9UDK/YyEXiyy7lP2/6WWteP8ml5X65zqKKrj48=; b=KqZHxkLHdIPHZ19qpKR9NfMlver6K4bSX9dOxh0jkZ+p+lZxHOZh21T/H0sQV2r/Ly zPBeydIGVId82Ie81xOjcpqM+xqajc2dsEFcJHNDGu4vOo2AD8wtSZ5wDeJ/19ZQaWHy 0Qtz+jHGiF8ARfBHMb06nz6JNKTuiFQDWv2CZny9RZBMavAFfJOQLHj3Ptm5N1TGQHBu lmAJEGgob4/Qg4Jk7isxAw2tYrS0nCAQFQA4JcAhulorzXR32SRmc2Ca5Lro30e+hyoz 7Y0CAHn2OfxZ0heKjQGMrPrUOXECdiJnHO+3qKTuQ91p8cgcq+qeFkasjfRPwsWZCHcS vCZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426234; x=1692031034; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=H3Tim9UDK/YyEXiyy7lP2/6WWteP8ml5X65zqKKrj48=; b=brg7W2j8XVLEtb/kKxH3wi4cBquRpYSPUGXFb82C9yzB5CxmVbSOtub6JMfCV2J18e 7Mboa+AtIvRnrky55MQGbhwjHp7we5QEVUsFDRx8TaTVaAgg/MR9rl4LLnX5KAaOEwks vLjnPA3iYJTz57vdupCscpQ3ovsk/0gzIunnFczuMJxkN6OzwUiSymbElE7/OtEURr2C 1NcPlW5KEXc2NPBOVmSdsHA3mkEG9l/Uc8YxRaH34l/hk84j/YWExp5gHINq0mngSQOW WHGDhLwhxPWJ0z9dFk7lJ2kyh51fxPz0Ko49dh+Bu8WrTTljoRho4mhlPQJTrBuYwjCv VLKA== X-Gm-Message-State: AOJu0YxgbEbgMYg15R12eP5OOC+mm1HAUV71oidMJY0h1mXvli2VAsuJ mkl4T/L5ULvQb6fCwsdae5ox3fKTOzrf2frDZM4= X-Google-Smtp-Source: AGHT+IGm0Z/67eQotMRdBPa5dTnq+bKsWxznahSN9+D95i07/WGNqxgJPddjykZdzsOpIrsFqMRiHg== X-Received: by 2002:a17:903:1ce:b0:1b8:88c5:2d2f with SMTP id e14-20020a17090301ce00b001b888c52d2fmr12125907plh.64.1691426233899; Mon, 07 Aug 2023 09:37:13 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de, Akihiko Odaki Subject: [PATCH for-8.1 v10 08/14] linux-user: Do not adjust zero_bss for host page size Date: Mon, 7 Aug 2023 09:36:59 -0700 Message-Id: <20230807163705.9848-9-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::634; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x634.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426511950100003 Content-Type: text/plain; charset="utf-8" Rely on target_mmap to handle guest vs host page size mismatch. Tested-by: Helge Deller Reviewed-by: Helge Deller Reviewed-by: Akihiko Odaki Signed-off-by: Richard Henderson Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 54 +++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 964b21f997..6c28cb70ef 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2213,44 +2213,36 @@ static abi_ulong setup_arg_pages(struct linux_binpr= m *bprm, =20 /* Map and zero the bss. We need to explicitly zero any fractional pages after the data section (i.e. bss). */ -static void zero_bss(abi_ulong elf_bss, abi_ulong last_bss, int prot) +static void zero_bss(abi_ulong start_bss, abi_ulong end_bss, int prot) { - uintptr_t host_start, host_map_start, host_end; + abi_ulong align_bss; =20 - last_bss =3D TARGET_PAGE_ALIGN(last_bss); + align_bss =3D TARGET_PAGE_ALIGN(start_bss); + end_bss =3D TARGET_PAGE_ALIGN(end_bss); =20 - /* ??? There is confusion between qemu_real_host_page_size and - qemu_host_page_size here and elsewhere in target_mmap, which - may lead to the end of the data section mapping from the file - not being mapped. At least there was an explicit test and - comment for that here, suggesting that "the file size must - be known". The comment probably pre-dates the introduction - of the fstat system call in target_mmap which does in fact - find out the size. What isn't clear is if the workaround - here is still actually needed. For now, continue with it, - but merge it with the "normal" mmap that would allocate the bss. */ + if (start_bss < align_bss) { + int flags =3D page_get_flags(start_bss); =20 - host_start =3D (uintptr_t) g2h_untagged(elf_bss); - host_end =3D (uintptr_t) g2h_untagged(last_bss); - host_map_start =3D REAL_HOST_PAGE_ALIGN(host_start); - - if (host_map_start < host_end) { - void *p =3D mmap((void *)host_map_start, host_end - host_map_start, - prot, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, = 0); - if (p =3D=3D MAP_FAILED) { - perror("cannot mmap brk"); - exit(-1); + if (!(flags & PAGE_VALID)) { + /* Map the start of the bss. */ + align_bss -=3D TARGET_PAGE_SIZE; + } else if (flags & PAGE_WRITE) { + /* The page is already mapped writable. */ + memset(g2h_untagged(start_bss), 0, align_bss - start_bss); + } else { + /* Read-only zeros? */ + g_assert_not_reached(); } } =20 - /* Ensure that the bss page(s) are valid */ - if ((page_get_flags(last_bss-1) & prot) !=3D prot) { - page_set_flags(elf_bss & TARGET_PAGE_MASK, last_bss - 1, - prot | PAGE_VALID); - } - - if (host_start < host_map_start) { - memset((void *)host_start, 0, host_map_start - host_start); + if (align_bss < end_bss) { + abi_long err =3D target_mmap(align_bss, end_bss - align_bss, prot, + MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, + -1, 0); + if (err =3D=3D -1) { + perror("cannot mmap brk"); + exit(-1); + } } } =20 --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426269; cv=none; d=zohomail.com; s=zohoarc; b=U/HruzUltorJX7GSYtpKn8ydeMrIwDa278tdDoSC5JsK4QyigKi7DsJxQRIXZsQ5ZafP4EmntZecdfmt0qB54HnRux58/qcEfzBp4otxcdIDO5sM0vHEP3MJXsPVsRUtOxxA9BgYMAPAyYae/gP90TCOn3yRIEOpjhagW6mAJgU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426269; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Y+mZZ88pcdw893U+hesCVPS8DRB2GmOsmcmXPqFY2jE=; b=C5wnqEB3AsLBhVp+CXrdVN/W0oE9dVZyoTwemjlbC3SiiTYeBchvNnb83vTSfNWi/XY6ovM4DEGe0zynQ72JlRke+XvXCVE68SEecTHlaB70msU+IFVcxubofSD99Nv0lDWPxYPp3Cvxz2dWrhdHEgWQXoI5a5T+ATz8xbtP6ns= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426269392848.874480702673; Mon, 7 Aug 2023 09:37:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EY-0007VZ-Th; Mon, 07 Aug 2023 12:37:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EL-00075k-DQ for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:19 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EJ-0002hc-To for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:17 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-1bc7b25c699so2821165ad.1 for ; Mon, 07 Aug 2023 09:37:15 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426234; x=1692031034; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Y+mZZ88pcdw893U+hesCVPS8DRB2GmOsmcmXPqFY2jE=; b=LAdWI4BvRcfFZcUbI/FkufRUEHGCXJICTh669vZNEvlcp8YaUs+QwEc0FtOHOT2p9i 8qqrGQNRxPMUatTKC4w4JlAH1sLZ1UT8OtyVNrTxud8LV46HnSpTLdeBMrwS7XQKMjsu XUJVakuTSQvXWP29UlV0y1d3fnIhUXDU6sCfclDj+csfjECF751ptunnSF1gfsXm3HOF 2huBl03YBef99FOLItStXg6ggqHuxJhFXuVWlIqP0uYNau6rT9wD6yQeEoc8OPBcq2XE b/K58hsmjfYMpLLU710lw9bA9C0lalcvJKy+h+x0jD1gTXBO/Gp3yljJ+kfMyxsnsWJ9 lHOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426234; x=1692031034; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Y+mZZ88pcdw893U+hesCVPS8DRB2GmOsmcmXPqFY2jE=; b=epK4qxjItBk81ZkZ06ywzfA8tIPbyF34d6frawPL+5mk3mImApJOiHNjlKY0RVHeP4 pYCt0JfcAdFXWTwmQkvU5H7hLsmGTaTbD+xoBWfh4GKyc7RmhrIl5C60lgZUFZUafuwT 6i7cB/FdUypruYqJxatFo/dvoPIyeurOumSkf4ldKeE43vBS9nUFtBhiBsBBobYKgycG Gwp/oLMswUN4+qudy254LIGBpj6vvgRzCHHfosEZvCrgn8TvgQQUMLpyg4FNVsqQXYcL VN+mukBPm+X6CtnG87HmH3shnWoCVhvNcZ3IczQAXbE3weNyINWg4kEVtT8UkeiSXHP5 3NPA== X-Gm-Message-State: AOJu0YzOzRHsL0jegGwV3iYK0mcsQTEP7E3rKkAvZOJRR+BT4yO4Fcc4 407kkEdBgfHGuLB1YMVKCpvw3rr6xpaRXuJAUVw= X-Google-Smtp-Source: AGHT+IFh6yd55KkqSrGtvMByFKJoJRRGTq/arlwxnyzxlNDnh8t5UFyMsAJqcfFbska+fUiV+vFJtg== X-Received: by 2002:a17:902:db0c:b0:1bc:7441:d81a with SMTP id m12-20020a170902db0c00b001bc7441d81amr1924036plx.6.1691426234670; Mon, 07 Aug 2023 09:37:14 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de, Akihiko Odaki Subject: [PATCH for-8.1 v10 09/14] linux-user: Use zero_bss for PT_LOAD with no file contents too Date: Mon, 7 Aug 2023 09:37:00 -0700 Message-Id: <20230807163705.9848-10-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426269760100001 Content-Type: text/plain; charset="utf-8" If p_filesz =3D=3D 0, then vaddr_ef =3D=3D vaddr. We can reuse the code in zero_bss rather than incompletely duplicating it in load_elf_image. Tested-by: Helge Deller Reviewed-by: Helge Deller Reviewed-by: Akihiko Odaki Signed-off-by: Richard Henderson Reviewed-by: Alex Benn=C3=A9e Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 6c28cb70ef..c9e176a9f6 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -3210,7 +3210,7 @@ static void load_elf_image(const char *image_name, in= t image_fd, for (i =3D 0; i < ehdr->e_phnum; i++) { struct elf_phdr *eppnt =3D phdr + i; if (eppnt->p_type =3D=3D PT_LOAD) { - abi_ulong vaddr, vaddr_po, vaddr_ps, vaddr_ef, vaddr_em, vaddr= _len; + abi_ulong vaddr, vaddr_po, vaddr_ps, vaddr_ef, vaddr_em; int elf_prot =3D 0; =20 if (eppnt->p_flags & PF_R) { @@ -3235,30 +3235,17 @@ static void load_elf_image(const char *image_name, = int image_fd, * but no backing file segment. */ if (eppnt->p_filesz !=3D 0) { - vaddr_len =3D eppnt->p_filesz + vaddr_po; - error =3D target_mmap(vaddr_ps, vaddr_len, elf_prot, - MAP_PRIVATE | MAP_FIXED, + error =3D target_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po, + elf_prot, MAP_PRIVATE | MAP_FIXED, image_fd, eppnt->p_offset - vaddr_po); - if (error =3D=3D -1) { goto exit_mmap; } + } =20 - /* - * If the load segment requests extra zeros (e.g. bss), ma= p it. - */ - if (eppnt->p_filesz < eppnt->p_memsz) { - zero_bss(vaddr_ef, vaddr_em, elf_prot); - } - } else if (eppnt->p_memsz !=3D 0) { - vaddr_len =3D eppnt->p_memsz + vaddr_po; - error =3D target_mmap(vaddr_ps, vaddr_len, elf_prot, - MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOU= S, - -1, 0); - - if (error =3D=3D -1) { - goto exit_mmap; - } + /* If the load segment requests extra zeros (e.g. bss), map it= . */ + if (vaddr_ef < vaddr_em) { + zero_bss(vaddr_ef, vaddr_em, elf_prot); } =20 /* Find the full program boundaries. */ --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426299; cv=none; d=zohomail.com; s=zohoarc; b=MD5+nZr56Z579ypir+xV3K42klZGzpF+t/2XI7AZlJnc446r+yfnzPnZwWT8wEVAMPInBzLkLCj1iexsd60kQ9lT+Q1Gnkm49piPYjtUDvWBCFGZvfHmXxEIZwTdwErBFmSwlGnaFklW5o+jWo1NxyorWBdJQ/dNoR+hnH6SiXw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426299; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=WIhYglDsXCnrxRsjPebomm6uEmgGkuEHTNX79IYUpQ8=; b=hCj/ilSMcJf9qBgdPe5p0Ys0WjAjIZ47NGrVehvJT/xkf4LWJvacN7m7cNfwHNiGg3WDZZLLJwHpBbkZh5SPMHMN3rhGe5ILwRY5r1cdv0gPdiu1e8EgvAM92OouchvZDyrW2RdwhAJ/OpHL9z/0lfLR94OvasM8Igcy/Ll4SCs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426299947916.8561181258112; Mon, 7 Aug 2023 09:38:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EV-0007GK-Jx; Mon, 07 Aug 2023 12:37:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EM-00075n-R0 for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:19 -0400 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EK-0002hn-Te for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:18 -0400 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-1bc3d94d40fso41463835ad.3 for ; Mon, 07 Aug 2023 09:37:16 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426235; x=1692031035; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WIhYglDsXCnrxRsjPebomm6uEmgGkuEHTNX79IYUpQ8=; b=CFSdv7OTnz6coMmJysSXHW+L9LcNUwG2eheyvoGpLwP075NWHsocWBP+TxlPNmRfND fH2OfoF8A69NuALMyoJpysW0ihECO1W9r4TEsqR4qjDDHEgdGvZNfJdqCImnoqmClzKU +agwVrCBcO8SkVp8f/QQUNDMUvB8ZAVoXoAyBcJRXHdIdk4ezLxDbsRWLjpOwZUefSTL E9xLD+x14EOI87/TQqqhCXQqxNsTjcKiNES2o0Y/BrWX56IcIS0QmAg8EM/HC2Bc+Luy Cz0jnerKquRW/7iGd8lXOTrjGNgr5GXEfzT4TfgMfcghR4rQHqUqJzB5ShCxWRFO319U 5wkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426235; x=1692031035; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WIhYglDsXCnrxRsjPebomm6uEmgGkuEHTNX79IYUpQ8=; b=JM4h7FSONMYLbUhw4G91BHBgNrllEhFVj0LEz5meVYeb1kRK7yQpMBAKr1U6mgGMZP 4/NY70/RS5jJ9Pv/hH7G3p7MR8JJ2vmBh5i1QhTtPx9EWWOR+snEsOBHU+uLtRS/B4qB spX4ZrbV5nW6H5oD5bCNhurQDd8CqsaPHd+42lxo41gHo9ppt6EXmBMZiMhEZj54pAI8 ZddPbQYVEln2zEo9VyjLbWCYjWLsoktn6aBUrwfzXj67zbIRYGv5UR2naJCunSubj/H2 WuDarzhI+wchgN0tPwdv216E63QsdCTCRjucR9iteuDPWRH3cTDdDcDuHcTYzjPTfOLI uxrw== X-Gm-Message-State: AOJu0Yy0uQTuyFmK53YY8cr5KfZUGNhd3LQ5Z6frjnyqKndpkzM0bxnI YnqU6qytgcbnu772mi4pDfZCKmOHjKg15knqGWY= X-Google-Smtp-Source: AGHT+IHgcfqBp7ctiTPmappux3fvYME83ZCT9v/S1E9iMI72P4lQzZtOJ2ztoLCAGsS6DfBAaSaiTQ== X-Received: by 2002:a17:902:f545:b0:1bc:c82:9368 with SMTP id h5-20020a170902f54500b001bc0c829368mr11947086plf.32.1691426235629; Mon, 07 Aug 2023 09:37:15 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de Subject: [PATCH for-8.1 v10 10/14] util/selfmap: Rewrite using qemu/interval-tree.h Date: Mon, 7 Aug 2023 09:37:01 -0700 Message-Id: <20230807163705.9848-11-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::62b; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426302008100003 Content-Type: text/plain; charset="utf-8" We will want to be able to search the set of mappings. For this patch, the two users iterate the tree in order. Signed-off-by: Richard Henderson Tested-by: Alex Benn=C3=A9e --- include/qemu/selfmap.h | 20 ++++---- linux-user/elfload.c | 14 +++-- linux-user/syscall.c | 15 +++--- util/selfmap.c | 114 +++++++++++++++++++++++++---------------- 4 files changed, 96 insertions(+), 67 deletions(-) diff --git a/include/qemu/selfmap.h b/include/qemu/selfmap.h index 3479a2a618..aacd6ae0a0 100644 --- a/include/qemu/selfmap.h +++ b/include/qemu/selfmap.h @@ -9,9 +9,10 @@ #ifndef SELFMAP_H #define SELFMAP_H =20 +#include "qemu/interval-tree.h" + typedef struct { - unsigned long start; - unsigned long end; + IntervalTreeNode itree; =20 /* flags */ bool is_read; @@ -19,26 +20,25 @@ typedef struct { bool is_exec; bool is_priv; =20 - unsigned long offset; - gchar *dev; + uint64_t offset; uint64_t inode; - gchar *path; + const char *path; + char dev[]; } MapInfo; =20 - /** * read_self_maps: * * Read /proc/self/maps and return a list of MapInfo structures. */ -GSList *read_self_maps(void); +IntervalTreeRoot *read_self_maps(void); =20 /** * free_self_maps: - * @info: a GSlist + * @info: an interval tree * - * Free a list of MapInfo structures. + * Free a tree of MapInfo structures. */ -void free_self_maps(GSList *info); +void free_self_maps(IntervalTreeRoot *root); =20 #endif /* SELFMAP_H */ diff --git a/linux-user/elfload.c b/linux-user/elfload.c index c9e176a9f6..f497286abe 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2622,7 +2622,8 @@ static uintptr_t pgd_find_hole_fallback(uintptr_t gue= st_size, uintptr_t brk, static uintptr_t pgb_find_hole(uintptr_t guest_loaddr, uintptr_t guest_siz= e, long align, uintptr_t offset) { - GSList *maps, *iter; + IntervalTreeRoot *maps; + IntervalTreeNode *iter; uintptr_t this_start, this_end, next_start, brk; intptr_t ret =3D -1; =20 @@ -2640,12 +2641,15 @@ static uintptr_t pgb_find_hole(uintptr_t guest_load= dr, uintptr_t guest_size, /* The first hole is before the first map entry. */ this_start =3D mmap_min_addr; =20 - for (iter =3D maps; iter; - this_start =3D next_start, iter =3D g_slist_next(iter)) { + for (iter =3D interval_tree_iter_first(maps, 0, -1); + iter; + this_start =3D next_start, + iter =3D interval_tree_iter_next(iter, 0, -1)) { + MapInfo *info =3D container_of(iter, MapInfo, itree); uintptr_t align_start, hole_size; =20 - this_end =3D ((MapInfo *)iter->data)->start; - next_start =3D ((MapInfo *)iter->data)->end; + this_end =3D info->itree.start; + next_start =3D info->itree.last + 1; align_start =3D ROUND_UP(this_start + offset, align); =20 /* Skip holes that are too small. */ diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 7c2c2f6e2f..a15bce2be2 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -8070,16 +8070,17 @@ static int open_self_maps_1(CPUArchState *cpu_env, = int fd, bool smaps) { CPUState *cpu =3D env_cpu(cpu_env); TaskState *ts =3D cpu->opaque; - GSList *map_info =3D read_self_maps(); - GSList *s; + IntervalTreeRoot *map_info =3D read_self_maps(); + IntervalTreeNode *s; int count; =20 - for (s =3D map_info; s; s =3D g_slist_next(s)) { - MapInfo *e =3D (MapInfo *) s->data; + for (s =3D interval_tree_iter_first(map_info, 0, -1); s; + s =3D interval_tree_iter_next(s, 0, -1)) { + MapInfo *e =3D container_of(s, MapInfo, itree); =20 - if (h2g_valid(e->start)) { - unsigned long min =3D e->start; - unsigned long max =3D e->end; + if (h2g_valid(e->itree.start)) { + unsigned long min =3D e->itree.start; + unsigned long max =3D e->itree.last + 1; int flags =3D page_get_flags(h2g(min)); const char *path; =20 diff --git a/util/selfmap.c b/util/selfmap.c index 2c14f019ce..4db5b42651 100644 --- a/util/selfmap.c +++ b/util/selfmap.c @@ -10,74 +10,98 @@ #include "qemu/cutils.h" #include "qemu/selfmap.h" =20 -GSList *read_self_maps(void) +IntervalTreeRoot *read_self_maps(void) { - gchar *maps; - GSList *map_info =3D NULL; + IntervalTreeRoot *root; + gchar *maps, **lines; + guint i, nlines; =20 - if (g_file_get_contents("/proc/self/maps", &maps, NULL, NULL)) { - gchar **lines =3D g_strsplit(maps, "\n", 0); - int i, entries =3D g_strv_length(lines); + if (!g_file_get_contents("/proc/self/maps", &maps, NULL, NULL)) { + return NULL; + } =20 - for (i =3D 0; i < entries; i++) { - gchar **fields =3D g_strsplit(lines[i], " ", 6); - if (g_strv_length(fields) > 4) { - MapInfo *e =3D g_new0(MapInfo, 1); - int errors =3D 0; - const char *end; + root =3D g_new0(IntervalTreeRoot, 1); + lines =3D g_strsplit(maps, "\n", 0); + nlines =3D g_strv_length(lines); =20 - errors |=3D qemu_strtoul(fields[0], &end, 16, &e->start); - errors |=3D qemu_strtoul(end + 1, NULL, 16, &e->end); + for (i =3D 0; i < nlines; i++) { + gchar **fields =3D g_strsplit(lines[i], " ", 6); + guint nfields =3D g_strv_length(fields); + + if (nfields > 4) { + uint64_t start, end, offset, inode; + int errors =3D 0; + const char *p; + + errors |=3D qemu_strtou64(fields[0], &p, 16, &start); + errors |=3D qemu_strtou64(p + 1, NULL, 16, &end); + errors |=3D qemu_strtou64(fields[2], NULL, 16, &offset); + errors |=3D qemu_strtou64(fields[4], NULL, 10, &inode); + + if (!errors) { + size_t dev_len, path_len; + MapInfo *e; + + dev_len =3D strlen(fields[3]) + 1; + if (nfields =3D=3D 6) { + p =3D fields[5]; + p +=3D strspn(p, " "); + path_len =3D strlen(p) + 1; + } else { + p =3D NULL; + path_len =3D 0; + } + + e =3D g_malloc0(sizeof(*e) + dev_len + path_len); + + e->itree.start =3D start; + e->itree.last =3D end - 1; + e->offset =3D offset; + e->inode =3D inode; =20 e->is_read =3D fields[1][0] =3D=3D 'r'; e->is_write =3D fields[1][1] =3D=3D 'w'; e->is_exec =3D fields[1][2] =3D=3D 'x'; e->is_priv =3D fields[1][3] =3D=3D 'p'; =20 - errors |=3D qemu_strtoul(fields[2], NULL, 16, &e->offset); - e->dev =3D g_strdup(fields[3]); - errors |=3D qemu_strtou64(fields[4], NULL, 10, &e->inode); - - if (!errors) { - /* - * The last field may have leading spaces which we - * need to strip. - */ - if (g_strv_length(fields) =3D=3D 6) { - e->path =3D g_strdup(g_strchug(fields[5])); - } - map_info =3D g_slist_prepend(map_info, e); - } else { - g_free(e->dev); - g_free(e); + memcpy(e->dev, fields[3], dev_len); + if (path_len) { + e->path =3D memcpy(e->dev + dev_len, p, path_len); } + + interval_tree_insert(&e->itree, root); } - - g_strfreev(fields); } - g_strfreev(lines); - g_free(maps); + g_strfreev(fields); } + g_strfreev(lines); + g_free(maps); =20 - /* ensure the map data is in the same order we collected it */ - return g_slist_reverse(map_info); + return root; } =20 /** * free_self_maps: - * @info: a GSlist + * @root: an interval tree * - * Free a list of MapInfo structures. + * Free a tree of MapInfo structures. + * Since we allocated each MapInfo in one chunk, we need not consider the + * contents and can simply free each RBNode. */ -static void free_info(gpointer data) + +static void free_rbnode(RBNode *n) { - MapInfo *e =3D (MapInfo *) data; - g_free(e->dev); - g_free(e->path); - g_free(e); + if (n) { + free_rbnode(n->rb_left); + free_rbnode(n->rb_right); + g_free(n); + } } =20 -void free_self_maps(GSList *info) +void free_self_maps(IntervalTreeRoot *root) { - g_slist_free_full(info, &free_info); + if (root) { + free_rbnode(root->rb_root.rb_node); + g_free(root); + } } --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426315; cv=none; d=zohomail.com; s=zohoarc; b=m+Du8djq5+/taR9zTF0Fq9yhttKyF81iwWdWtk3KCvvB5mFCi3KLcaTPfrLlWPoQ6gGFz0EYPo5GqPWsDCXy/Qcn60v2AV4IzZdf1U8vFRcGmXLYHdKwulh6kh1JK4kx1qekmKQsQ0c0xJ5mkjdYumHiqm+ubn6XiIJjUvGmwbQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426315; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=LDhuT++xsqj01ETEWaKWE9ZYg7Hhe6sUk2NPXqCd0Zs=; b=Tu0gCpK/A02XHp6VcxGK3DstgCJHg7P80wAfJNQbAY/oqfT5Mu9LIzzAFID9LNxfno3ohnKcXIaYbqQL1rfyZiG5RlVRUri5QWTzaVkZl42gRcGnOqG6808q6LupzaGWACyStpcziOGday3fCx9zTcbhYLNqpJ7M2tRbRg6E1mQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426315606494.7459864355641; Mon, 7 Aug 2023 09:38:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EV-0007JI-SX; Mon, 07 Aug 2023 12:37:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EN-00076H-El for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:22 -0400 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EL-0002i8-Sj for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:19 -0400 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-1b9c5e07c1bso42277755ad.2 for ; Mon, 07 Aug 2023 09:37:17 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426236; x=1692031036; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LDhuT++xsqj01ETEWaKWE9ZYg7Hhe6sUk2NPXqCd0Zs=; b=n5zy/PhrTWy23L1oOIUnWS3oJprsmY065QGpA6tsdpW52JiRhhFYVFMZjyjUGt3qYY dvT4rvHyGK4zf7n5CLupovHy4sXDiLhepcpla6/cG5NsClwbHT1bYgzQGjSK4gedw8a4 ueYvOG2XpIEZmehlu47t7pDkwiLeaJxLhGMnrY9fKN1C3K/UsDsBnWhVITz0oJeMZhrM uSX8RGODefpcG73TowuV83wnZ7t5y9qLriWuiPnR58Njg1VwJmTEfNbHN5cDMx1cP8OS mDY07idypRUIqK6ogu2OtRbhEq5H3Lu1L5PuvMO1nzf4Ls/PI0ixsbuIzCJVpA+oaOAI XHMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426236; x=1692031036; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LDhuT++xsqj01ETEWaKWE9ZYg7Hhe6sUk2NPXqCd0Zs=; b=bBFsjioUinWt5MUPQdaDX3tzBJd1xA+zzq7Nv7aCexPrC+P6L1tbmZ2faNLCHAVwXb Nr5tAauPTY7W+2oDtLqQs5t4Hv/TYCc45l8GEUNnDOJofI6ZZ+83CXhd/bvhkOvJEFLL rbFz9JqxkCBlKqlqSeu3vRTmp4Uwj6oc7wODHy1BteQ1fM1o3wzj6kGccTAetd4tmoiR oFwt4rqAehpEDr26k2uVBMlLxQLALoC21oGLVlu2aVBStE+XWJWx+b/tBeumCZ1M70+B oBbd7hjeKHAEZfC3/RmtnHzCBVj6ZJDG8QxEDdWVEov2GjIbyehO5CWM1vJyEtJSdhAI w30A== X-Gm-Message-State: AOJu0YyNiaEoeL5QC9ST2YpmaOO1OswXr2QB65p6O+2gQU7IBd6iaMak 0hq7OfCpUVuL3HWdk0ubWWWq/5pbFA8w6nE5XKU= X-Google-Smtp-Source: AGHT+IE8oOogRSkCK3NkJEnZlvw5H/UH4+A+pk/QD11PDJ03AeOOc6usZboIVur0jDVWUD3flYWoqQ== X-Received: by 2002:a17:902:6bc9:b0:1bb:ed01:2d03 with SMTP id m9-20020a1709026bc900b001bbed012d03mr9511445plt.50.1691426236511; Mon, 07 Aug 2023 09:37:16 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de Subject: [PATCH for-8.1 v10 11/14] linux-user: Remove duplicate CPU_LOG_PAGE from probe_guest_base Date: Mon, 7 Aug 2023 09:37:02 -0700 Message-Id: <20230807163705.9848-12-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::630; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x630.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426316840100001 Content-Type: text/plain; charset="utf-8" The proper logging for probe_guest_base is in the main function. There is no need to duplicate that in the subroutines. Signed-off-by: Richard Henderson Reviewed-by: Alex Benn=C3=A9e Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index f497286abe..400af4a4c0 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2562,9 +2562,6 @@ static void pgb_have_guest_base(const char *image_nam= e, abi_ulong guest_loaddr, if (test !=3D addr) { pgb_fail_in_use(image_name); } - qemu_log_mask(CPU_LOG_PAGE, - "%s: base @ %p for %" PRIu64 " bytes\n", - __func__, addr, (uint64_t)guest_hiaddr - guest_loaddr + = 1); } =20 /** @@ -2607,9 +2604,6 @@ static uintptr_t pgd_find_hole_fallback(uintptr_t gue= st_size, uintptr_t brk, if (mmap_start !=3D MAP_FAILED) { munmap(mmap_start, guest_size); if (mmap_start =3D=3D (void *) align_start) { - qemu_log_mask(CPU_LOG_PAGE, - "%s: base @ %p for %" PRIdPTR" bytes\n", - __func__, mmap_start + offset, guest_siz= e); return (uintptr_t) mmap_start + offset; } } @@ -2691,13 +2685,6 @@ static uintptr_t pgb_find_hole(uintptr_t guest_loadd= r, uintptr_t guest_size, } } free_self_maps(maps); - - if (ret !=3D -1) { - qemu_log_mask(CPU_LOG_PAGE, "%s: base @ %" PRIxPTR - " for %" PRIuPTR " bytes\n", - __func__, ret, guest_size); - } - return ret; } =20 @@ -2749,9 +2736,6 @@ static void pgb_static(const char *image_name, abi_ul= ong orig_loaddr, } =20 guest_base =3D addr; - - qemu_log_mask(CPU_LOG_PAGE, "%s: base @ %"PRIxPTR" for %" PRIuPTR" byt= es\n", - __func__, addr, hiaddr - loaddr); } =20 static void pgb_dynamic(const char *image_name, long align) @@ -2809,9 +2793,6 @@ static void pgb_reserved_va(const char *image_name, a= bi_ulong guest_loaddr, reserved_va + 1, test, strerror(errno)); exit(EXIT_FAILURE); } - - qemu_log_mask(CPU_LOG_PAGE, "%s: base @ %p for %lu bytes\n", - __func__, addr, reserved_va + 1); } =20 void probe_guest_base(const char *image_name, abi_ulong guest_loaddr, --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426383; cv=none; d=zohomail.com; s=zohoarc; b=iKaa0u34e3CB3b7AFsvermhnTRo+T5R+CjS+F5mywgmxHZf9y+eBsrFFK1LvkEOeQS/+/1gGTp0N7ws6FODIR06Vqbe+Y6TRirnn/1q/BiIcf62Mm/Vrn4XYHQVl0oP+dgKREoltzQdGL0sPYnPCFUCwXhXBsYTiij2FJ+tBqdY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426383; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=37Oa1Q6Q3bF0gL9Um9Xifn0V/D4ohTtQq5asniTUIIY=; b=MWbS2U6+WXO7xFfdqd9pr7XfGEA+87BGHu03gwBK1suKKLiWWpwtwsd4iLSOgqu9Sw5lXHHB9BhJ+/UuImsUOtvTBM8W5JVcnStvUnB134A9YGYDRrT8mZyywDi1C7XAEysaXh1WK7WcOfMX2xHzp/2ksob/BbgXDh3j9mCyjuc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426383588433.0318247596963; Mon, 7 Aug 2023 09:39:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EZ-0007Yv-Mh; Mon, 07 Aug 2023 12:37:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EO-00076J-GD for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:22 -0400 Received: from mail-pl1-x632.google.com ([2607:f8b0:4864:20::632]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EM-0002iJ-NP for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:20 -0400 Received: by mail-pl1-x632.google.com with SMTP id d9443c01a7336-1bbf8cb694aso40640755ad.3 for ; Mon, 07 Aug 2023 09:37:18 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426237; x=1692031037; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=37Oa1Q6Q3bF0gL9Um9Xifn0V/D4ohTtQq5asniTUIIY=; b=GCKh8Cay5DJtgXhZ5sxRPiapN3ly1+VFPoH4828ht5vYjyDxgaj7/svl6v958AtbtL xA4aHW7bQyqg6E76O6+n1d+qc9bYRZNcuplLnEFlxklqCpKYrMrbD49PjzvzCStSCU4f c7Tqpkphb3jvlKxUTveOxzpGw4LtAZ1bV/9Qa3bAA2sWAgrdNa71lgLpU/jfTHiESNMr +XqVUMbfcPKRqkDNCF3jkEyx9gTySEx91Xb5+jCpk+Gt42EqsnsWEJPos8dMX+OgDrve 1X3x0sMyqKpkYcOcwbCYJaX1wPl3k1RB2qsK9OJb9eJ+FbsZEK+8gA1fnEYKAgTC1Voa JwTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426237; x=1692031037; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=37Oa1Q6Q3bF0gL9Um9Xifn0V/D4ohTtQq5asniTUIIY=; b=DVq+3sHACpgPpfCs2Dj8pwTUenAvM6M/gKM/3fpHJnwuyF/a1bmQ9ECyp3q0LMhUVv YwsE5JtKKCRns2sjdt6syyBaGKbUtE1dzWdhN06n6EQDikS8S/P1r71Xm5STk91LMW1n CPEKFqF6P/GrpFkWwPY+pnYJL4EiVAdkt+HngIFGVh418doww9j2QUcJVEwHaBmo+5Ro zvsvo7F2Tz+G89Nen9v2IYTm+SAIfvHheohFvA+Xmxg9hdlm9y4Flfe4emnZv4zVWWcc Vj8J8YCtlz6gqNH3rF+JigR09mWW38E3a6rDlmCjApZko1icDNqSrtVsvWf3+E31/y/p 2jfQ== X-Gm-Message-State: AOJu0Yw0RU0gqNyHFvqGXy8uLzf3OA+jP9zCj22iyeNQbZeEN7SezLq8 nK7WEU2/KMRGWBRUxw3Q0/26HLL5J6zgGci2Lcc= X-Google-Smtp-Source: AGHT+IGkHKdo+Is/br6rKfETposGU4axBth0BVSSrPBJ0FYACOPR5n1CIriTNQ3UHGwAABiEKyAckg== X-Received: by 2002:a17:902:d3c5:b0:1aa:d971:4623 with SMTP id w5-20020a170902d3c500b001aad9714623mr9888148plb.38.1691426237352; Mon, 07 Aug 2023 09:37:17 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de Subject: [PATCH for-8.1 v10 12/14] linux-user: Consolidate guest bounds check in probe_guest_base Date: Mon, 7 Aug 2023 09:37:03 -0700 Message-Id: <20230807163705.9848-13-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::632; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x632.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426384366100001 Content-Type: text/plain; charset="utf-8" The three sets of checks are identical, logically. Signed-off-by: Richard Henderson Reviewed-by: Alex Benn=C3=A9e Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 50 +++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 400af4a4c0..484ab7131a 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2527,25 +2527,6 @@ static void pgb_have_guest_base(const char *image_na= me, abi_ulong guest_loaddr, exit(EXIT_FAILURE); } =20 - /* Sanity check the guest binary. */ - if (reserved_va) { - if (guest_hiaddr > reserved_va) { - error_report("%s: requires more than reserved virtual " - "address space (0x%" PRIx64 " > 0x%lx)", - image_name, (uint64_t)guest_hiaddr, reserved_va); - exit(EXIT_FAILURE); - } - } else { -#if HOST_LONG_BITS < TARGET_ABI_BITS - if ((guest_hiaddr - guest_base) > ~(uintptr_t)0) { - error_report("%s: requires more virtual address space " - "than the host can provide (0x%" PRIx64 ")", - image_name, (uint64_t)guest_hiaddr + 1 - guest_ba= se); - exit(EXIT_FAILURE); - } -#endif - } - /* * Expand the allocation to the entire reserved_va. * Exclude the mmap_min_addr hole. @@ -2696,13 +2677,6 @@ static void pgb_static(const char *image_name, abi_u= long orig_loaddr, uintptr_t offset =3D 0; uintptr_t addr; =20 - if (hiaddr !=3D orig_hiaddr) { - error_report("%s: requires virtual address space that the " - "host cannot provide (0x%" PRIx64 ")", - image_name, (uint64_t)orig_hiaddr + 1); - exit(EXIT_FAILURE); - } - loaddr &=3D -align; if (HI_COMMPAGE) { /* @@ -2768,13 +2742,6 @@ static void pgb_reserved_va(const char *image_name, = abi_ulong guest_loaddr, int flags =3D MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE; void *addr, *test; =20 - if (guest_hiaddr > reserved_va) { - error_report("%s: requires more than reserved virtual " - "address space (0x%" PRIx64 " > 0x%lx)", - image_name, (uint64_t)guest_hiaddr, reserved_va); - exit(EXIT_FAILURE); - } - /* Widen the "image" to the entire reserved address space. */ pgb_static(image_name, 0, reserved_va, align); =20 @@ -2801,6 +2768,23 @@ void probe_guest_base(const char *image_name, abi_ul= ong guest_loaddr, /* In order to use host shmat, we must be able to honor SHMLBA. */ uintptr_t align =3D MAX(SHMLBA, qemu_host_page_size); =20 + /* Sanity check the guest binary. */ + if (reserved_va) { + if (guest_hiaddr > reserved_va) { + error_report("%s: requires more than reserved virtual " + "address space (0x%" PRIx64 " > 0x%lx)", + image_name, (uint64_t)guest_hiaddr, reserved_va); + exit(EXIT_FAILURE); + } + } else { + if (guest_hiaddr !=3D (uintptr_t)guest_hiaddr) { + error_report("%s: requires more virtual address space " + "than the host can provide (0x%" PRIx64 ")", + image_name, (uint64_t)guest_hiaddr + 1); + exit(EXIT_FAILURE); + } + } + if (have_guest_base) { pgb_have_guest_base(image_name, guest_loaddr, guest_hiaddr, align); } else if (reserved_va) { --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426334; cv=none; d=zohomail.com; s=zohoarc; b=EqyhHhdd+I/nG4qapV/6IalAkJ11o2x+rdeJthpfJo2wsOEgKotx+IdZCc49c6+gbQCxup8juf3yXoeoAuAi0TOxhiCPP2LVT4ZA15ylvGyPXWtpuwjhyHGhsI7E3Jqm4qT5pT8p/Pq5J5hvcY15F0bwGI7y4i5VZ3iAu6zoAEI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426334; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=UWcQY33lfMI5vcNDVB1diRmeJ4ckk4q/UyqRf5tZgVY=; b=Gr2d82w0aUW64bPDkbEDAf2cOAJ4UBsIfbN++Qwa2I6AzfkhGT++BR8lgZn771V7t14tKOq58B56LRHdfaYakdgm2b+5YFFd9Tkiskfx3Lok8TX6HQsR7H98dXN5R1WgAndytC8M6dA5tkeqZUd/Q9abn3PmBfxGmp7PR6FpDXk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426334344728.7676200313168; Mon, 7 Aug 2023 09:38:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EY-0007Sh-7H; Mon, 07 Aug 2023 12:37:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EP-00076Q-JA for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:22 -0400 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EN-0002iU-Jv for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:21 -0400 Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-6877eb31261so3388623b3a.1 for ; Mon, 07 Aug 2023 09:37:19 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426238; x=1692031038; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UWcQY33lfMI5vcNDVB1diRmeJ4ckk4q/UyqRf5tZgVY=; b=LMyuvnoaPk7Eh6a/D9KwaDC3vjgvh6QhJwhQedxikjJP/0QmMxtb6PKIOmhuoUdwDA e8NSLhRvjO1DkaiAy8PtaOFVv/Ft3Hqe06/yOaayeTM/Y3sxyPT59ZVIGa9orrz7d9wG jA6y/GZ7rhzvmDyXXWDGhGmrOdNOn/MfH+ZV6zIxSS39oH8vlGSI2Q8Gfc3RNZ0CXvol cHhTAS2WV4kyB4FtJCn/0luqtphtZRNIbLrJ2HfnQAPDuIJu3Obc4/iyohhnfEpegJpy 4if7EGLBwsh6jGV3V8rRBS6a2bDnbIOt+8Opl8bv8adBxlOPgDOxQgYJLMxAH2bAW6/+ 5SMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426238; x=1692031038; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UWcQY33lfMI5vcNDVB1diRmeJ4ckk4q/UyqRf5tZgVY=; b=Z75L19R6Uam45UE3cSeHlJ2eWCEqu6pVHXisktLbIf+1jw9FUQppE+6Pg5vOJ7NcVX r7+gksbTM/xZ/x7fIAOaj+LwIZ+QTqEFqNC0i6qQVN7BCCKZMBt9E3XGmjOwVo+7oB4H teUeGdF4DJwQJTaNlyUsrtBiHjazCOOUOhNudpQ8v1/QpJBpBuryhqi3Zzfiackx7cYO yppW7H3KPlg4/STrCrEFAzvx8ImmpQRS6bMWu63pvn4suMxenGTMUP73VpQ3UcgeQF1U TohuVdRM9fqZy1ViZ7pQ6GSM0BVYJWQyT15Y6RT9qOgyuzgaNgKk/Hj5FxoaUdSVt6GT ATsw== X-Gm-Message-State: AOJu0YyoaxwI2ExXJdLWzLCtS4E6xwLjJ2quObXUuWzO1V1MMdLJkdM5 j0pAT6uL00nKRTV/XfWwq217KmIApY21vC61Hzc= X-Google-Smtp-Source: AGHT+IEfEFXH9G4NDAHTjnZmnvn/CYn3uxvgzl7Dej5uSmyiuXeQzJlK+bVBxYtNDt8LUkfh0Ovxfw== X-Received: by 2002:a17:902:f68c:b0:1b8:9044:b8ae with SMTP id l12-20020a170902f68c00b001b89044b8aemr11576832plg.11.1691426238101; Mon, 07 Aug 2023 09:37:18 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de Subject: [PATCH for-8.1 v10 13/14] linux-user: Rewrite fixed probe_guest_base Date: Mon, 7 Aug 2023 09:37:04 -0700 Message-Id: <20230807163705.9848-14-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::434; envelope-from=richard.henderson@linaro.org; helo=mail-pf1-x434.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426341677100001 Content-Type: text/plain; charset="utf-8" Create a set of subroutines to collect a set of guest addresses, all of which must be mappable on the host. Use this within the renamed pgb_fixed subroutine to validate the user's choice of guest_base specified by the -B command-line option. Signed-off-by: Richard Henderson Reviewed-by: Alex Benn=C3=A9e Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 189 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 162 insertions(+), 27 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 484ab7131a..33c74be3af 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2506,6 +2506,158 @@ static abi_ulong create_elf_tables(abi_ulong p, int= argc, int envc, #endif #endif =20 +/** + * pgb_try_mmap: + * @addr: host start address + * @addr_last: host last address + * @keep: do not unmap the probe region + * + * Return 1 if [@addr, @addr_last] is not mapped in the host, + * return 0 if it is not available to map, and -1 on mmap error. + * If @keep, the region is left mapped on success, otherwise unmapped. + */ +static int pgb_try_mmap(uintptr_t addr, uintptr_t addr_last, bool keep) +{ + size_t size =3D addr_last - addr + 1; + void *p =3D mmap((void *)addr, size, PROT_NONE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_NORESERVE | MAP_FIXED_NOREPLACE, -1, 0); + int ret; + + if (p =3D=3D MAP_FAILED) { + return errno =3D=3D EEXIST ? 0 : -1; + } + ret =3D p =3D=3D (void *)addr; + if (!keep || !ret) { + munmap(p, size); + } + return ret; +} + +/** + * pgb_try_mmap_skip_brk(uintptr_t addr, uintptr_t size, uintptr_t brk) + * @addr: host address + * @size: size + * @brk: host brk + * + * Like pgb_try_mmap, but additionally reserve some memory following brk. + */ +static int pgb_try_mmap_skip_brk(uintptr_t addr, uintptr_t addr_last, + uintptr_t brk, bool keep) +{ + uintptr_t brk_last =3D brk + 16 * MiB - 1; + + /* Do not map anything close to the host brk. */ + if (addr <=3D brk_last && brk <=3D addr_last) { + return 0; + } + return pgb_try_mmap(addr, addr_last, keep); +} + +/** + * pgb_try_mmap_set: + * @ga: set of guest addrs + * @base: guest_base + * @brk: host brk + * + * Return true if all @ga can be mapped by the host at @base. + * On success, retain the mapping at index 0 for reserved_va. + */ + +typedef struct PGBAddrs { + uintptr_t bounds[3][2]; /* start/last pairs */ + int nbounds; + bool with_null_page; +} PGBAddrs; + +static bool pgb_try_mmap_set(const PGBAddrs *ga, uintptr_t base, uintptr_t= brk) +{ + for (int i =3D ga->nbounds - 1; i >=3D 0; --i) { + if (pgb_try_mmap_skip_brk(ga->bounds[i][0] + base, + ga->bounds[i][1] + base, + brk, i =3D=3D 0 && reserved_va) <=3D 0) { + return false; + } + } + return true; +} + +/** + * pgb_addr_set: + * @ga: output set of guest addrs + * @guest_loaddr: guest image low address + * @guest_loaddr: guest image high address + * @identity: create for identity mapping + * + * Fill in @ga with the image, COMMPAGE and NULL page. + */ +static bool pgb_addr_set(PGBAddrs *ga, abi_ulong guest_loaddr, + abi_ulong guest_hiaddr, bool try_identity) +{ + int n; + + /* + * With a low commpage, or a guest mapped very low, + * we may not be able to use the identity map. + */ + if (try_identity) { + if (LO_COMMPAGE !=3D -1 && LO_COMMPAGE < mmap_min_addr) { + return false; + } + if (guest_loaddr !=3D 0 && guest_loaddr < mmap_min_addr) { + return false; + } + } + + memset(ga, 0, sizeof(*ga)); + n =3D 0; + + if (reserved_va) { + ga->bounds[n][0] =3D try_identity ? mmap_min_addr : 0; + ga->bounds[n][1] =3D reserved_va; + n++; + /* LO_COMMPAGE and NULL handled by reserving from 0. */ + } else { + /* Add any LO_COMMPAGE or NULL page. */ + if (LO_COMMPAGE !=3D -1) { + ga->bounds[n][0] =3D 0; + ga->bounds[n][1] =3D LO_COMMPAGE + TARGET_PAGE_SIZE - 1; + n++; + } else if (!try_identity) { + ga->bounds[n][0] =3D 0; + ga->bounds[n][1] =3D TARGET_PAGE_SIZE - 1; + n++; + } + + /* Add the guest image for ET_EXEC. */ + if (guest_loaddr) { + ga->bounds[n][0] =3D guest_loaddr; + ga->bounds[n][1] =3D guest_hiaddr; + n++; + } + } + + /* + * Temporarily disable + * "comparison is always false due to limited range of data type" + * due to comparison between unsigned and (possible) 0. + */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" + + /* Add any HI_COMMPAGE not covered by reserved_va. */ + if (reserved_va < HI_COMMPAGE) { + ga->bounds[n][0] =3D HI_COMMPAGE & qemu_host_page_mask; + ga->bounds[n][1] =3D HI_COMMPAGE + TARGET_PAGE_SIZE - 1; + n++; + } + +#pragma GCC diagnostic pop + + ga->nbounds =3D n; + return true; +} + static void pgb_fail_in_use(const char *image_name) { error_report("%s: requires virtual address space that is in use " @@ -2514,33 +2666,21 @@ static void pgb_fail_in_use(const char *image_name) exit(EXIT_FAILURE); } =20 -static void pgb_have_guest_base(const char *image_name, abi_ulong guest_lo= addr, - abi_ulong guest_hiaddr, long align) +static void pgb_fixed(const char *image_name, uintptr_t guest_loaddr, + uintptr_t guest_hiaddr, uintptr_t align) { - const int flags =3D MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE; - void *addr, *test; + PGBAddrs ga; + uintptr_t brk =3D (uintptr_t)sbrk(0); =20 if (!QEMU_IS_ALIGNED(guest_base, align)) { fprintf(stderr, "Requested guest base %p does not satisfy " - "host minimum alignment (0x%lx)\n", + "host minimum alignment (0x%" PRIxPTR ")\n", (void *)guest_base, align); exit(EXIT_FAILURE); } =20 - /* - * Expand the allocation to the entire reserved_va. - * Exclude the mmap_min_addr hole. - */ - if (reserved_va) { - guest_loaddr =3D (guest_base >=3D mmap_min_addr ? 0 - : mmap_min_addr - guest_base); - guest_hiaddr =3D reserved_va; - } - - /* Reserve the address space for the binary, or reserved_va. */ - test =3D g2h_untagged(guest_loaddr); - addr =3D mmap(test, guest_hiaddr - guest_loaddr + 1, PROT_NONE, flags,= -1, 0); - if (test !=3D addr) { + if (!pgb_addr_set(&ga, guest_loaddr, guest_hiaddr, !guest_base) + || !pgb_try_mmap_set(&ga, guest_base, brk)) { pgb_fail_in_use(image_name); } } @@ -2786,7 +2926,7 @@ void probe_guest_base(const char *image_name, abi_ulo= ng guest_loaddr, } =20 if (have_guest_base) { - pgb_have_guest_base(image_name, guest_loaddr, guest_hiaddr, align); + pgb_fixed(image_name, guest_loaddr, guest_hiaddr, align); } else if (reserved_va) { pgb_reserved_va(image_name, guest_loaddr, guest_hiaddr, align); } else if (guest_loaddr) { @@ -2797,13 +2937,8 @@ void probe_guest_base(const char *image_name, abi_ul= ong guest_loaddr, =20 /* Reserve and initialize the commpage. */ if (!init_guest_commpage()) { - /* - * With have_guest_base, the user has selected the address and - * we are trying to work with that. Otherwise, we have selected - * free space and init_guest_commpage must succeeded. - */ - assert(have_guest_base); - pgb_fail_in_use(image_name); + /* We have already probed for the commpage being free. */ + g_assert_not_reached(); } =20 assert(QEMU_IS_ALIGNED(guest_base, align)); --=20 2.34.1 From nobody Thu Oct 31 23:03:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1691426514; cv=none; d=zohomail.com; s=zohoarc; b=K9Yy4UiJWJPDZdsOxRVnILjJC4rW3zLF/E1PHwg5V0P5s1UYZ5Deqt3P93BIbBi++e9fCJOkGzSJQLhyu9Rwh2aw8PzMjW1PjnL5B1HJrn6wSeENFvkN+sHgKsNEzfxCWBV8weHyM06scgltqtR7uzFAJkOijiGfXiCcQ2eVzOE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1691426514; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=2KKkyXS5jRgs+egnpTlRzEnIYCcJirPHC6HFXR682UI=; b=DAWDl+KMEQTa7BHlHJg0QxvgeV6MRrzsLfRG+0Xy+h7H+5kMyId++J/b1thl/YlyIf84KkyDMBRzmx9unJ/d15UoARAyPTnFPCzfTdZsU2U0tnV4xqehI7vWx+568h9KCd3xAAQW14Gkdw2qjoE5A6XNgphBnggNHhu12YsWXbA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1691426514905723.0259082737366; Mon, 7 Aug 2023 09:41:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qT3EX-0007QR-JZ; Mon, 07 Aug 2023 12:37:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qT3EQ-00076o-Ke for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:22 -0400 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qT3EO-0002ig-Bg for qemu-devel@nongnu.org; Mon, 07 Aug 2023 12:37:22 -0400 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-1b9c5e07c1bso42278575ad.2 for ; Mon, 07 Aug 2023 09:37:19 -0700 (PDT) Received: from stoup.. ([2602:47:d490:6901:e306:567a:e0a1:341]) by smtp.gmail.com with ESMTPSA id l6-20020a170902d34600b001b9df8f14d7sm7119837plk.267.2023.08.07.09.37.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Aug 2023 09:37:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1691426239; x=1692031039; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2KKkyXS5jRgs+egnpTlRzEnIYCcJirPHC6HFXR682UI=; b=dtwX2AuAhgsFHuE8mkaF6mD16xLgxmQeqyAqMH/P6CGJ6DhMLPwVk0/nlj90OpvtYn 0krER0vFjks8+h4KKd0b9PE1X/Adtrhc8JTOhWFRTHIGdcq5TfL/No+XAlIczSbiREEO IRBxZvfvqFtiv71Sa+AhxLvN3eaBoukzw3f6hE5/w3Wc/12eyFz5rKeW4lLMb2gR040G UKe4HMAbAn6yIPFvEd+9NrpqWaSqlUZmSS4xsWGDXFElz+wfiNNbDx4QpqUd2U6vwEM7 rlbGODJEDP8qC1KltgDxBp/hD1cRX4u1yikbmVkoEvKgZdjDlRDsXcHFX+aI5CoCeJ7b rjLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691426239; x=1692031039; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2KKkyXS5jRgs+egnpTlRzEnIYCcJirPHC6HFXR682UI=; b=i42TLdoX7/n6h9BYgl1ZnjDhfcLvKwLec1CisyFKPOgVZseCVkzNMLLM+cfg3u86d3 s/I+pww4zq0izku/uCd7m94aDBAPKAoxRWWHq+ElqMMQGgKcX2UNehbsZapxHQ5WkHZ+ VAzAffbUoN6r/vuz4Z6DWwxQCQjWJLHvERhCO1LXM8BO9KKXBuKY096wBE2YRPd7n61U bblds2P0KIu8Aod8di8FIpRJb+ty8uHX69xmUOcjaYS3dxhxEpQpydKXAMm/taFRW/jo V3KFE1nanZF/RcLWQJTRA7vIIl82ozrQaUXWkcy5NlkYyFvkmz1aE7eyi2ICKg6AgdK2 JGCw== X-Gm-Message-State: AOJu0Yx336DluZ5ZIiqyGQkyGNtrp8/7qbwJ2PM3+m7MWUeej538Zit7 M/Aq7XvWrUedhfQ7frknKBEm4SzsrJ9azUzkwoQ= X-Google-Smtp-Source: AGHT+IGJsRt4lQKirJfJ0KXYKftdVvCHvj4C3a3eHQ8gdDQO4OImHKu0qqsS5giVeVDup8ZGchY1VQ== X-Received: by 2002:a17:902:7604:b0:1b9:cb8b:3bd3 with SMTP id k4-20020a170902760400b001b9cb8b3bd3mr10515345pll.31.1691426239003; Mon, 07 Aug 2023 09:37:19 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu, deller@gmx.de Subject: [PATCH for-8.1 v10 14/14] linux-user: Rewrite non-fixed probe_guest_base Date: Mon, 7 Aug 2023 09:37:05 -0700 Message-Id: <20230807163705.9848-15-richard.henderson@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230807163705.9848-1-richard.henderson@linaro.org> References: <20230807163705.9848-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::634; envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x634.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1691426516068100005 Content-Type: text/plain; charset="utf-8" Use pgb_addr_set to probe for all of the guest addresses, not just the main executable. Handle the identity map specially and separately from the search. If /proc/self/maps is available, utilize the full power of the interval tree search, rather than a linear search through the address list. If /proc/self/maps is not available, increase the skip between probes so that we do not probe every single page of the host address space. Choose 1 MiB for 32-bit hosts (max 4k probes) and 1 GiB for 64-bit hosts (possibly a large number of probes, but the large step makes it more likely to find empty space quicker). Signed-off-by: Richard Henderson Reviewed-by: Alex Benn=C3=A9e Tested-by: Alex Benn=C3=A9e --- linux-user/elfload.c | 311 ++++++++++++++++--------------------------- 1 file changed, 115 insertions(+), 196 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 33c74be3af..ffea900308 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2686,220 +2686,143 @@ static void pgb_fixed(const char *image_name, uin= tptr_t guest_loaddr, } =20 /** - * pgd_find_hole_fallback: potential mmap address - * @guest_size: size of available space - * @brk: location of break - * @align: memory alignment + * pgb_find_fallback: * - * This is a fallback method for finding a hole in the host address - * space if we don't have the benefit of being able to access - * /proc/self/map. It can potentially take a very long time as we can - * only dumbly iterate up the host address space seeing if the - * allocation would work. + * This is a fallback method for finding holes in the host address space + * if we don't have the benefit of being able to access /proc/self/map. + * It can potentially take a very long time as we can only dumbly iterate + * up the host address space seeing if the allocation would work. */ -static uintptr_t pgd_find_hole_fallback(uintptr_t guest_size, uintptr_t br= k, - long align, uintptr_t offset) +static uintptr_t pgb_find_fallback(const PGBAddrs *ga, uintptr_t align, + uintptr_t brk) { - uintptr_t base; + /* TODO: come up with a better estimate of how much to skip. */ + uintptr_t skip =3D sizeof(uintptr_t) =3D=3D 4 ? MiB : GiB; =20 - /* Start (aligned) at the bottom and work our way up */ - base =3D ROUND_UP(mmap_min_addr, align); - - while (true) { - uintptr_t align_start, end; - align_start =3D ROUND_UP(base, align); - end =3D align_start + guest_size + offset; - - /* if brk is anywhere in the range give ourselves some room to gro= w. */ - if (align_start <=3D brk && brk < end) { - base =3D brk + (16 * MiB); - continue; - } else if (align_start + guest_size < align_start) { - /* we have run out of space */ + for (uintptr_t base =3D skip; ; base +=3D skip) { + base =3D ROUND_UP(base, align); + if (pgb_try_mmap_set(ga, base, brk)) { + return base; + } + if (base >=3D -skip) { return -1; - } else { - int flags =3D MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE | - MAP_FIXED_NOREPLACE; - void * mmap_start =3D mmap((void *) align_start, guest_size, - PROT_NONE, flags, -1, 0); - if (mmap_start !=3D MAP_FAILED) { - munmap(mmap_start, guest_size); - if (mmap_start =3D=3D (void *) align_start) { - return (uintptr_t) mmap_start + offset; - } - } - base +=3D qemu_host_page_size; } } } =20 -/* Return value for guest_base, or -1 if no hole found. */ -static uintptr_t pgb_find_hole(uintptr_t guest_loaddr, uintptr_t guest_siz= e, - long align, uintptr_t offset) +static uintptr_t pgb_try_itree(const PGBAddrs *ga, uintptr_t base, + IntervalTreeRoot *root) { - IntervalTreeRoot *maps; - IntervalTreeNode *iter; - uintptr_t this_start, this_end, next_start, brk; - intptr_t ret =3D -1; + for (int i =3D ga->nbounds - 1; i >=3D 0; --i) { + uintptr_t s =3D base + ga->bounds[i][0]; + uintptr_t l =3D base + ga->bounds[i][1]; + IntervalTreeNode *n; + + if (l < s) { + /* Wraparound. Skip to advance S to 0. */ + return -s; + } + + n =3D interval_tree_iter_first(root, s, l); + if (n !=3D NULL) { + /* Conflict. Skip to advance S to LAST + 1. */ + return n->last - s + 1; + } + } + return 0; /* success */ +} + +static uintptr_t pgb_find_itree(const PGBAddrs *ga, IntervalTreeRoot *root, + uintptr_t align, uintptr_t brk) +{ + uintptr_t last =3D mmap_min_addr; + uintptr_t base, skip; + + while (true) { + base =3D ROUND_UP(last, align); + if (base < last) { + return -1; + } + + skip =3D pgb_try_itree(ga, base, root); + if (skip =3D=3D 0) { + break; + } + + last =3D base + skip; + if (last < base) { + return -1; + } + } + + /* + * We've chosen 'base' based on holes in the interval tree, + * but we don't yet know if it is a valid host address. + * Because it is the first matching hole, if the host addresses + * are invalid we know there are no further matches. + */ + return pgb_try_mmap_set(ga, base, brk) ? base : -1; +} + +static void pgb_dynamic(const char *image_name, uintptr_t guest_loaddr, + uintptr_t guest_hiaddr, uintptr_t align) +{ + IntervalTreeRoot *root; + uintptr_t brk, ret; + PGBAddrs ga; =20 assert(QEMU_IS_ALIGNED(guest_loaddr, align)); =20 - maps =3D read_self_maps(); + /* Try the identity map first. */ + if (pgb_addr_set(&ga, guest_loaddr, guest_hiaddr, true)) { + brk =3D (uintptr_t)sbrk(0); + if (pgb_try_mmap_set(&ga, 0, brk)) { + guest_base =3D 0; + return; + } + } + + /* + * Rebuild the address set for non-identity map. + * This differs in the mapping of the guest NULL page. + */ + pgb_addr_set(&ga, guest_loaddr, guest_hiaddr, false); + + root =3D read_self_maps(); =20 /* Read brk after we've read the maps, which will malloc. */ brk =3D (uintptr_t)sbrk(0); =20 - if (!maps) { - return pgd_find_hole_fallback(guest_size, brk, align, offset); - } - - /* The first hole is before the first map entry. */ - this_start =3D mmap_min_addr; - - for (iter =3D interval_tree_iter_first(maps, 0, -1); - iter; - this_start =3D next_start, - iter =3D interval_tree_iter_next(iter, 0, -1)) { - MapInfo *info =3D container_of(iter, MapInfo, itree); - uintptr_t align_start, hole_size; - - this_end =3D info->itree.start; - next_start =3D info->itree.last + 1; - align_start =3D ROUND_UP(this_start + offset, align); - - /* Skip holes that are too small. */ - if (align_start >=3D this_end) { - continue; - } - hole_size =3D this_end - align_start; - if (hole_size < guest_size) { - continue; - } - - /* If this hole contains brk, give ourselves some room to grow. */ - if (this_start <=3D brk && brk < this_end) { - hole_size -=3D guest_size; - if (sizeof(uintptr_t) =3D=3D 8 && hole_size >=3D 1 * GiB) { - align_start +=3D 1 * GiB; - } else if (hole_size >=3D 16 * MiB) { - align_start +=3D 16 * MiB; - } else { - align_start =3D (this_end - guest_size) & -align; - if (align_start < this_start) { - continue; - } - } - } - - /* Record the lowest successful match. */ - if (ret < 0) { - ret =3D align_start; - } - /* If this hole contains the identity map, select it. */ - if (align_start <=3D guest_loaddr && - guest_loaddr + guest_size <=3D this_end) { - ret =3D 0; - } - /* If this hole ends above the identity map, stop looking. */ - if (this_end >=3D guest_loaddr) { - break; - } - } - free_self_maps(maps); - return ret; -} - -static void pgb_static(const char *image_name, abi_ulong orig_loaddr, - abi_ulong orig_hiaddr, long align) -{ - uintptr_t loaddr =3D orig_loaddr; - uintptr_t hiaddr =3D orig_hiaddr; - uintptr_t offset =3D 0; - uintptr_t addr; - - loaddr &=3D -align; - if (HI_COMMPAGE) { + if (!root) { + ret =3D pgb_find_fallback(&ga, align, brk); + } else { /* - * Extend the allocation to include the commpage. - * For a 64-bit host, this is just 4GiB; for a 32-bit host we - * need to ensure there is space bellow the guest_base so we - * can map the commpage in the place needed when the address - * arithmetic wraps around. + * Reserve the area close to the host brk. + * This will be freed with the rest of the tree. */ - if (sizeof(uintptr_t) =3D=3D 8 || loaddr >=3D 0x80000000u) { - hiaddr =3D UINT32_MAX; - } else { - offset =3D -(HI_COMMPAGE & -align); - } - } else if (LO_COMMPAGE !=3D -1) { - loaddr =3D MIN(loaddr, LO_COMMPAGE & -align); + IntervalTreeNode *b =3D g_new0(IntervalTreeNode, 1); + b->start =3D brk; + b->last =3D brk + 16 * MiB - 1; + interval_tree_insert(b, root); + + ret =3D pgb_find_itree(&ga, root, align, brk); + free_self_maps(root); } =20 - addr =3D pgb_find_hole(loaddr, hiaddr - loaddr + 1, align, offset); - if (addr =3D=3D -1) { - /* - * If HI_COMMPAGE, there *might* be a non-consecutive allocation - * that can satisfy both. But as the normal arm32 link base addre= ss - * is ~32k, and we extend down to include the commpage, making the - * overhead only ~96k, this is unlikely. - */ - error_report("%s: Unable to allocate %#zx bytes of " - "virtual address space", image_name, - (size_t)(hiaddr - loaddr)); - exit(EXIT_FAILURE); - } - - guest_base =3D addr; -} - -static void pgb_dynamic(const char *image_name, long align) -{ - /* - * The executable is dynamic and does not require a fixed address. - * All we need is a commpage that satisfies align. - * If we do not need a commpage, leave guest_base =3D=3D 0. - */ - if (HI_COMMPAGE) { - uintptr_t addr, commpage; - - /* 64-bit hosts should have used reserved_va. */ - assert(sizeof(uintptr_t) =3D=3D 4); - - /* - * By putting the commpage at the first hole, that puts guest_base - * just above that, and maximises the positive guest addresses. - */ - commpage =3D HI_COMMPAGE & -align; - addr =3D pgb_find_hole(commpage, -commpage, align, 0); - assert(addr !=3D -1); - guest_base =3D addr; - } -} - -static void pgb_reserved_va(const char *image_name, abi_ulong guest_loaddr, - abi_ulong guest_hiaddr, long align) -{ - int flags =3D MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE; - void *addr, *test; - - /* Widen the "image" to the entire reserved address space. */ - pgb_static(image_name, 0, reserved_va, align); - - /* osdep.h defines this as 0 if it's missing */ - flags |=3D MAP_FIXED_NOREPLACE; - - /* Reserve the memory on the host. */ - assert(guest_base !=3D 0); - test =3D g2h_untagged(0); - addr =3D mmap(test, reserved_va + 1, PROT_NONE, flags, -1, 0); - if (addr =3D=3D MAP_FAILED || addr !=3D test) { - error_report("Unable to reserve 0x%lx bytes of virtual address " - "space at %p (%s) for use as guest address space (che= ck your " - "virtual memory ulimit setting, mmap_min_addr or rese= rve less " - "using qemu-user's -R option)", - reserved_va + 1, test, strerror(errno)); + if (ret =3D=3D -1) { + int w =3D TARGET_LONG_BITS / 4; + + error_report("%s: Unable to find a guest_base to satisfy all " + "guest address mapping requirements", image_name); + + for (int i =3D 0; i < ga.nbounds; ++i) { + error_printf(" %0*" PRIx64 "-%0*" PRIx64 "\n", + w, (uint64_t)ga.bounds[i][0], + w, (uint64_t)ga.bounds[i][1]); + } exit(EXIT_FAILURE); } + guest_base =3D ret; } =20 void probe_guest_base(const char *image_name, abi_ulong guest_loaddr, @@ -2927,12 +2850,8 @@ void probe_guest_base(const char *image_name, abi_ul= ong guest_loaddr, =20 if (have_guest_base) { pgb_fixed(image_name, guest_loaddr, guest_hiaddr, align); - } else if (reserved_va) { - pgb_reserved_va(image_name, guest_loaddr, guest_hiaddr, align); - } else if (guest_loaddr) { - pgb_static(image_name, guest_loaddr, guest_hiaddr, align); } else { - pgb_dynamic(image_name, align); + pgb_dynamic(image_name, guest_loaddr, guest_hiaddr, align); } =20 /* Reserve and initialize the commpage. */ --=20 2.34.1