From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C3185C433EF for ; Mon, 4 Oct 2021 07:51:20 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6D07E6137C for ; Mon, 4 Oct 2021 07:51:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 6D07E6137C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=vivier.eu Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=nongnu.org Received: from localhost ([::1]:48484 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mXIkp-0002x5-Kv for qemu-devel@archiver.kernel.org; Mon, 04 Oct 2021 03:51:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44040) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mXIeK-00045H-Or for qemu-devel@nongnu.org; Mon, 04 Oct 2021 03:44:36 -0400 Received: from mout.kundenserver.de ([212.227.126.187]:52663) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mXIeI-0004oc-VO for qemu-devel@nongnu.org; Mon, 04 Oct 2021 03:44:36 -0400 Received: from quad ([82.142.3.114]) by mrelayeu.kundenserver.de (mreue012 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MtPzy-1mnC6Q0Zoc-00upgM; Mon, 04 Oct 2021 09:44:24 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Subject: [PULL 01/26] linux-user: Add infrastructure for a signal trampoline page Date: Mon, 4 Oct 2021 09:43:56 +0200 Message-Id: <20211004074421.3141222-2-laurent@vivier.eu> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211004074421.3141222-1-laurent@vivier.eu> References: <20211004074421.3141222-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Provags-ID: V03:K1:sbMmJtEOpzyb3l+1hVe+4VKoHMWfR4gr/+BEHgNtQw6BC98+dVM lFkCDnQAOgKv2lx2IY2LsQb5ZAHWF7HeITi5cvfmiFD6lMHZ6dpwZAMtM6e96w0Yn7GVGVt ynozdgOIAuecb9wQa+EzLkyn7462tg3cRfJfRift7p/KCCPEdsJRtpMlk7+HtHzoH1PHbKS Q2d0MsOxlyVbUqmvYMYjA== X-UI-Out-Filterresults: notjunk:1;V03:K0:xOWXO5YmaL4=:8n9JHufyYISypNDlKgbI5B xu88iX0ebeFjKmoYPbYhK4xfc3QOboyKz8Cjw9iEyn5pJhwhj6dIuTShu6l9fwWpisstZn6o2 svTPcXy/0sVMd2KjOYqLoByA8E0vxSoB5WmBK5h6iklCdr9wNJpOMdIIMLLwsIrTzjzyJqSmn 305lT1zIkD87hr0rx69yY3ASZoQNkctXFehvZfYTBhl5rKE+eAGXHDjcgTGvX/cvoZUHcc0Cf vDX+Ho0kWynbO2y8tEWiLWocppIyIwisE/ykrx5bkg/+x/ZoA8vYiQH1l2kOWzTplkUtT1CbK 7Ui+BFawSatgaq+4k3VAAqriBaMbtoaOT3D1gC8IMxYZcjStNBoPtafkGTiKHjog5nthrMVBI b/Iyzf9eas/e/vf0X40MnVQLXQiQLURVtTkr/RnXTmJgL9CQr73TIGW6zPahXysPnqZEx4aYs pfOaDJfcgtRPTSzuSOsL066A3242Pr7kWK75bDe55rudymNV7uVHGGGglk28GgHO+dkbYjW/z f/tPhq6a0DALTcse0CRRxVucuq4VadzHDJByBegqVp/3r4q7tnIzx7kvMzn+cs9HPbRaEQCry wyJijpNvaNJq0Lp7S76eJKm689p+8fEtV9CctnXHowgSUIgzKymFXnQMwrYy5Xj/ro6eqQ4dV fqUhZ7hk+Ms/a8W46FxlfPUhr2nfBiHjneZtU+RqQ1Fyk28Y6r4AKJDb1pwmdzW4abrx+h4Xk s8gqAsdkkPWsRYXzLIijFI6cTnxgghYHEqcasg== Received-SPF: none client-ip=212.227.126.187; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Max Filippov , Laurent Vivier , Richard Henderson , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Peter Maydell Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Richard Henderson Allocate a page to hold the signal trampoline(s). Invoke a guest-specific hook to fill in the contents of the page before marking it read-execute again. Reviewed-by: Max Filippov Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Peter Maydell Signed-off-by: Richard Henderson Message-Id: <20210929130553.121567-2-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier --- linux-user/elfload.c | 18 ++++++++++++++++++ linux-user/signal-common.h | 6 ++++++ linux-user/signal.c | 3 +++ 3 files changed, 27 insertions(+) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 5f9e2141ad1e..459a26ef1d93 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -7,6 +7,7 @@ #include "qemu.h" #include "user-internals.h" +#include "signal-common.h" #include "loader.h" #include "user-mmap.h" #include "disas/disas.h" @@ -17,6 +18,7 @@ #include "qemu/units.h" #include "qemu/selfmap.h" #include "qapi/error.h" +#include "target_signal.h" #ifdef _ARCH_PPC64 #undef ARCH_DLINFO @@ -28,6 +30,10 @@ #undef ELF_ARCH #endif +#ifndef TARGET_ARCH_HAS_SIGTRAMP_PAGE +#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0 +#endif + #define ELF_OSABI ELFOSABI_SYSV /* from personality.h */ @@ -3249,6 +3255,18 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info) #endif } + /* + * TODO: load a vdso, which would also contain the signal trampolines. + * Otherwise, allocate a private page to hold them. + */ + if (TARGET_ARCH_HAS_SIGTRAMP_PAGE) { + abi_ulong tramp_page = target_mmap(0, TARGET_PAGE_SIZE, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, -1, 0); + setup_sigtramp(tramp_page); + target_mprotect(tramp_page, TARGET_PAGE_SIZE, PROT_READ | PROT_EXEC); + } + bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &elf_ex, info, (elf_interpreter ? &interp_info : NULL)); info->start_stack = bprm->p; diff --git a/linux-user/signal-common.h b/linux-user/signal-common.h index 79511becb4e7..7457f8025c47 100644 --- a/linux-user/signal-common.h +++ b/linux-user/signal-common.h @@ -20,6 +20,12 @@ #ifndef SIGNAL_COMMON_H #define SIGNAL_COMMON_H +/* Fallback addresses into sigtramp page. */ +extern abi_ulong default_sigreturn; +extern abi_ulong default_rt_sigreturn; + +void setup_sigtramp(abi_ulong tramp_page); + int on_sig_stack(unsigned long sp); int sas_ss_flags(unsigned long sp); abi_ulong target_sigsp(abi_ulong sp, struct target_sigaction *ka); diff --git a/linux-user/signal.c b/linux-user/signal.c index 203821645509..14d8fdfde152 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -35,6 +35,9 @@ static struct target_sigaction sigact_table[TARGET_NSIG]; static void host_signal_handler(int host_signum, siginfo_t *info, void *puc); +/* Fallback addresses into sigtramp page. */ +abi_ulong default_sigreturn; +abi_ulong default_rt_sigreturn; /* * System includes define _NSIG as SIGRTMAX + 1, -- 2.31.1