From patchwork Wed Nov 4 21:18:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883195 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CF4CEC388F9 for ; Thu, 5 Nov 2020 04:42:07 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 56E3A2083B for ; Thu, 5 Nov 2020 04:42:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="j4VOpZEo"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="Na6Nbg6/"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="YR40EJOn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 56E3A2083B Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=KIwE6SXVoXqAnu9GZDBOJr8LDw82I9mtaP8ND5hU9mc=; b=j4VOpZEoCtvRY3EBoYoUHTAK3 Cs+MKDM+3zdopUHfQsC2iWv0HCOQySNXXsT//9cxThrteeqXRM2PJtSCA0XbAlGP5iRVa/FGfBrL1 9iFM0vzzY46kxwFRb4uoi3pkiK8VKCxVdKkNifeL2X8S73V65BACK1kZtFIZXXNmz23/KUw+qR4ko Okc+CamSj0BQI27edbkvo6iVODdRLi5sFhajv4cQCL3Vd6T8rR770ZoxI6IHWzf0eyC9GlAI1LIcj vK7+764cPslb40k9wcF3fCBSzpcZXxUU2hq4AmGdZ9XNeEo4/MHArv6Y4vwWCDXsGmaLuefvUPm8Y DLcQLIibw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaX5U-0005en-Te; Thu, 05 Nov 2020 04:41:29 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7z-00016k-8t for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:59 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=zQ9ZG27PC4T2UhOkIr1ET2llXl/uqON3X+uZtU3Wp9k=; b=Na6Nbg6/jO8ZXEOSAQZqoSo6d8 gmpvh5tilimgHi/BRGBehOIbTc6APJwGCn0Qbnk2B2R8BOWtearvKydlctW/ZS/ZZ5sBpi3vhzs8F ghJdfWxftMnv9IKLeDLtIMhAnq61Wu/wQ04chnqRv69B3SK4T2X7HX+VEFYaAjhiaBpbMqVKAoDGf VwaDWFS2pNaJMRuvEv3P4eTl4aBpQlhupqDYsXao8K1Ey8pfTcYtHyRfqp7gNBP9K+1/th0mtAJYU 3ihFcAhQQniuZcWTnGDviKchTX+OHchwjmYR+Az/PVjzcFPwoJG2MQZPOHck4hXkTp6IzRt6sAzBA 4jRdgD9w==; Received: from mail-pg1-x54a.google.com ([2607:f8b0:4864:20::54a]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBk-0000oe-Qv for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:31 +0000 Received: by mail-pg1-x54a.google.com with SMTP id e16so14862574pgm.1 for ; Wed, 04 Nov 2020 13:19:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=zQ9ZG27PC4T2UhOkIr1ET2llXl/uqON3X+uZtU3Wp9k=; b=YR40EJOnUJ2wZbch+5OoWQK5WENv3OyA699VBIFzxMudtSDk4C38S0eVzjubGmrHu/ nqC+u2ZIHiFj38xUWsqYBMWz2t8QDc+6pkaJsRsop0Y2iCvp7weW97xtih2J+kwzY14c F3L9w7ZeUS7FLut89dGMDfYqsPDhs94dMFhQD6AehCea0cyyAoX+J2Gd5z+kRnp4pB85 P8Ghb5LaAuuYnUYjuRQ9of6vm0CtihDYtxAF9+pG2dF6G+fvjuW9rR2c1qlV5asctCXz 1md4nv3zWKgmZP1W08ZuXXNk1IGUZK1qIKaDD4O10kWUT+Y+RK3Q9Y7TcqnfyzExluBY tB0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=zQ9ZG27PC4T2UhOkIr1ET2llXl/uqON3X+uZtU3Wp9k=; b=IkXdQfc3/ACLhi6o35KdwoMWN/nkV2etWq2T2MxpeKtlbPhl4HS8x+0K0NVAAD+bNj 0AvP09Z/f2Nk1AS8m2VZAYuk76Oxbtyk4C2MCDQ/4bDR6+ZeGbK7ZqrKInmgrr47aaTv AO3oAa9Pbqw7/F6PrHDQXjAq652HKsBc9xPcShlKmz48Nv7d3do1mRPtFHBwWam67FKe PVVNpar8TF1PaajHGXpfax5/7ZFwj8thmNHEg2U+S+dyc53vq0iYIDOhIBZkHxDhqZLw 7em21+b0sx893YkXWvzj+Jv5QRAfS8gbfCbwJMVuc6RZQQRTXn/2EUdETphNocLkLtR1 vHZg== X-Gm-Message-State: AOAM5322fdYFKdVg46WnORkiYW2/GipIgFlQS/MBnCT+hkP8SVS4h4DM U2zrb7PgN6z+lV7uOK7zcnWX8mk= X-Google-Smtp-Source: ABdhPJwr/ZzAL7HuL7q2O5xmm55OgL/Kj2Okdcdj7UkpXExhKiueYv3WmnwMzwDaIEspkn8HEge6Xk8= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:a17:90a:1b8a:: with SMTP id w10mr5856017pjc.145.1604524700098; Wed, 04 Nov 2020 13:18:20 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:04 -0800 In-Reply-To: Message-Id: <8fed1621dcbf4d6de765e76e8bba37e22cc3868a.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 1/8] parisc: Drop parisc special case for __sighandler_t From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211929_082145_5B9A3CF5 X-CRM114-Status: GOOD ( 15.94 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Helge Deller I believe we can and *should* drop this parisc-specific typedef for __sighandler_t when compiling a 64-bit kernel. The reasons: 1. We don't have a 64-bit userspace yet, so nothing (on userspace side) can break. 2. Inside the Linux kernel, this is only used in kernel/signal.c, in function kernel_sigaction() where the signal handler is compared against SIG_IGN. SIG_IGN is defined as (__sighandler_t)1), so only the pointers are compared. 3. Even when a 64-bit userspace gets added at some point, I think __sighandler_t should be defined what it is: a function pointer struct. I compiled kernel/signal.c with and without the patch, and the produced code is identical in both cases. Signed-off-by: Helge Deller Signed-off-by: Peter Collingbourne Acked-by: "Eric W. Biederman" Reviewed-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/I21c43f21b264f339e3aa395626af838646f62d97 --- arch/parisc/include/uapi/asm/signal.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/arch/parisc/include/uapi/asm/signal.h b/arch/parisc/include/uapi/asm/signal.h index e605197b462c..d9c51769851a 100644 --- a/arch/parisc/include/uapi/asm/signal.h +++ b/arch/parisc/include/uapi/asm/signal.h @@ -85,16 +85,8 @@ struct siginfo; /* Type of a signal handler. */ -#if defined(__LP64__) -/* function pointers on 64-bit parisc are pointers to little structs and the - * compiler doesn't support code which changes or tests the address of - * the function in the little struct. This is really ugly -PB - */ -typedef char __user *__sighandler_t; -#else typedef void __signalfn_t(int); typedef __signalfn_t __user *__sighandler_t; -#endif typedef struct sigaltstack { void __user *ss_sp; From patchwork Wed Nov 4 21:18:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883297 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7D55BC00A89 for ; Thu, 5 Nov 2020 05:23:04 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 EED012083B for ; Thu, 5 Nov 2020 05:23:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="sr/XZYCy"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="rHdechiw"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="HbDTUve4" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EED012083B Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=yNNdTniwguf6kRfUyjG4c58bqsLdft3NPcTGmBnyamU=; b=sr/XZYCy8Vzv3MawIHcy1/Wz7 YYzU1pt4oz3MtwC8WXiSt21FAaRr6XUJFGO2s5UOgjm59mRUOT2L76t/wB5DcrUZDr26yG1tQkxlE eTHFMvyG0plisKLwTn0Hpc96dY5GCTXWQA4C/xFQ8odVgBw+1ahhwaMqlXZMkVqvkUrAUSBzeWCbz qu0Dielmg3SUv7LewCUnQMIXctIiwetM1BuIb1fDAb1NI4hGA+p9U0CxjwMNfk/92pXMGVhkl0EWD wqBZ7JtAcmd05SQ3dvRWH6fxnCS1RdUkCr24AtrRkDGwU7TdwHIGhmy4T+5ilBf4fP/Z1/ZE3WgQa 9sKJSfdGw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaXj0-0003tW-L1; Thu, 05 Nov 2020 05:22:18 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7w-00016k-6r for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:56 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=ylYV+FRxCY6p7eAm6CnIKwGDUr9mModfAMf52CohP6I=; b=rHdechiwuZReoGzvAko5fbPgTu YuGSyoq/oKVnSk9cLTs+Kl9U/0+yWB2dAu6I1q3Ksu+GnF4PqeKU0TRHSlQeiKgUtP29u+ygW2igC nOAalo4q8Jl1vREW8lMmuHgw0psQ8mbDQyB2k3oWqHPeg04AMe+Uhxg0bpd16nCmuVYxwqnlMRQcH Ih9pqraF616veDSQJrWL6Pf0w0VOt5z1FXdjQ9AyJv9dYK6qsqvkyUxMfPrq7420VQD0AbUH41CLg 40u+7oIxNMnAiM+T+Jjdql/RCOVflwV+aM97bezxHbt0qaRI2rSTvuqRvkzizZvGqOVjd3UspAffA 8W+EwGwA==; Received: from mail-pf1-x44a.google.com ([2607:f8b0:4864:20::44a]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBp-0000p1-GY for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:36 +0000 Received: by mail-pf1-x44a.google.com with SMTP id w79so17191pfc.14 for ; Wed, 04 Nov 2020 13:19:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=ylYV+FRxCY6p7eAm6CnIKwGDUr9mModfAMf52CohP6I=; b=HbDTUve4BGxc+g1JqNZ9J1NCh8VaK0Q7AYCH5rcm/DruBvruKhBy/I97IIt0nZEp+w pUjtl4Rbr+UZERwmWR6eTW1itBrXafa5B0dTQREApa++h/YzLU8THH3N93bby4SmsDVJ r+BYLN9rH1KXo3o/tAd8lWjjRjIZJ2v3xVoYwmVL9J3bm0+owypQWzr4X/aLbF6p59z6 9yqwgdTxQFRfxofEnEi5V989rCRLHfF8hBkwVO6v+eUOP6fCzhZnGRlOZ3fhKEfBsf2u oCAnEUfHwnOlLZhVZaaJ+lSlrDSxhVESRpHqT26iINjapfSVZT6YmwLrtdj+2NUEiIQi XuRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=ylYV+FRxCY6p7eAm6CnIKwGDUr9mModfAMf52CohP6I=; b=P9rJnPUj0K8JDS7c8grqH3xtVA8XeJVQFJcJttTXa4HU5G8GoD21XgKdnVVTayacun tyi7SNVKRQyYuIxytJglNSdfeXCmfaXfj5/wNzdI893c2sTeQu+H5CirHa1aJ9L/4wAm GKNjl2g5QL0A2h+Ks58IOQ6MJCMdkqTUpbUe8H5QB30CgInTZ8Hn1siXZ1wuB7EwDPYv OOUGVWgfMw9XvcdEfDo6xXeru59gq30DOUAxCZlnLBv50LpT7lbQMHRfjQI/iaQVkgyf IDrQhtyX3/QpMQUbmlBt/37njGVEcOfZR0FBFILBSA2ye9Df8/vNeKZUTYjHXdvdVABS oEFg== X-Gm-Message-State: AOAM531DtUEuCavKSj0wWk8QhoLozVB6z91Rsuj/Evrgr45sIi/8C+9Z sUhRw0wQXja01nASMNdEBRlX/Rk= X-Google-Smtp-Source: ABdhPJw4Gf+sPXFMB9HbjxkqGFJgpgBdVCc2LnEDuq3unX0ECkR9xLz59EE2ns5emauueCd/uNsz7/0= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:a17:90b:293:: with SMTP id az19mr682203pjb.1.1604524702368; Wed, 04 Nov 2020 13:18:22 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:05 -0800 In-Reply-To: Message-Id: <64c7ea2041dea52a9cc6f03fc3cf137c21fcc25a.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 2/8] parisc: start using signal-defs.h From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211933_704395_E8610BEB X-CRM114-Status: GOOD ( 12.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org We currently include signal-defs.h on all architectures except parisc. Make parisc fall in line. This will make maintenance easier once the flag bits are moved here. Signed-off-by: Peter Collingbourne Acked-by: Helge Deller Acked-by: "Eric W. Biederman" Link: https://linux-review.googlesource.com/id/If03a5135fb514fe96548fb74610e6c3586a04064 --- arch/parisc/include/uapi/asm/signal.h | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/arch/parisc/include/uapi/asm/signal.h b/arch/parisc/include/uapi/asm/signal.h index d9c51769851a..9e6f87bc8a73 100644 --- a/arch/parisc/include/uapi/asm/signal.h +++ b/arch/parisc/include/uapi/asm/signal.h @@ -68,14 +68,7 @@ #define MINSIGSTKSZ 2048 #define SIGSTKSZ 8192 - -#define SIG_BLOCK 0 /* for blocking signals */ -#define SIG_UNBLOCK 1 /* for unblocking signals */ -#define SIG_SETMASK 2 /* for setting the signal mask */ - -#define SIG_DFL ((__sighandler_t)0) /* default signal handling */ -#define SIG_IGN ((__sighandler_t)1) /* ignore signal */ -#define SIG_ERR ((__sighandler_t)-1) /* error return from signal */ +#include # ifndef __ASSEMBLY__ @@ -84,10 +77,6 @@ /* Avoid too many header ordering problems. */ struct siginfo; -/* Type of a signal handler. */ -typedef void __signalfn_t(int); -typedef __signalfn_t __user *__sighandler_t; - typedef struct sigaltstack { void __user *ss_sp; int ss_flags; From patchwork Wed Nov 4 21:18:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883381 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E981C00A89 for ; Thu, 5 Nov 2020 06:36:55 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 D40542071A for ; Thu, 5 Nov 2020 06:36:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="gTAVvSYa"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="ka6Pwxez"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="A+J1btA5" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D40542071A Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=vGCwZVsOihbV2yA2GgXaS42n+SHO33zGb+oYuauky4s=; b=gTAVvSYaMK4IS3JobHCPbkhL7 wY4qZEiTMYv39mtP9SiRw+C6+jU3TP5hdGwIC04o3LwiJ5TmhR/o398WwTV7nodTJ4X1ECHhw1BGL +cojeS+6D1jSZK8VNKX6rg7VrDAf9TuqL29Pct+GB3uBWr0S08fpTNqz6ESPlCrqN/4P2Pn5+haf/ WBokyz43NDpjtHAbzE/cBsLJSpw3SDvAbHbZgLN7enLW9TFYApb6joRvz634U6QUxr58K8mOGDGOb q33iy8wxGlRYv1Twf99yW+RT00k7FrEEF52tAMXacnghBKj446R7uA/TSZDgahM1jn8Yt4cyje9Qt xElTVABzQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaYs8-0007Io-HH; Thu, 05 Nov 2020 06:35:48 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7y-00016k-AK for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:58 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=CJJ0rjxW0WLgBGe7C8MxYBgWekK6/78/b2MUEp43O38=; b=ka6PwxezAs1paXtDgqGsjJpNrl incJMsGIv1AiwpuT19vKaiLmnw7Z4qLNkHfEII6s42MhMUgto+SaSCVhV8w55eXlTzel5R1gxTKBM PPklfUaBVbJKjq0dIFFb4HZkoP2fo5p/K3Ddh1iZ6GQCd3wLzs2w6/zdvYrLv9SnvSpxBazcu3d2i J1p8xMe3xtfHaKeQsvgG3VKJXHmhOU+agwY3piWHpV5qllzFs7UWjd1it16f7NfE8E5TdNhYpgflm iRD2u6wCanbNnAz8S/3wx0sJ5csaxuhCIIZURXM9cCzH74P+3QyCrPrKxb+W+x2dD3pTgYPAOuHzf nr5bEf7Q==; Received: from mail-pl1-x649.google.com ([2607:f8b0:4864:20::649]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBl-0000p0-13 for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:32 +0000 Received: by mail-pl1-x649.google.com with SMTP id bb2so13839674plb.8 for ; Wed, 04 Nov 2020 13:19:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=CJJ0rjxW0WLgBGe7C8MxYBgWekK6/78/b2MUEp43O38=; b=A+J1btA5Y1kuLGUMCPIM7qN7hLU+zm24DMqqt0Ct9S3BvbZiAoHrdE+G4YN770HPHp 8RGJW1IIp2wTkYQtkp7ESpErViKFSxzZ2MWO4gKMFzbpV4GDqcWGzl6PsgqGTOjXYH/j x4TLnjsjPn3KNX0cy9gxCjB7HZQUUGqQC/qdk7TjvveRO7raZncvIPbEG7GMpX+NyvhM QpyQn3PLXqEnrPXGym6oTLyIwFcqt4UV+i90b0saO7DYIbR5FvbErkHVoQVOxPxsdtSo rSLIUGBw+VHFU41bPp7yh+Wb4HGMOKnHuMuftK9pzT7Z03GLnOm6KQNcto3kknWI4ob+ 0U9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=CJJ0rjxW0WLgBGe7C8MxYBgWekK6/78/b2MUEp43O38=; b=SgFDwdsEItmnjY8nwYV6jTqBzrzWzwDK6s7M0YVKsfLPLp/O806Hbq5PgS8UphP71K e/HTh2XRGXubMH0biUWWZFNAuhWSrpjvGaT565jOJTMXZW4dqHBQaqKyyazqixZ+7z28 IP50olgIh2RBJOvGRCxPEYceNG/QelWZVqyMWDDYeuRhPJYEl0nNATb16t/9qcvZXL8w 2UFbKGUBzXuey81AkhUAIwKJBrS3STVPHZKs29SJFPwcuMyhMIWAiicZPD0mCBD54Jkx 78vVPh5YZvWt+PpxT90kfzeuvuYvxXSl38o22LKH3I8n+DuXX7z+zHXJvrWOxBKJPS6l ZuLQ== X-Gm-Message-State: AOAM530X7F2N+DagX5KiCSRoy740Fcf0RoTxy3yz2KOVH7BcdnPJjLpU jlqyfiKVLMz0meivGH6wBRR5Djw= X-Google-Smtp-Source: ABdhPJxMY0zrRmmq8tIa8fmsvNKZqpIrRESugE/LICLdR/E86t4oCDUpXaLqQ1SUu+asLo9noIY4W5k= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:a62:7883:0:b029:18a:e054:edf1 with SMTP id t125-20020a6278830000b029018ae054edf1mr16930196pfc.70.1604524704447; Wed, 04 Nov 2020 13:18:24 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:06 -0800 In-Reply-To: Message-Id: <206cfc54563a0ce371120b54f4a46d900273b5a2.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 3/8] arch: move SA_* definitions to generic headers From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211929_290791_10318B07 X-CRM114-Status: GOOD ( 22.99 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , Geert Uytterhoeven , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Most architectures with the exception of alpha, mips, parisc and sparc use the same values for these flags. Move their definitions into asm-generic/signal-defs.h and allow the architectures with non-standard values to override them. Also, document the non-standard flag values in order to make it easier to add new generic flags in the future. A consequence of this change is that on powerpc and x86, the constants' values aside from SA_RESETHAND change signedness from unsigned to signed. This is not expected to impact realistic use of these constants. In particular the typical use of the constants where they are or'ed together and assigned to sa_flags (or another int variable) would not be affected. Signed-off-by: Peter Collingbourne Acked-by: Geert Uytterhoeven Acked-by: "Eric W. Biederman" Reviewed-by: Dave Martin Link: https://linux-review.googlesource.com/id/Ia3849f18b8009bf41faca374e701cdca36974528 --- v14: - revert unintentional removal of SA_RESTORER on arm as pointed out by Eric v11: - tweak the commit message to point out the change from unsigned to signed v10: - move the comments around and add one for SA_SIGINFO arch/alpha/include/uapi/asm/signal.h | 14 -------- arch/arm/include/uapi/asm/signal.h | 27 ++------------- arch/h8300/include/uapi/asm/signal.h | 24 ------------- arch/ia64/include/uapi/asm/signal.h | 24 ------------- arch/m68k/include/uapi/asm/signal.h | 24 ------------- arch/mips/include/uapi/asm/signal.h | 12 ------- arch/parisc/include/uapi/asm/signal.h | 13 ------- arch/powerpc/include/uapi/asm/signal.h | 24 ------------- arch/s390/include/uapi/asm/signal.h | 24 ------------- arch/sparc/include/uapi/asm/signal.h | 4 +-- arch/x86/include/uapi/asm/signal.h | 24 ------------- arch/xtensa/include/uapi/asm/signal.h | 24 ------------- include/uapi/asm-generic/signal-defs.h | 47 ++++++++++++++++++++++++++ include/uapi/asm-generic/signal.h | 29 ---------------- 14 files changed, 51 insertions(+), 263 deletions(-) diff --git a/arch/alpha/include/uapi/asm/signal.h b/arch/alpha/include/uapi/asm/signal.h index 74c750bf1c1a..a69dd8d080a8 100644 --- a/arch/alpha/include/uapi/asm/signal.h +++ b/arch/alpha/include/uapi/asm/signal.h @@ -60,20 +60,6 @@ typedef unsigned long sigset_t; #define SIGRTMIN 32 #define SIGRTMAX _NSIG -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ - #define SA_ONSTACK 0x00000001 #define SA_RESTART 0x00000002 #define SA_NOCLDSTOP 0x00000004 diff --git a/arch/arm/include/uapi/asm/signal.h b/arch/arm/include/uapi/asm/signal.h index 9b4185ba4f8a..c9a3ea1d8d41 100644 --- a/arch/arm/include/uapi/asm/signal.h +++ b/arch/arm/include/uapi/asm/signal.h @@ -60,33 +60,12 @@ typedef unsigned long sigset_t; #define SIGSWI 32 /* - * SA_FLAGS values: - * - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_SIGINFO deliver the signal with SIGINFO structs - * SA_THIRTYTWO delivers the signal in 32-bit mode, even if the task - * is running in 26-bit. - * SA_ONSTACK allows alternate signal stacks (see sigaltstack(2)). - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NODEFER prevents the current signal from being masked in the handler. - * SA_RESETHAND clears the handler when the signal is delivered. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. + * SA_THIRTYTWO historically meant deliver the signal in 32-bit mode, even if + * the task is running in 26-bit. But since the kernel no longer supports + * 26-bit mode, the flag has no effect. */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 -#define SA_SIGINFO 0x00000004 #define SA_THIRTYTWO 0x02000000 #define SA_RESTORER 0x04000000 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND #define MINSIGSTKSZ 2048 #define SIGSTKSZ 8192 diff --git a/arch/h8300/include/uapi/asm/signal.h b/arch/h8300/include/uapi/asm/signal.h index e15521037348..2cd0dce2b6a6 100644 --- a/arch/h8300/include/uapi/asm/signal.h +++ b/arch/h8300/include/uapi/asm/signal.h @@ -57,30 +57,6 @@ typedef unsigned long sigset_t; #define SIGRTMIN 32 #define SIGRTMAX _NSIG -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 /* not supported yet */ -#define SA_SIGINFO 0x00000004 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - #define SA_RESTORER 0x04000000 #define MINSIGSTKSZ 2048 diff --git a/arch/ia64/include/uapi/asm/signal.h b/arch/ia64/include/uapi/asm/signal.h index aa98ff1b9e22..38166a88e4c9 100644 --- a/arch/ia64/include/uapi/asm/signal.h +++ b/arch/ia64/include/uapi/asm/signal.h @@ -53,30 +53,6 @@ #define SIGRTMIN 32 #define SIGRTMAX _NSIG -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 -#define SA_SIGINFO 0x00000004 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - #define SA_RESTORER 0x04000000 /* diff --git a/arch/m68k/include/uapi/asm/signal.h b/arch/m68k/include/uapi/asm/signal.h index 915cc755a184..4619291df601 100644 --- a/arch/m68k/include/uapi/asm/signal.h +++ b/arch/m68k/include/uapi/asm/signal.h @@ -57,30 +57,6 @@ typedef unsigned long sigset_t; #define SIGRTMIN 32 #define SIGRTMAX _NSIG -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 -#define SA_SIGINFO 0x00000004 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - #define MINSIGSTKSZ 2048 #define SIGSTKSZ 8192 diff --git a/arch/mips/include/uapi/asm/signal.h b/arch/mips/include/uapi/asm/signal.h index 53104b10aae2..e6c78a15cb2f 100644 --- a/arch/mips/include/uapi/asm/signal.h +++ b/arch/mips/include/uapi/asm/signal.h @@ -62,18 +62,6 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ #define SIGRTMAX _NSIG /* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - * * SA_RESTORER used to be defined as 0x04000000 but only the O32 ABI ever * supported its use and no libc was using it, so the entire sa-restorer * functionality was removed with lmo commit 39bffc12c3580ab for 2.5.48 diff --git a/arch/parisc/include/uapi/asm/signal.h b/arch/parisc/include/uapi/asm/signal.h index 9e6f87bc8a73..e5a2657477ac 100644 --- a/arch/parisc/include/uapi/asm/signal.h +++ b/arch/parisc/include/uapi/asm/signal.h @@ -41,19 +41,6 @@ #define SIGRTMIN 32 #define SIGRTMAX _NSIG -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ #define SA_ONSTACK 0x00000001 #define SA_RESETHAND 0x00000004 #define SA_NOCLDSTOP 0x00000008 diff --git a/arch/powerpc/include/uapi/asm/signal.h b/arch/powerpc/include/uapi/asm/signal.h index 85b0a7aa43e7..04873dd311c2 100644 --- a/arch/powerpc/include/uapi/asm/signal.h +++ b/arch/powerpc/include/uapi/asm/signal.h @@ -60,30 +60,6 @@ typedef struct { #define SIGRTMIN 32 #define SIGRTMAX _NSIG -/* - * SA_FLAGS values: - * - * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001U -#define SA_NOCLDWAIT 0x00000002U -#define SA_SIGINFO 0x00000004U -#define SA_ONSTACK 0x08000000U -#define SA_RESTART 0x10000000U -#define SA_NODEFER 0x40000000U -#define SA_RESETHAND 0x80000000U - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - #define SA_RESTORER 0x04000000U #define MINSIGSTKSZ 2048 diff --git a/arch/s390/include/uapi/asm/signal.h b/arch/s390/include/uapi/asm/signal.h index 9a14a611ed82..0189f326aac5 100644 --- a/arch/s390/include/uapi/asm/signal.h +++ b/arch/s390/include/uapi/asm/signal.h @@ -65,30 +65,6 @@ typedef unsigned long sigset_t; #define SIGRTMIN 32 #define SIGRTMAX _NSIG -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 -#define SA_SIGINFO 0x00000004 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - #define SA_RESTORER 0x04000000 #define MINSIGSTKSZ 2048 diff --git a/arch/sparc/include/uapi/asm/signal.h b/arch/sparc/include/uapi/asm/signal.h index ff9505923b9a..53758d53ac0e 100644 --- a/arch/sparc/include/uapi/asm/signal.h +++ b/arch/sparc/include/uapi/asm/signal.h @@ -137,13 +137,11 @@ struct sigstack { #define SA_STACK _SV_SSTACK #define SA_ONSTACK _SV_SSTACK #define SA_RESTART _SV_INTR -#define SA_ONESHOT _SV_RESET +#define SA_RESETHAND _SV_RESET #define SA_NODEFER 0x20u #define SA_NOCLDWAIT 0x100u #define SA_SIGINFO 0x200u -#define SA_NOMASK SA_NODEFER - #define SIG_BLOCK 0x01 /* for blocking signals */ #define SIG_UNBLOCK 0x02 /* for unblocking signals */ #define SIG_SETMASK 0x04 /* for setting the signal mask */ diff --git a/arch/x86/include/uapi/asm/signal.h b/arch/x86/include/uapi/asm/signal.h index e5745d593dc7..164a22a72984 100644 --- a/arch/x86/include/uapi/asm/signal.h +++ b/arch/x86/include/uapi/asm/signal.h @@ -62,30 +62,6 @@ typedef unsigned long sigset_t; #define SIGRTMIN 32 #define SIGRTMAX _NSIG -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001u -#define SA_NOCLDWAIT 0x00000002u -#define SA_SIGINFO 0x00000004u -#define SA_ONSTACK 0x08000000u -#define SA_RESTART 0x10000000u -#define SA_NODEFER 0x40000000u -#define SA_RESETHAND 0x80000000u - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - #define SA_RESTORER 0x04000000 #define MINSIGSTKSZ 2048 diff --git a/arch/xtensa/include/uapi/asm/signal.h b/arch/xtensa/include/uapi/asm/signal.h index 005dec5bfde4..79ddabaa4e5d 100644 --- a/arch/xtensa/include/uapi/asm/signal.h +++ b/arch/xtensa/include/uapi/asm/signal.h @@ -72,30 +72,6 @@ typedef struct { #define SIGRTMIN 32 #define SIGRTMAX (_NSIG-1) -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 /* not supported yet */ -#define SA_SIGINFO 0x00000004 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - #define SA_RESTORER 0x04000000 #define MINSIGSTKSZ 2048 diff --git a/include/uapi/asm-generic/signal-defs.h b/include/uapi/asm-generic/signal-defs.h index e9304c95ceea..493953fe319b 100644 --- a/include/uapi/asm-generic/signal-defs.h +++ b/include/uapi/asm-generic/signal-defs.h @@ -4,6 +4,53 @@ #include +/* + * SA_FLAGS values: + * + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_SIGINFO delivers the signal with SIGINFO structs. + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NODEFER prevents the current signal from being masked in the handler. + * SA_RESETHAND clears the handler when the signal is delivered. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + * + * The following bits are used in architecture-specific SA_* definitions and + * should be avoided for new generic flags: 3, 4, 5, 6, 7, 8, 9, 16, 24, 25, 26. + */ +#ifndef SA_NOCLDSTOP +#define SA_NOCLDSTOP 0x00000001 +#endif +#ifndef SA_NOCLDWAIT +#define SA_NOCLDWAIT 0x00000002 +#endif +#ifndef SA_SIGINFO +#define SA_SIGINFO 0x00000004 +#endif +#ifndef SA_ONSTACK +#define SA_ONSTACK 0x08000000 +#endif +#ifndef SA_RESTART +#define SA_RESTART 0x10000000 +#endif +#ifndef SA_NODEFER +#define SA_NODEFER 0x40000000 +#endif +#ifndef SA_RESETHAND +#define SA_RESETHAND 0x80000000 +#endif + +#define SA_NOMASK SA_NODEFER +#define SA_ONESHOT SA_RESETHAND + +/* + * New architectures should not define the obsolete + * SA_RESTORER 0x04000000 + */ + #ifndef SIG_BLOCK #define SIG_BLOCK 0 /* for blocking signals */ #endif diff --git a/include/uapi/asm-generic/signal.h b/include/uapi/asm-generic/signal.h index 5c716a952cbe..f634822906e4 100644 --- a/include/uapi/asm-generic/signal.h +++ b/include/uapi/asm-generic/signal.h @@ -52,35 +52,6 @@ #define SIGRTMAX _NSIG #endif -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP 0x00000001 -#define SA_NOCLDWAIT 0x00000002 -#define SA_SIGINFO 0x00000004 -#define SA_ONSTACK 0x08000000 -#define SA_RESTART 0x10000000 -#define SA_NODEFER 0x40000000 -#define SA_RESETHAND 0x80000000 - -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND - -/* - * New architectures should not define the obsolete - * SA_RESTORER 0x04000000 - */ - #if !defined MINSIGSTKSZ || !defined SIGSTKSZ #define MINSIGSTKSZ 2048 #define SIGSTKSZ 8192 From patchwork Wed Nov 4 21:18:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883111 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59809C00A89 for ; Thu, 5 Nov 2020 04:22:36 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 BE59520795 for ; Thu, 5 Nov 2020 04:22:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="QTmWEtv8"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="nUEdRuvc"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="Z3VA8DQp" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BE59520795 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=DNQaB8hxgj1EPUP4oiWjP8tFb7u/O7qy+w7SUN96znU=; b=QTmWEtv8/Z3TmUzkUVPF0P0Re fgdZMGXopOgV0zJ+CLuMbCDBjASyGb3KNW6Z2lksncFlZod4PH64oziLPnMjojWLMqOy9W6pnnSTj N0zKDi5epjlO3ZgGtXMdteR567JajpkD4MPrOcQf2UiJ7T3pPgZN5EthnkRfKJ5AZREEmGyrOirhQ svCU5HlVmzy/RgVxZCOT/k1ZrTJeOou3WfVpynWfyeCmOqbIHUFZhCAaOfMBom22SxhpvMLl8bWI2 IIcdWFqaZrHzUfR67bbyTr/slVIp7afk16RFhp+ny/G7thG2HwJWJb7r7GMaAa52ROUnmTrCE81kN pUz2BB/eg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaWmk-00069Z-PS; Thu, 05 Nov 2020 04:22:06 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7v-00016k-70 for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=4jrWyDzAWhEFMjxNl2KItRv0H5CZDDi6igyhXcfTjQM=; b=nUEdRuvcGWkc39znVi+aowo4YB lFnk2z+q8/ZPVgLGCRvMBJby3uqlpiTAN6C+tORRAaivDzM+Cu7j9EkFiD2ljyWDU2Bz75eqFIV5W O5fce825I2ptOaFNJFzCNx7vE9pag7naCT60p6JlxuB7BAlAVWgtMle/HEmcRxCHX7QE7Udt4XbKB aGqUADdH8lNBd034UlmTTuAB2kvAhhgFJjICukf4WL/mCfVOp+YoWTTEK03W8p3s4k2pw2Gxwr2Q9 RYLl9sotxC5sDew6uQ1COixfBYrtqqruK27wI5mywZ4RCDDvqzz5TawwcK9kx6zd0Ep+ARiYIVXJf GvsqIu4g==; Received: from mail-qv1-xf49.google.com ([2607:f8b0:4864:20::f49]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBp-0000po-Ug for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:39 +0000 Received: by mail-qv1-xf49.google.com with SMTP id eh4so13595503qvb.12 for ; Wed, 04 Nov 2020 13:19:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=4jrWyDzAWhEFMjxNl2KItRv0H5CZDDi6igyhXcfTjQM=; b=Z3VA8DQpW4o3zVreJ8zDQuX/0+7spoK3clb77ks0FqUDvWL2RlOFqhkk5DdpCIyZU3 qYbfRjx2cV6MtFRaH6m7D/vxXnq71d2Zbn4vCQW68i3aXUBAGCCu6zEPfAIffu2ENg52 mfl1B4DwCwKt43u/n65LwkgTeHEhW9y3YqCV3Nuwh/4wjIGMbN6mFVxVPXLWLENfMHXn KdZpXKLTo3z54pU8ZkGlBINPKP5Vf0Hz57TSun8DLxeeyecuATpqiXBcHCeTm3ihnJFi cgrr6vHhUYOPbat5dcCfOv7qUVP237PEp5oTneQYxBnDjba0A8Bq4f00aEHdA8m38Sn2 gkRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=4jrWyDzAWhEFMjxNl2KItRv0H5CZDDi6igyhXcfTjQM=; b=GaFCM6bifbtTW2cB2zAXMCcU73qHvwqHKK0GRq0zvhXaHk+JSiCl+Jjp9IhXv3V1TF atR0S7EHwe04Molmehyy+dTrjXXSop3M4TT97fZ3SdG9ts+T3wn9hpgeUbvtg2nDGoWr 9yXxWMtz/XPmsL8bnOxvGXhW8IIm8ScfRmGujbpNcMZ6JhSZesoSWjj0WJ/28vliDctN M7wz7P+mOjSTshOLs2WfW5wsjItOzcVnEvA+RVihIWtJLfvYu0oFYq0+sdk7I55CJrjL /CWyInBnZocq0mQb9yR4mK3d/J3D1cp8lVGgYvJ/nBmWPv+aujRUdCpkwt80a5AiyVE/ A4GQ== X-Gm-Message-State: AOAM531Yzr+lAj1rDabug59g2twqlZKo2WoW98FuohJZ2wU0ebo7dotW WLkXfThd+fNs8yDyW6QnHgD5lnQ= X-Google-Smtp-Source: ABdhPJzsRXpiZJYoEKebRD9os6+E8lvR6Uq9oXM8YM8a3SXPEK8Yka90WnvhpOXxTj0YLSwcRBlHr4c= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:ad4:43ca:: with SMTP id o10mr35382582qvs.33.1604524706362; Wed, 04 Nov 2020 13:18:26 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:07 -0800 In-Reply-To: Message-Id: <4d826a62121153d54d7e36fc8a402c97e2106764.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 4/8] signal: deduplicate code dealing with common _sigfault fields From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211934_423613_6748DFD0 X-CRM114-Status: GOOD ( 14.69 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org We're about to add more common _sigfault fields, so deduplicate the existing code for initializing _sigfault fields in {send,force}_sig_*, and for copying _sigfault fields in copy_siginfo_to_external32 and post_copy_siginfo_from_user32, to reduce the number of places that will need to be updated by upcoming changes. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/I4f56174e1b7b2bf4a3c8139e6879cbfd52750a24 Acked-by: "Eric W. Biederman" --- include/linux/signal.h | 13 ++++++ kernel/signal.c | 101 ++++++++++++++++------------------------- 2 files changed, 53 insertions(+), 61 deletions(-) diff --git a/include/linux/signal.h b/include/linux/signal.h index b256f9c65661..e9fb05041e7a 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -50,6 +50,19 @@ enum siginfo_layout { enum siginfo_layout siginfo_layout(unsigned sig, int si_code); +static inline bool siginfo_layout_is_fault(enum siginfo_layout layout) +{ + switch (layout) { + case SIL_FAULT: + case SIL_FAULT_MCEERR: + case SIL_FAULT_BNDERR: + case SIL_FAULT_PKUERR: + return true; + default: + return false; + } +} + /* * Define some primitives to manipulate sigset_t. */ diff --git a/kernel/signal.c b/kernel/signal.c index ef8f2a28d37c..74e7315c24db 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1650,6 +1650,15 @@ void force_sigsegv(int sig) force_sig(SIGSEGV); } +static void set_sigfault_common_fields(struct kernel_siginfo *info, int sig, + int code, void __user *addr) +{ + info->si_signo = sig; + info->si_errno = 0; + info->si_code = code; + info->si_addr = addr; +} + int force_sig_fault_to_task(int sig, int code, void __user *addr ___ARCH_SI_TRAPNO(int trapno) ___ARCH_SI_IA64(int imm, unsigned int flags, unsigned long isr) @@ -1658,10 +1667,7 @@ int force_sig_fault_to_task(int sig, int code, void __user *addr struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = sig; - info.si_errno = 0; - info.si_code = code; - info.si_addr = addr; + set_sigfault_common_fields(&info, sig, code, addr); #ifdef __ARCH_SI_TRAPNO info.si_trapno = trapno; #endif @@ -1690,10 +1696,7 @@ int send_sig_fault(int sig, int code, void __user *addr struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = sig; - info.si_errno = 0; - info.si_code = code; - info.si_addr = addr; + set_sigfault_common_fields(&info, sig, code, addr); #ifdef __ARCH_SI_TRAPNO info.si_trapno = trapno; #endif @@ -1711,10 +1714,7 @@ int force_sig_mceerr(int code, void __user *addr, short lsb) WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); clear_siginfo(&info); - info.si_signo = SIGBUS; - info.si_errno = 0; - info.si_code = code; - info.si_addr = addr; + set_sigfault_common_fields(&info, SIGBUS, code, addr); info.si_addr_lsb = lsb; return force_sig_info(&info); } @@ -1725,10 +1725,7 @@ int send_sig_mceerr(int code, void __user *addr, short lsb, struct task_struct * WARN_ON((code != BUS_MCEERR_AO) && (code != BUS_MCEERR_AR)); clear_siginfo(&info); - info.si_signo = SIGBUS; - info.si_errno = 0; - info.si_code = code; - info.si_addr = addr; + set_sigfault_common_fields(&info, SIGBUS, code, addr); info.si_addr_lsb = lsb; return send_sig_info(info.si_signo, &info, t); } @@ -1739,10 +1736,7 @@ int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper) struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = SIGSEGV; - info.si_errno = 0; - info.si_code = SEGV_BNDERR; - info.si_addr = addr; + set_sigfault_common_fields(&info, SIGSEGV, SEGV_BNDERR, addr); info.si_lower = lower; info.si_upper = upper; return force_sig_info(&info); @@ -1754,10 +1748,7 @@ int force_sig_pkuerr(void __user *addr, u32 pkey) struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = SIGSEGV; - info.si_errno = 0; - info.si_code = SEGV_PKUERR; - info.si_addr = addr; + set_sigfault_common_fields(&info, SIGSEGV, SEGV_PKUERR, addr); info.si_pkey = pkey; return force_sig_info(&info); } @@ -1771,10 +1762,8 @@ int force_sig_ptrace_errno_trap(int errno, void __user *addr) struct kernel_siginfo info; clear_siginfo(&info); - info.si_signo = SIGTRAP; + set_sigfault_common_fields(&info, SIGTRAP, TRAP_HWBKPT, addr); info.si_errno = errno; - info.si_code = TRAP_HWBKPT; - info.si_addr = addr; return force_sig_info(&info); } @@ -3267,12 +3256,23 @@ int copy_siginfo_from_user(kernel_siginfo_t *to, const siginfo_t __user *from) void copy_siginfo_to_external32(struct compat_siginfo *to, const struct kernel_siginfo *from) { + enum siginfo_layout layout = + siginfo_layout(from->si_signo, from->si_code); + memset(to, 0, sizeof(*to)); to->si_signo = from->si_signo; to->si_errno = from->si_errno; to->si_code = from->si_code; - switch(siginfo_layout(from->si_signo, from->si_code)) { + + if (siginfo_layout_is_fault(layout)) { + to->si_addr = ptr_to_compat(from->si_addr); +#ifdef __ARCH_SI_TRAPNO + to->si_trapno = from->si_trapno; +#endif + } + + switch (layout) { case SIL_KILL: to->si_pid = from->si_pid; to->si_uid = from->si_uid; @@ -3287,31 +3287,15 @@ void copy_siginfo_to_external32(struct compat_siginfo *to, to->si_fd = from->si_fd; break; case SIL_FAULT: - to->si_addr = ptr_to_compat(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif break; case SIL_FAULT_MCEERR: - to->si_addr = ptr_to_compat(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_addr_lsb = from->si_addr_lsb; break; case SIL_FAULT_BNDERR: - to->si_addr = ptr_to_compat(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_lower = ptr_to_compat(from->si_lower); to->si_upper = ptr_to_compat(from->si_upper); break; case SIL_FAULT_PKUERR: - to->si_addr = ptr_to_compat(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_pkey = from->si_pkey; break; case SIL_CHLD: @@ -3348,11 +3332,22 @@ int __copy_siginfo_to_user32(struct compat_siginfo __user *to, static int post_copy_siginfo_from_user32(kernel_siginfo_t *to, const struct compat_siginfo *from) { + enum siginfo_layout layout = + siginfo_layout(from->si_signo, from->si_code); + clear_siginfo(to); to->si_signo = from->si_signo; to->si_errno = from->si_errno; to->si_code = from->si_code; - switch(siginfo_layout(from->si_signo, from->si_code)) { + + if (siginfo_layout_is_fault(layout)) { + to->si_addr = compat_ptr(from->si_addr); +#ifdef __ARCH_SI_TRAPNO + to->si_trapno = from->si_trapno; +#endif + } + + switch (layout) { case SIL_KILL: to->si_pid = from->si_pid; to->si_uid = from->si_uid; @@ -3367,31 +3362,15 @@ static int post_copy_siginfo_from_user32(kernel_siginfo_t *to, to->si_fd = from->si_fd; break; case SIL_FAULT: - to->si_addr = compat_ptr(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif break; case SIL_FAULT_MCEERR: - to->si_addr = compat_ptr(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_addr_lsb = from->si_addr_lsb; break; case SIL_FAULT_BNDERR: - to->si_addr = compat_ptr(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_lower = compat_ptr(from->si_lower); to->si_upper = compat_ptr(from->si_upper); break; case SIL_FAULT_PKUERR: - to->si_addr = compat_ptr(from->si_addr); -#ifdef __ARCH_SI_TRAPNO - to->si_trapno = from->si_trapno; -#endif to->si_pkey = from->si_pkey; break; case SIL_CHLD: From patchwork Wed Nov 4 21:18:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883311 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8098CC00A89 for ; Thu, 5 Nov 2020 05:29:31 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 9B6432083B for ; Thu, 5 Nov 2020 05:29:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ZErOq6SG"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="vinXJDQm"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="Rmav60W+" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B6432083B Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=hR77fJKMUdZjRxbsgcKWeG5lukZBMygkBvb9ZooT/4Y=; b=ZErOq6SG/ow8IaWjhCy3jFCFn NwgFX6aKotLPoAxP4kdlseISTfZO/1j0XQaWYm1C1O3Fcf1iR3gi46LJDgjpASi0Hm1gNUmYq5rUp XmDvupw/bpza6is7Abrqssu6nkaeYhs7BXtwosUKf7MfYsUUWg4gvah+tX8TXjkQdGmbPF5c70TLc hjDJ8njSgq7GJSbNreq+prW2IC7PnxHBBwqB8Z7VeDgGxKUmGseaQF1MM/znguetELZJbKJwrmFzq yvor7D/M+ROTu4oNS32c3641ZANSPg9N0EUftrCGPoO01e/CHUuk/kzDy02E2JQeG5Jq4FfLfBOnk 17uLfVeDw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaXo5-0006Qk-Gh; Thu, 05 Nov 2020 05:27:33 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7x-00016k-4i for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:57 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=4D7Q2kZ3L7YBvRzuP8i1p6TftH53P5xo5cWP8p2xBcs=; b=vinXJDQm4ObFgetOlkwnXdpKNp s5r592Hd4T+awqMXfcTLoNbnJx3eHN61OYdXbht4uqOW7mTVtSGrVloG+EARDuo5bpdfDgBbziAgP TBtro0p78BSuGXrx5Y/+VIYj5iZceD4PJZDaREgEEtAiUgqW+XrGwcv8dV7EJ5lzlWX7VBNRckfeF SP0fqPf2Ci59B0Z/QCn4oskx2uv9ud7qU9ChXhQ1tn1hsQUzWl1PE1OBkuZECkwaiAV5rrb1qNU7B 6mlRAN7Yd2N21739uryXCkoQG0OwedVhkB7kmNHCltjvxztYGR3PpS28ge1+0oSss3svmB1eGoDb2 0F/quQbg==; Received: from mail-yb1-xb4a.google.com ([2607:f8b0:4864:20::b4a]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBn-0000pW-Hf for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:34 +0000 Received: by mail-yb1-xb4a.google.com with SMTP id u11so120045ybh.6 for ; Wed, 04 Nov 2020 13:19:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=4D7Q2kZ3L7YBvRzuP8i1p6TftH53P5xo5cWP8p2xBcs=; b=Rmav60W+RCIT2LWA2rZ8FJfCiKqCs+BcZaagAHdLyU7ZWJGfDkLcL8cb0d8pdgG60Z Z2JffzIBG6dSLtIZMiuMmzMdJOwM+8H1QmM2KiWAxHsGcK2pZ37irAwkaBH9ebMwd785 kgA5sLQ+wgPkXyeaewPpPM/J//nS+YODNqspdh6Ui5Sd/bvAG0GyFEp8Cfy4WmQ+rBgk dweykfNEfOxiGgawsm2cdgk1cw01rob6cov3VHHE1WMPWLeBBtlMMvRMd/+zY9MZEnPz Vr2pqDYoX5CjaCVFT5Q5a2k+UaOyizffKHEEPa/MZmNjwKbjDANXQJdJYstBK75O7m9N cz5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=4D7Q2kZ3L7YBvRzuP8i1p6TftH53P5xo5cWP8p2xBcs=; b=gR/ErfiTVYvxxlcnEPoRuVrOPAciOATkIQtk7lYxK2uYnK6zGlTnD5Y0yZsNgyKFhu xFDBWIZasSEmExFTHHYTGtpPlPQpnr5nXhrcezOWgIrZqFuK+DMAeBHnmZ5CXtAarJdz fylRsVo84ZME1qYpyHtYG0JIv90RZZDucJQCkyz/cuqgZJ96hBGNG8BspMfl+EWxi15p bov+c/aKpEO14ZRwGMvDFY5FKMaZYI4pSSrD7l2F77KXwh+udit85OQw1QUQD1Dnfk3h UUI3/+1ggUNrTZnlcHm/lY6m575NfRFzOTQA1Y9dLVSDhOSSvQraEhrc9iIH9DWkifBU RBFA== X-Gm-Message-State: AOAM532cinp259y3DIRhrlSwQARAvJjpgcLgRyE5CkPMPmhx8rlbOEc8 oAYgsmxGFe6QXECpYBcAlLeIyDE= X-Google-Smtp-Source: ABdhPJxCMjn3XEy0/8f51pRz3bV7jkfFqDLqs9/bfY94sEGmhkUmhkE3HKdEBSeU0CZpyiHs8RCZHYQ= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:a25:b851:: with SMTP id b17mr7525251ybm.15.1604524708250; Wed, 04 Nov 2020 13:18:28 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:08 -0800 In-Reply-To: Message-Id: <039adb228822eb1f0c90cbfc716fc28fa298c58e.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 5/8] signal: clear non-uapi flag bits when passing/returning sa_flags From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211931_821256_0FCA39AB X-CRM114-Status: GOOD ( 22.06 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Previously we were not clearing non-uapi flag bits in sigaction.sa_flags when storing the userspace-provided sa_flags or when returning them via oldact. Start doing so. This allows userspace to detect missing support for flag bits and allows the kernel to use non-uapi bits internally, as we are already doing in arch/x86 for two flag bits. Now that this change is in place, we no longer need the code in arch/x86 that was hiding these bits from userspace, so remove it. This is technically a userspace-visible behavior change for sigaction, as the unknown bits returned via oldact.sa_flags are no longer set. However, we are free to define the behavior for unknown bits exactly because their behavior is currently undefined, so for now we can define the meaning of each of them to be "clear the bit in oldact.sa_flags unless the bit becomes known in the future". Furthermore, this behavior is consistent with OpenBSD [1], illumos [2] and XNU [3] (FreeBSD [4] and NetBSD [5] fail the syscall if unknown bits are set). So there is some precedent for this behavior in other kernels, and in particular in XNU, which is probably the most popular kernel among those that I looked at, which means that this change is less likely to be a compatibility issue. Link: [1] https://github.com/openbsd/src/blob/f634a6a4b5bf832e9c1de77f7894ae2625e74484/sys/kern/kern_sig.c#L278 Link: [2] https://github.com/illumos/illumos-gate/blob/76f19f5fdc974fe5be5c82a556e43a4df93f1de1/usr/src/uts/common/syscall/sigaction.c#L86 Link: [3] https://github.com/apple/darwin-xnu/blob/a449c6a3b8014d9406c2ddbdc81795da24aa7443/bsd/kern/kern_sig.c#L480 Link: [4] https://github.com/freebsd/freebsd/blob/eded70c37057857c6e23fae51f86b8f8f43cd2d0/sys/kern/kern_sig.c#L699 Link: [5] https://github.com/NetBSD/src/blob/3365779becdcedfca206091a645a0e8e22b2946e/sys/kern/sys_sig.c#L473 Signed-off-by: Peter Collingbourne Reviewed-by: Dave Martin Link: https://linux-review.googlesource.com/id/I35aab6f5be932505d90f3b3450c083b4db1eca86 Acked-by: "Eric W. Biederman" --- v10: - rename SA_UAPI_FLAGS -> UAPI_SA_FLAGS - refactor how we define it to avoid mentioning flags more than once arch/arm/include/asm/signal.h | 2 ++ arch/parisc/include/asm/signal.h | 2 ++ arch/x86/kernel/signal_compat.c | 7 ------- include/linux/signal_types.h | 12 ++++++++++++ kernel/signal.c | 10 ++++++++++ 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/arch/arm/include/asm/signal.h b/arch/arm/include/asm/signal.h index 65530a042009..430be7774402 100644 --- a/arch/arm/include/asm/signal.h +++ b/arch/arm/include/asm/signal.h @@ -17,6 +17,8 @@ typedef struct { unsigned long sig[_NSIG_WORDS]; } sigset_t; +#define __ARCH_UAPI_SA_FLAGS (SA_THIRTYTWO | SA_RESTORER) + #define __ARCH_HAS_SA_RESTORER #include diff --git a/arch/parisc/include/asm/signal.h b/arch/parisc/include/asm/signal.h index 715c96ba2ec8..30dd1e43ef88 100644 --- a/arch/parisc/include/asm/signal.h +++ b/arch/parisc/include/asm/signal.h @@ -21,6 +21,8 @@ typedef struct { unsigned long sig[_NSIG_WORDS]; } sigset_t; +#define __ARCH_UAPI_SA_FLAGS _SA_SIGGFAULT + #include #endif /* !__ASSEMBLY */ diff --git a/arch/x86/kernel/signal_compat.c b/arch/x86/kernel/signal_compat.c index a7f3e12cfbdb..ddfd919be46c 100644 --- a/arch/x86/kernel/signal_compat.c +++ b/arch/x86/kernel/signal_compat.c @@ -165,16 +165,9 @@ void sigaction_compat_abi(struct k_sigaction *act, struct k_sigaction *oact) { signal_compat_build_tests(); - /* Don't leak in-kernel non-uapi flags to user-space */ - if (oact) - oact->sa.sa_flags &= ~(SA_IA32_ABI | SA_X32_ABI); - if (!act) return; - /* Don't let flags to be set from userspace */ - act->sa.sa_flags &= ~(SA_IA32_ABI | SA_X32_ABI); - if (in_ia32_syscall()) act->sa.sa_flags |= SA_IA32_ABI; if (in_x32_syscall()) diff --git a/include/linux/signal_types.h b/include/linux/signal_types.h index f8a90ae9c6ec..a7887ad84d36 100644 --- a/include/linux/signal_types.h +++ b/include/linux/signal_types.h @@ -68,4 +68,16 @@ struct ksignal { int sig; }; +#ifndef __ARCH_UAPI_SA_FLAGS +#ifdef SA_RESTORER +#define __ARCH_UAPI_SA_FLAGS SA_RESTORER +#else +#define __ARCH_UAPI_SA_FLAGS 0 +#endif +#endif + +#define UAPI_SA_FLAGS \ + (SA_NOCLDSTOP | SA_NOCLDWAIT | SA_SIGINFO | SA_ONSTACK | SA_RESTART | \ + SA_NODEFER | SA_RESETHAND | __ARCH_UAPI_SA_FLAGS) + #endif /* _LINUX_SIGNAL_TYPES_H */ diff --git a/kernel/signal.c b/kernel/signal.c index 74e7315c24db..832b654dee8c 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -3964,6 +3964,16 @@ int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) if (oact) *oact = *k; + /* + * Clear unknown flag bits in order to allow userspace to detect missing + * support for flag bits and to allow the kernel to use non-uapi bits + * internally. + */ + if (act) + act->sa.sa_flags &= UAPI_SA_FLAGS; + if (oact) + oact->sa.sa_flags &= UAPI_SA_FLAGS; + sigaction_compat_abi(act, oact); if (act) { From patchwork Wed Nov 4 21:18:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883269 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7B470C00A89 for ; Thu, 5 Nov 2020 05:11:58 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 F20672083B for ; Thu, 5 Nov 2020 05:11:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="C0jUM5yW"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="qx3uCJ8G"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="VPeI7hVS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F20672083B Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=85TUg91IDO9J4n60ws+fEK0svBeTRg3AknXxqCjrB7E=; b=C0jUM5yW2WuV16LBM6B8uHtLW f+QLI+ePEkoHV6cBvbJM++CnQgHx/7VP3udU6/nVZBn+76VJiQMzBVXG+SJ4KhPMPHD4u6Ax/L6AO H2vQVUJnGHVzTZsbH90KceRFHNMjoyQfZYLJsgXr+iUStRVvevFbIDia4JwMoZWNlZrhy8Z7IjjWe 8stxX5efznphaQipt5WNzh5WxltmCD8PypGh8wMUqDVl7+rsbBhBPUFOOsccmrAejh46iOhU5mpGE BlrUt0ppesmtTpDXG8+c+C+G0xJannXXIe9YtEEWhVXskbwBFlEVNhMk0YFy87i90dkg8TzmzanY/ 00K5v8Ugw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaXX4-0006kl-2Z; Thu, 05 Nov 2020 05:09:58 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7u-00016k-8i for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:54 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=1F5n8xtS2dM5ch0WQR4OI0jZvv8gDSLIMGjbAJfRQFg=; b=qx3uCJ8GKO/x0GztDY+k4GnTGW dXitWuyYUycMehtO2vc61SRGzBTsv0HIcT5MAYfUKaXdmNuarlbPZtgKaFk28h7b8gKE9i/w/yVTU 0B6nr3sUoVzd+eMdG9H0wQn8JVLTr1yPwxPDtHOBXseYC5L90sj+DdsGC35YiElgJZJ4riDRruOjA DK14gyLujtJhbIgvPlCr3MQ8uQnFk9bz9l8O3qVDx1gfGXRJyTtlCnWeBlTZRDCcy5WNbpQWzR3Li w/g/gvuq9y1xa4kRwFtmN0SNPxOn7Vw0DWLCmjm9ePhYypPoSlKgA9Ev4IysBxkt0DitLQsBwzkFC d3DdDB0w==; Received: from mail-pg1-x54a.google.com ([2607:f8b0:4864:20::54a]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBq-0000pv-QO for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:39 +0000 Received: by mail-pg1-x54a.google.com with SMTP id j13so14739302pgp.11 for ; Wed, 04 Nov 2020 13:19:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=1F5n8xtS2dM5ch0WQR4OI0jZvv8gDSLIMGjbAJfRQFg=; b=VPeI7hVSTtcadpuYSXbsMJD0uZh0MTNOT604DbJ0REXA9KtSMpJXxnnvzlGmPNcjfc 3g4xEqnW9WskyHOBXMpp3RxPuq6LWfnw8kWb4N0qb7bLSkWnf2tdW1wZjvP9Vc8R0Eoy X3kKwZDLgfV71dUon6XGaCSZrWDfr18NvCVrlLXaIz+VCZf3AL6eF5/NtBv8Ub2Bjna1 QbvZRznDtO/LodA7h2+zj7mGdoHZknH/se8/HCQNEop+GG66u0q65jFGCWJFF28b95PI //ZoWTTUH6udZ/G3NDTywthSVZT+v9gmD+DpkMA/iqr360bkyRpEcfPpmiw28oVhihJi 3RKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=1F5n8xtS2dM5ch0WQR4OI0jZvv8gDSLIMGjbAJfRQFg=; b=luVA97l+uSxnIepwEblk0uwQ5fOlknTJG5fIKx/CpKtaoMkulcykH18yclnQGpo+r4 XSt4zNK+yBntxz+kjE7s9lXgqslSj6rUwaIDiVq4fFP2B08k+grc/N+YhQdndpYj7QaN qxgsTiGUgdhXtS3nJlv+9SU+vuNJf23mPIBTl9N3+bt5GIF1o7xSKWw1ZwV8RRTz0RuF 8Py0Fhai33WZNUEp4nASDrYJVR1bQV1dJMBE7b72D/0c1Gho5ZR3xE0ZakJB3+ZNcP3m hqI1YUdeqjCJyk7vg0q+083QTS+jwcUVUG8KiaaULSAJpFQ3YNr6M1/Jwacblfoj4x1i JOiw== X-Gm-Message-State: AOAM531vboCD0zqZQ1WfS2DLOHQ8rjX4NIx7SEHIA2Z1FiYBrgt1ZrY5 5c7riAhelVBRkQjI+5J5SHST2J8= X-Google-Smtp-Source: ABdhPJxfFXRJAMUgdz1uktN8ikMzTi9fkdDEJI54Vm+4AUpSnekGYZn4MG1xizafJRvzrOq0L5Rb9AU= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:a17:90b:46d7:: with SMTP id jx23mr6213173pjb.86.1604524710112; Wed, 04 Nov 2020 13:18:30 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:09 -0800 In-Reply-To: Message-Id: <87501c1e71b5a6ed96bb9b540718b0752d4d6fed.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 6/8] signal: define the SA_UNSUPPORTED bit in sa_flags From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211935_326544_81B90D7F X-CRM114-Status: GOOD ( 17.94 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Define a sa_flags bit, SA_UNSUPPORTED, which will never be supported in the uapi. The purpose of this flag bit is to allow userspace to distinguish an old kernel that does not clear unknown sa_flags bits from a kernel that supports every flag bit. In other words, if userspace does something like: act.sa_flags |= SA_UNSUPPORTED; sigaction(SIGSEGV, &act, 0); sigaction(SIGSEGV, 0, &oldact); and finds that SA_UNSUPPORTED remains set in oldact.sa_flags, it means that the kernel cannot be trusted to have cleared unknown flag bits from sa_flags, so no assumptions about flag bit support can be made. Signed-off-by: Peter Collingbourne Reviewed-by: Dave Martin Link: https://linux-review.googlesource.com/id/Ic2501ad150a3a79c1cf27fb8c99be342e9dffbcb --- v11: - clarify the commit message include/uapi/asm-generic/signal-defs.h | 7 +++++++ kernel/signal.c | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/include/uapi/asm-generic/signal-defs.h b/include/uapi/asm-generic/signal-defs.h index 493953fe319b..0126ebda4d31 100644 --- a/include/uapi/asm-generic/signal-defs.h +++ b/include/uapi/asm-generic/signal-defs.h @@ -14,6 +14,12 @@ * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NODEFER prevents the current signal from being masked in the handler. * SA_RESETHAND clears the handler when the signal is delivered. + * SA_UNSUPPORTED is a flag bit that will never be supported. Kernels from + * before the introduction of SA_UNSUPPORTED did not clear unknown bits from + * sa_flags when read using the oldact argument to sigaction and rt_sigaction, + * so this bit allows flag bit support to be detected from userspace while + * allowing an old kernel to be distinguished from a kernel that supports every + * flag bit. * * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single * Unix names RESETHAND and NODEFER respectively. @@ -42,6 +48,7 @@ #ifndef SA_RESETHAND #define SA_RESETHAND 0x80000000 #endif +#define SA_UNSUPPORTED 0x00000400 #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND diff --git a/kernel/signal.c b/kernel/signal.c index 832b654dee8c..d18930aafbf4 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -3964,6 +3964,12 @@ int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) if (oact) *oact = *k; + /* + * Make sure that we never accidentally claim to support SA_UNSUPPORTED, + * e.g. by having an architecture use the bit in their uapi. + */ + BUILD_BUG_ON(UAPI_SA_FLAGS & SA_UNSUPPORTED); + /* * Clear unknown flag bits in order to allow userspace to detect missing * support for flag bits and to allow the kernel to use non-uapi bits From patchwork Wed Nov 4 21:18:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883187 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 105C3C00A89 for ; Thu, 5 Nov 2020 04:40:41 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 71F132083B for ; Thu, 5 Nov 2020 04:40:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="qQV3TyYn"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="sU+ESFOB"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="AbC8/yKS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 71F132083B Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=hn/a61OJPgosaizFCdj/BAmd4524drlFII8wqCr8TWs=; b=qQV3TyYn+nmp2SMpw11r0gD4V ZtTUWRdwX9FQBUFDKs5INrUKmZ+L0INOPq6nCF5SoB3/DdOHiZ3VroRZm+nxr0B0n0dPMyQzaLUx2 IOiu5tNVQ5PrqrrTMSwu2CXjBHUyuQagVQ0PfNlGoeOFvmwbo8/2P19ch80YGWuLRr/Nb4xtUIscV WIUt024YkSAquiTbLt0QmmFmzZ2vjoxAWeg9KhG7maeufV+WgfleS1wLEoUySmQQLkBeuEFyUpL09 ZJ+taWdyqvdVpmgSy4LNVDqWfahTJD7EmWtwRg6enokgo7Mh8iOQYReGlwPbfUvfZEY2ZkquKUYSB AYvS7wOiQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaX33-0004XS-9I; Thu, 05 Nov 2020 04:38:57 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7t-00016k-Ar for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:53 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=wLKH34A8RJSu6n0zXlFAJjjAxtGr+rwms4LzWjAiJ8A=; b=sU+ESFOBYEigO+cZP6YpWFiMWm dmfS+au3YZky1zn05KuWDgtm8ULr5vQ3C3zwKdVeY3u6NVJflTAKFX6A2S7O1Odjs99rTpG5pspni /AGe9oNKq/Dj2jRkyPlviypb/XfPhRgdp3Y8m6QTPdOszoHUJY42tuwBE+EAV9pONrwf+YIQ5rdHf jXY0cj6LVI8ALq8ltieTG4VCoNOYxtVWu0/vqVUPq5jZiZXDI6YlE/jZbl0r8yT8SN58TuBOwDpW4 F/wWmPWXV8nHEZ8V0Zl2RbWPR9X1Bo00pylVs13ZL4mD0LkeboH4A4TJARuCBV+XeInzqmsKBlKXc 86sRxJRQ==; Received: from mail-yb1-xb49.google.com ([2607:f8b0:4864:20::b49]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBq-0000pu-0l for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:41 +0000 Received: by mail-yb1-xb49.google.com with SMTP id w4so86130ybq.21 for ; Wed, 04 Nov 2020 13:19:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=wLKH34A8RJSu6n0zXlFAJjjAxtGr+rwms4LzWjAiJ8A=; b=AbC8/yKS7Exu2XftLXv44RO1/h8baCloytw7BNg4acM65ljDUKvxxG2ut9J9xvaUFl DPeXHZVkOXkjFLT+bIqiOW7nlkxaPuYoZ9/ZZRGaG5DjPiBjrrJFE28BhMIzGCTz6y4c +RTHg13PX9ADlowTkx8i03yHdxyzfKrTZw+Fe8ir0Yf6OwSzVJP1OBWQeIyGpZeT8xTb 7Qiyye+8NHfHYLLS1Ltylw2io8rILgmdUJiQvsGTo/NM1IN7zmUBaaHB+a88yAJ6YCgt AFaWeLHniHCMzG5QQ3rP70nZy1sUSW3/70EEQG9ZUH+wc6KD1Pna7QGkjI/m/B9gqZ0X 4Hsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=wLKH34A8RJSu6n0zXlFAJjjAxtGr+rwms4LzWjAiJ8A=; b=KraonbArOopPYnrhGXYjWdTr/Pz19P9D355eGXVvNpDveWU6FJXw2I7Mpe8PshXEcw NzmouQ+WQKa02mQKZB0VT0xoOstl2LJey1Eu8oi1ZKd9u5av1YcYZOQ16DRWwQZ1BNJN TSIiu2hTs11X87O5a/+XJnOmxrFi/B7rdMRPOaBiEHteYIjhqP2Hyal7t15sABNlJFsL 4LGzVjbWmVH7FyNQ8p3MRdtsp4aDGPYAdOZ4dmKYwx6u43BP7RJ0DZXIEl9OvlLj+Mhb fIGHmtKmm+T06GEkPbxkYS0VJljZvMzBV3k5MzogBEZ0PLkVHltjCEu4PZEo/Y9RVoH7 Izfw== X-Gm-Message-State: AOAM531C8zqXRTGKVJXriUyKaPQhU1mkpqwd9jMoWwHgK6LkYmllgA4T 97R9j3p3pZuNTl002u84f/gtlIc= X-Google-Smtp-Source: ABdhPJzvZt9bG2vKTkiCwRiHO+5g52EKhUdkbrWU16pvBaE7bf3U8L3vVVJYqo+Frr8QDDOOzvSx4qE= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:a25:d64e:: with SMTP id n75mr38310347ybg.322.1604524712270; Wed, 04 Nov 2020 13:18:32 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:10 -0800 In-Reply-To: Message-Id: <0eb601a5d1906fadd7099149eb605181911cfc04.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 7/8] signal: define the field siginfo.si_faultflags From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211934_447421_C51A1D68 X-CRM114-Status: GOOD ( 43.73 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org This field will contain flags that may be used by signal handlers to determine whether other fields in the _sigfault portion of siginfo are valid. An example use case is the following patch, which introduces the si_addr_tag_bits{,_mask} fields. A new sigcontext flag, SA_FAULTFLAGS, is introduced in order to allow a signal handler to require the kernel to set the field (but note that the field will be set anyway if the kernel supports the flag, regardless of its value). In combination with the previous patches, this allows a userspace program to determine whether the kernel will set the field. It is possible for an si_faultflags-unaware program to cause a signal handler in an si_faultflags-aware program to be called with a provided siginfo data structure by using one of the following syscalls: - ptrace(PTRACE_SETSIGINFO) - pidfd_send_signal - rt_sigqueueinfo - rt_tgsigqueueinfo So we need to prevent the si_faultflags-unaware program from causing an uninitialized read of si_faultflags in the si_faultflags-aware program when it uses one of these syscalls. The last three cases can be handled by observing that each of these syscalls fails if si_code >= 0. We also observe that kill(2) and tgkill(2) may be used to send a signal where si_code == 0 (SI_USER), so we define si_faultflags to only be valid if si_code > 0. There is no such check on si_code in ptrace(PTRACE_SETSIGINFO), so we make ptrace(PTRACE_SETSIGINFO) clear the si_faultflags field if it detects that the signal would use the _sigfault layout, and introduce a new ptrace request type, PTRACE_SETSIGINFO2, that a si_faultflags-aware program may use to opt out of this behavior. It is also possible for the kernel to inject a signal specified to use _sigfault by calling force_sig (e.g. there are numerous calls to force_sig(SIGSEGV)). In this case si_code is set to SI_KERNEL and the _kill union member is used, so document that si_code must be < SI_KERNEL. Ideally this field could have just been named si_flags, but that name was already taken by ia64, so a different name was chosen. I considered making ia64's si_flags a generic field and having it appear at the end of _sigfault (in the same place as this patch has si_faultflags) on non-ia64, keeping it in the same place on ia64. ia64's si_flags is a 32-bit field with only one flag bit allocated, so we would have 31 bits to use if we do this. However, it seems simplest to avoid entangling these fields. Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/Ide155ce29366c3eab2a944ae4c51205982e5b8b2 --- v14: - make the padding explicit so we can easily use it later v13: - renamed si_xflags to si_faultflags - use fallthrough macros in kernel/ptrace.c - fixed a style warning pointed out by checkpatch.pl v12: - Change type of si_xflags to u32 to avoid increasing alignment - Add si_xflags to signal_compat.c test cases v11: - update comment to say that si_code must > 0 - change ptrace(PTRACE_SETSIGINFO2) to take a flags argument v10: - make the new field compatible with the various ways that a siginfo can be injected from another process - eliminate some duplication by adding a refactoring patch before this one arch/powerpc/platforms/powernv/vas-fault.c | 1 + arch/x86/kernel/signal_compat.c | 7 +++-- include/linux/compat.h | 2 ++ include/linux/signal_types.h | 2 +- include/uapi/asm-generic/siginfo.h | 7 +++++ include/uapi/asm-generic/signal-defs.h | 4 +++ include/uapi/linux/ptrace.h | 12 ++++++++ kernel/ptrace.c | 33 ++++++++++++++++++---- kernel/signal.c | 3 ++ 9 files changed, 62 insertions(+), 9 deletions(-) diff --git a/arch/powerpc/platforms/powernv/vas-fault.c b/arch/powerpc/platforms/powernv/vas-fault.c index 3d21fce254b7..877e7d5fb4a2 100644 --- a/arch/powerpc/platforms/powernv/vas-fault.c +++ b/arch/powerpc/platforms/powernv/vas-fault.c @@ -154,6 +154,7 @@ static void update_csb(struct vas_window *window, info.si_errno = EFAULT; info.si_code = SEGV_MAPERR; info.si_addr = csb_addr; + info.si_faultflags = 0; /* * process will be polling on csb.flags after request is sent to diff --git a/arch/x86/kernel/signal_compat.c b/arch/x86/kernel/signal_compat.c index ddfd919be46c..222ff6178571 100644 --- a/arch/x86/kernel/signal_compat.c +++ b/arch/x86/kernel/signal_compat.c @@ -121,8 +121,8 @@ static inline void signal_compat_build_tests(void) #endif CHECK_CSI_OFFSET(_sigfault); - CHECK_CSI_SIZE (_sigfault, 4*sizeof(int)); - CHECK_SI_SIZE (_sigfault, 8*sizeof(int)); + CHECK_CSI_SIZE (_sigfault, 8*sizeof(int)); + CHECK_SI_SIZE (_sigfault, 16*sizeof(int)); BUILD_BUG_ON(offsetof(siginfo_t, si_addr) != 0x10); BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr) != 0x0C); @@ -138,6 +138,9 @@ static inline void signal_compat_build_tests(void) BUILD_BUG_ON(offsetof(siginfo_t, si_pkey) != 0x20); BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pkey) != 0x14); + BUILD_BUG_ON(offsetof(siginfo_t, si_faultflags) != 0x48); + BUILD_BUG_ON(offsetof(compat_siginfo_t, si_faultflags) != 0x28); + CHECK_CSI_OFFSET(_sigpoll); CHECK_CSI_SIZE (_sigpoll, 2*sizeof(int)); CHECK_SI_SIZE (_sigpoll, 4*sizeof(int)); diff --git a/include/linux/compat.h b/include/linux/compat.h index 14d514233e1d..84d3b72be701 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -236,7 +236,9 @@ typedef struct compat_siginfo { char _dummy_pkey[__COMPAT_ADDR_BND_PKEY_PAD]; u32 _pkey; } _addr_pkey; + compat_uptr_t _pad[6]; }; + u32 _faultflags; } _sigfault; /* SIGPOLL */ diff --git a/include/linux/signal_types.h b/include/linux/signal_types.h index a7887ad84d36..7501209eae33 100644 --- a/include/linux/signal_types.h +++ b/include/linux/signal_types.h @@ -78,6 +78,6 @@ struct ksignal { #define UAPI_SA_FLAGS \ (SA_NOCLDSTOP | SA_NOCLDWAIT | SA_SIGINFO | SA_ONSTACK | SA_RESTART | \ - SA_NODEFER | SA_RESETHAND | __ARCH_UAPI_SA_FLAGS) + SA_NODEFER | SA_RESETHAND | SA_FAULTFLAGS | __ARCH_UAPI_SA_FLAGS) #endif /* _LINUX_SIGNAL_TYPES_H */ diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h index 7aacf9389010..10a55aed9ede 100644 --- a/include/uapi/asm-generic/siginfo.h +++ b/include/uapi/asm-generic/siginfo.h @@ -91,7 +91,12 @@ union __sifields { char _dummy_pkey[__ADDR_BND_PKEY_PAD]; __u32 _pkey; } _addr_pkey; + void *_pad[6]; }; + __u32 _faultflags; +#ifdef __LP64__ + __u32 _pad2; /* to be used if we add another 32-bit field */ +#endif } _sigfault; /* SIGPOLL */ @@ -152,6 +157,8 @@ typedef struct siginfo { #define si_trapno _sifields._sigfault._trapno #endif #define si_addr_lsb _sifields._sigfault._addr_lsb +/* si_faultflags is only valid if 0 < si_code < SI_KERNEL */ +#define si_faultflags _sifields._sigfault._faultflags #define si_lower _sifields._sigfault._addr_bnd._lower #define si_upper _sifields._sigfault._addr_bnd._upper #define si_pkey _sifields._sigfault._addr_pkey._pkey diff --git a/include/uapi/asm-generic/signal-defs.h b/include/uapi/asm-generic/signal-defs.h index 0126ebda4d31..e27bf959d4c4 100644 --- a/include/uapi/asm-generic/signal-defs.h +++ b/include/uapi/asm-generic/signal-defs.h @@ -20,6 +20,9 @@ * so this bit allows flag bit support to be detected from userspace while * allowing an old kernel to be distinguished from a kernel that supports every * flag bit. + * SA_FAULTFLAGS indicates that the signal handler requires the siginfo.si_faultflags + * field to be valid. Note that if the kernel supports SA_FAULTFLAGS, the field will + * be valid regardless of the value of this flag. * * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single * Unix names RESETHAND and NODEFER respectively. @@ -49,6 +52,7 @@ #define SA_RESETHAND 0x80000000 #endif #define SA_UNSUPPORTED 0x00000400 +#define SA_FAULTFLAGS 0x00000800 #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND diff --git a/include/uapi/linux/ptrace.h b/include/uapi/linux/ptrace.h index a71b6e3b03eb..722a2c8a4d3d 100644 --- a/include/uapi/linux/ptrace.h +++ b/include/uapi/linux/ptrace.h @@ -101,6 +101,18 @@ struct ptrace_syscall_info { }; }; +#define PTRACE_SETSIGINFO2 0x420f +/* + * These flags are passed as the addr argument to ptrace. + */ + +/* + * Asserts that the caller is aware of the field siginfo.si_faultflags. Prevents + * the kernel from automatically setting the field to 0 when the signal uses + * a sigfault layout. + */ +#define PTRACE_SIGINFO_FAULTFLAGS 0x1 + /* * These values are stored in task->ptrace_message * by tracehook_report_syscall_* to describe the current syscall-stop. diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 43d6179508d6..ab0618b4602c 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -687,18 +687,31 @@ static int ptrace_getsiginfo(struct task_struct *child, kernel_siginfo_t *info) return error; } -static int ptrace_setsiginfo(struct task_struct *child, const kernel_siginfo_t *info) +static int ptrace_setsiginfo(struct task_struct *child, unsigned long flags, + kernel_siginfo_t *info) { - unsigned long flags; + unsigned long lock_flags; int error = -ESRCH; - if (lock_task_sighand(child, &flags)) { + if (flags & ~PTRACE_SIGINFO_FAULTFLAGS) + return -EINVAL; + + /* + * If the caller is unaware of si_faultflags and we're using a layout that + * requires it, set it to 0 which means "no fields are available". + */ + if (!(flags & PTRACE_SIGINFO_FAULTFLAGS) && + siginfo_layout_is_fault( + siginfo_layout(info->si_signo, info->si_code))) + info->si_faultflags = 0; + + if (lock_task_sighand(child, &lock_flags)) { error = -EINVAL; if (likely(child->last_siginfo != NULL)) { copy_siginfo(child->last_siginfo, info); error = 0; } - unlock_task_sighand(child, &flags); + unlock_task_sighand(child, &lock_flags); } return error; } @@ -1038,9 +1051,13 @@ int ptrace_request(struct task_struct *child, long request, break; case PTRACE_SETSIGINFO: + addr = 0; + fallthrough; + + case PTRACE_SETSIGINFO2: ret = copy_siginfo_from_user(&siginfo, datavp); if (!ret) - ret = ptrace_setsiginfo(child, &siginfo); + ret = ptrace_setsiginfo(child, addr, &siginfo); break; case PTRACE_GETSIGMASK: { @@ -1347,10 +1364,14 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request, break; case PTRACE_SETSIGINFO: + addr = 0; + fallthrough; + + case PTRACE_SETSIGINFO2: ret = copy_siginfo_from_user32( &siginfo, (struct compat_siginfo __user *) datap); if (!ret) - ret = ptrace_setsiginfo(child, &siginfo); + ret = ptrace_setsiginfo(child, addr, &siginfo); break; #ifdef CONFIG_HAVE_ARCH_TRACEHOOK case PTRACE_GETREGSET: diff --git a/kernel/signal.c b/kernel/signal.c index d18930aafbf4..1fd1f0d12174 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1657,6 +1657,7 @@ static void set_sigfault_common_fields(struct kernel_siginfo *info, int sig, info->si_errno = 0; info->si_code = code; info->si_addr = addr; + info->si_faultflags = 0; } int force_sig_fault_to_task(int sig, int code, void __user *addr @@ -3270,6 +3271,7 @@ void copy_siginfo_to_external32(struct compat_siginfo *to, #ifdef __ARCH_SI_TRAPNO to->si_trapno = from->si_trapno; #endif + to->si_faultflags = from->si_faultflags; } switch (layout) { @@ -3345,6 +3347,7 @@ static int post_copy_siginfo_from_user32(kernel_siginfo_t *to, #ifdef __ARCH_SI_TRAPNO to->si_trapno = from->si_trapno; #endif + to->si_faultflags = from->si_faultflags; } switch (layout) { From patchwork Wed Nov 4 21:18:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Collingbourne X-Patchwork-Id: 11883121 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 37058C388F9 for ; Thu, 5 Nov 2020 04:24:43 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 6D4C620795 for ; Thu, 5 Nov 2020 04:24:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="0tYi51KM"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="rSE1wH2r"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="lAawHqnL" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6D4C620795 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Lmv8Hh5eblg1B5ULQ2ngFzku9yu5kbu7bC2aKvMBJFQ=; b=0tYi51KM6KIPC4lhesem1dCzw 5pnHsCl5LCH8g/xFPSBOXAr7Ec1luJY8b+sAr0FaXCYXwwWb70jaXJ/dWtEdJTl/ifkZKL92JXTiT Bi28ip1d/nPqWVp5OChR+3IEId3dA+adVtu27ivdgrGX/VUQCNV2G+rQOnrseLRY/zznM+fGuZ2RA mfLB5H2DYT+iNr0BBUjQf3SwVvXK2qGYI29KCv9kJwYdxOhwq6X7e+aSWkZEHZPavNbaRv5Qp+B6I sXxMPO4F8wks9MK4lvhaRTbynRQyFygtRN49uL7KGW0rsPDTTcOZchSZ4TZ0BDZ8uebQIAS/EKb8/ l6vbE004Q==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaWna-0006Ly-K2; Thu, 05 Nov 2020 04:22:58 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaW7s-00016k-93 for linux-arm-kernel@merlin.infradead.org; Thu, 05 Nov 2020 03:39:52 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:Cc:To:From:Subject: References:Mime-Version:Message-Id:In-Reply-To:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=4hj3UOXnuHarPKRaqjh4G64hvoGixgbDduqId6sPxBQ=; b=rSE1wH2rC+QXIczxulhCrhyC86 RkY8oQjQrnnhrczqy4KlGtk9Ut+ahwz/b2vc6EB6FOvqfhMhjJh1ivmRv40ZlRdF2CsL35d/7CY3v Q413wVmMAS1sgocNT+bJ08fiS2wkqkyRWfSdhMdfAJZWmFCuaN5a8uC6pm1WNNMshrSRkxVuNjes6 wmBOW0Ymh1S+2tpKEQNY9CPI4J+IUvOLraTu1rxFMKY1YVUfv335ftaAwLneEq51hBWC81OODTEPS 7Lu88BBSF6eI2peeniVL3u4TcRrXmxapkA6myAnt20lE70gYQFQgkd4tcIxnfbdEh4El1EoTaqGx6 nbaM0cZg==; Received: from mail-yb1-xb49.google.com ([2607:f8b0:4864:20::b49]) by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kaQBt-0000qz-IN for linux-arm-kernel@lists.infradead.org; Wed, 04 Nov 2020 21:19:42 +0000 Received: by mail-yb1-xb49.google.com with SMTP id h64so133531ybc.1 for ; Wed, 04 Nov 2020 13:19:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=4hj3UOXnuHarPKRaqjh4G64hvoGixgbDduqId6sPxBQ=; b=lAawHqnLbSUtTQ8KoQWBl3WK/UdTFWgTBpK5HjtsvhauUSOHYrQg1GwkYdJ3Hf2NIe F05k3tH3IORIdfFTqvX5tO0FfDQ+IipuzymL3FcTi4nCikMRZHPyQBqIsLl8MV+cVwqs CVrBVlHXqVI1eLtfymH2fJofVKSlAO++BlL6uy6SXVQaaYeCqgOdBO41o4dT/Gj+W8Xn 5JQd4VYfKD1GWRKHykG8G4qdkEgowaDgdNFbOTu+rw4Z/z7tjrCzVxdQJczmJhfx6kGT qQdagw1fP7MLBPegyPLo/rrEni7VUy6JwSfuuzM2oJgVDCpTKvVPRugt/UULsfLPDy+f lj1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=4hj3UOXnuHarPKRaqjh4G64hvoGixgbDduqId6sPxBQ=; b=farussp5SRnJdT0t/V+Uayv84bhdyQFWbfVIMkCmkP/we6/I6Rte6nT29qhzwwubVT N65eUJrduSeVUi1uG7C9tjoPqpEYymKWN81vypQ7Xu415c4Q74nliYQeOoJaB/gttMsj 9jnDIjTO1sVIHf9AxRWVdkX5D+YU5wMuMaKy2OlcioRL5yNP9ZHp0bI93bIYQoSmLv2B jNFeB8zwvvGkh1KMF3cuZxA8zn46Fo2JsgPO45r8JTPFbSgPzGz4+RXb0tzhtVyUTpZT lnTyVK8TG8R7E7Jt48CWHIX/9T4m6gDn1aLTW60nptACJ2lWFt2NX5WhnNisniEZjaKY SFdQ== X-Gm-Message-State: AOAM532ifUks0YMDYtTidJiz9H32Z0Omln7ovCgDoAJ/sLvD7nXuA+iC vb8Uc1OZ1Zh+LjmNINK8uHwiIpA= X-Google-Smtp-Source: ABdhPJw63mGq06X0L7mANfTcxqtuqEpR+zi9ToXYEDo93ZyojtbICQQVTykkTJPjXd5DY0TaSDGYma0= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:0:7220:84ff:fe09:385a]) (user=pcc job=sendgmr) by 2002:a25:c6d6:: with SMTP id k205mr38308419ybf.206.1604524713988; Wed, 04 Nov 2020 13:18:33 -0800 (PST) Date: Wed, 4 Nov 2020 13:18:11 -0800 In-Reply-To: Message-Id: <0ce3d90b5d6a4457b2fe3b0582f61fab70b17dfc.1604523707.git.pcc@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v14 8/8] arm64: expose FAR_EL1 tag bits in siginfo From: Peter Collingbourne To: Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201104_211937_906598_6381EF67 X-CRM114-Status: GOOD ( 33.55 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrey Konovalov , Helge Deller , Kevin Brodsky , linux-api@vger.kernel.org, David Spickett , Peter Collingbourne , Linux ARM , Richard Henderson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The kernel currently clears the tag bits (i.e. bits 56-63) in the fault address exposed via siginfo.si_addr and sigcontext.fault_address. However, the tag bits may be needed by tools in order to accurately diagnose memory errors, such as HWASan [1] or future tools based on the Memory Tagging Extension (MTE). We should not stop clearing these bits in the existing fault address fields, because there may be existing userspace applications that are expecting the tag bits to be cleared. Instead, create a new pair of fields in siginfo._sigfault, and store the tag bits of FAR_EL1 there, together with a mask specifying which bits are valid. A flag is added to si_faultflags to allow userspace to determine whether the values in the fields are valid. [1] http://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html Signed-off-by: Peter Collingbourne Link: https://linux-review.googlesource.com/id/Ia8876bad8c798e0a32df7c2ce1256c4771c81446 --- v14: - fix an inaccuracy in the commit message - add some comments to arch_addr_tag_bits_mask v13: - renamed si_xflags to si_faultflags - rebased to 5.10-rc2 v12: - add new fields to signal_compat.c test cases - rebased to 5.10-rc1 - mask out bits 63:60 for tag check faults v11: - add a comment explaining what the arch hook should do - rename ignored bits to tag bits v10: - rename the flag to SIFAULTFLAG_ADDR_IGNORED_BITS - use an arch hook to specify which bits are ignored, instead of passing them explicitly - while refactoring for the arch hook, noticed that my previous patches missed a case involving cache maintenance instructions, so expose the tag bits for that signal as well v9: - make the ignored bits fields generic - add some new dependent patches that prepare us to store the field in such a way that userspace can detect their presence v8: - rebase onto 5.8rc2 v7: - switch to a new siginfo field instead of using sigcontext - merge the patch back into one since the other patches are now unnecessary v6: - move fault address and fault code into the kernel_siginfo data structure - split the patch in three since it was getting large and now has generic and arch-specific parts v5: - add padding to fault_addr_top_byte_context in order to ensure the correct size and preserve sp alignment v4: - expose only the tag bits in the context instead of the entire FAR_EL1 - remove mention of the new context from the sigcontext.__reserved[] note v3: - add documentation to tagged-pointers.rst - update comments in sigcontext.h v2: - revert changes to hw_breakpoint.c - rename set_thread_esr to set_thread_far_esr Documentation/arm64/tagged-pointers.rst | 21 +++++--- arch/arm64/include/asm/exception.h | 2 +- arch/arm64/include/asm/signal.h | 31 +++++++++++ arch/arm64/include/asm/system_misc.h | 2 +- arch/arm64/include/asm/traps.h | 6 +-- arch/arm64/kernel/debug-monitors.c | 5 +- arch/arm64/kernel/entry-common.c | 2 - arch/arm64/kernel/ptrace.c | 7 +-- arch/arm64/kernel/sys_compat.c | 5 +- arch/arm64/kernel/traps.c | 29 ++++++----- arch/arm64/mm/fault.c | 68 ++++++++++++++----------- arch/x86/kernel/signal_compat.c | 9 +++- include/linux/compat.h | 2 + include/linux/signal.h | 16 ++++++ include/uapi/asm-generic/siginfo.h | 10 ++++ kernel/signal.c | 18 ++++++- 16 files changed, 160 insertions(+), 73 deletions(-) create mode 100644 arch/arm64/include/asm/signal.h diff --git a/Documentation/arm64/tagged-pointers.rst b/Documentation/arm64/tagged-pointers.rst index eab4323609b9..7d07987ad85a 100644 --- a/Documentation/arm64/tagged-pointers.rst +++ b/Documentation/arm64/tagged-pointers.rst @@ -53,12 +53,21 @@ visibility. Preserving tags --------------- -Non-zero tags are not preserved when delivering signals. This means that -signal handlers in applications making use of tags cannot rely on the -tag information for user virtual addresses being maintained for fields -inside siginfo_t. One exception to this rule is for signals raised in -response to watchpoint debug exceptions, where the tag information will -be preserved. +Non-zero tags are not preserved in the fault address fields +siginfo.si_addr or sigcontext.fault_address when delivering +signals. This means that signal handlers in applications making use +of tags cannot rely on the tag information for user virtual addresses +being maintained in these fields. One exception to this rule is for +signals raised in response to watchpoint debug exceptions, where the +tag information will be preserved. + +The fault address tag is preserved in the si_addr_tag_bits field +of siginfo, which is set for signals raised in response to data aborts +and instruction aborts. The si_addr_tag_bits_mask field indicates +which bits of the field are valid. The validity of these fields is +indicated by the SIFAULTFLAG_ADDR_TAG_BITS flag in siginfo.si_faultflags, +and the validity of si_faultflags in turn is indicated by the kernel +indicating support for the sigaction.sa_flags flag SA_FAULTFLAGS. The architecture prevents the use of a tagged PC, so the upper byte will be set to a sign-extension of bit 55 on exception return. diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h index 99b9383cd036..2a8aa1884d8a 100644 --- a/arch/arm64/include/asm/exception.h +++ b/arch/arm64/include/asm/exception.h @@ -32,7 +32,7 @@ static inline u32 disr_to_esr(u64 disr) } asmlinkage void enter_from_user_mode(void); -void do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs); +void do_mem_abort(unsigned long far, unsigned int esr, struct pt_regs *regs); void do_undefinstr(struct pt_regs *regs); void do_bti(struct pt_regs *regs); asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr); diff --git a/arch/arm64/include/asm/signal.h b/arch/arm64/include/asm/signal.h new file mode 100644 index 000000000000..67d8e0899e9b --- /dev/null +++ b/arch/arm64/include/asm/signal.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __ARM64_ASM_SIGNAL_H +#define __ARM64_ASM_SIGNAL_H + +#include +#include + +static inline unsigned long arch_addr_tag_bits_mask(unsigned long sig, + unsigned long si_code) +{ + /* + * For historical reasons, all bits of the fault address are exposed as + * address bits for watchpoint exceptions. New architectures should not + * follow this practice. + */ + if (sig == SIGTRAP && si_code == TRAP_BRKPT) + return 0; + + /* + * FAR_EL1[63:60] are UNKNOWN for tag check faults so reflect that in + * the tag bits mask. The bits are already being masked out by + * do_tag_check_fault so userspace won't see them in si_addr. + */ + if (sig == SIGSEGV && si_code == SEGV_MTESERR) + return 0xfUL << 56; + + return 0xffUL << 56; +} +#define arch_addr_tag_bits_mask arch_addr_tag_bits_mask + +#endif diff --git a/arch/arm64/include/asm/system_misc.h b/arch/arm64/include/asm/system_misc.h index 1ab63cfbbaf1..673be2d1263c 100644 --- a/arch/arm64/include/asm/system_misc.h +++ b/arch/arm64/include/asm/system_misc.h @@ -22,7 +22,7 @@ void die(const char *msg, struct pt_regs *regs, int err); struct siginfo; void arm64_notify_die(const char *str, struct pt_regs *regs, - int signo, int sicode, void __user *addr, + int signo, int sicode, unsigned long far, int err); void hook_debug_fault_code(int nr, int (*fn)(unsigned long, unsigned int, diff --git a/arch/arm64/include/asm/traps.h b/arch/arm64/include/asm/traps.h index d96dc2c7c09d..54f32a0675df 100644 --- a/arch/arm64/include/asm/traps.h +++ b/arch/arm64/include/asm/traps.h @@ -26,9 +26,9 @@ void register_undef_hook(struct undef_hook *hook); void unregister_undef_hook(struct undef_hook *hook); void force_signal_inject(int signal, int code, unsigned long address, unsigned int err); void arm64_notify_segfault(unsigned long addr); -void arm64_force_sig_fault(int signo, int code, void __user *addr, const char *str); -void arm64_force_sig_mceerr(int code, void __user *addr, short lsb, const char *str); -void arm64_force_sig_ptrace_errno_trap(int errno, void __user *addr, const char *str); +void arm64_force_sig_fault(int signo, int code, unsigned long far, const char *str); +void arm64_force_sig_mceerr(int code, unsigned long far, short lsb, const char *str); +void arm64_force_sig_ptrace_errno_trap(int errno, unsigned long far, const char *str); /* * Move regs->pc to next instruction and do necessary setup before it diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c index fa76151de6ff..4f3661eeb7ec 100644 --- a/arch/arm64/kernel/debug-monitors.c +++ b/arch/arm64/kernel/debug-monitors.c @@ -234,9 +234,8 @@ static void send_user_sigtrap(int si_code) if (interrupts_enabled(regs)) local_irq_enable(); - arm64_force_sig_fault(SIGTRAP, si_code, - (void __user *)instruction_pointer(regs), - "User debug trap"); + arm64_force_sig_fault(SIGTRAP, si_code, instruction_pointer(regs), + "User debug trap"); } static int single_step_handler(unsigned long unused, unsigned int esr, diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c index 43d4c329775f..dbbddfbf4a72 100644 --- a/arch/arm64/kernel/entry-common.c +++ b/arch/arm64/kernel/entry-common.c @@ -22,7 +22,6 @@ static void notrace el1_abort(struct pt_regs *regs, unsigned long esr) unsigned long far = read_sysreg(far_el1); local_daif_inherit(regs); - far = untagged_addr(far); do_mem_abort(far, esr, regs); } NOKPROBE_SYMBOL(el1_abort); @@ -114,7 +113,6 @@ static void notrace el0_da(struct pt_regs *regs, unsigned long esr) user_exit_irqoff(); local_daif_restore(DAIF_PROCCTX); - far = untagged_addr(far); do_mem_abort(far, esr, regs); } NOKPROBE_SYMBOL(el0_da); diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index f49b349e16a3..8ac487c84e37 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -192,14 +192,11 @@ static void ptrace_hbptriggered(struct perf_event *bp, break; } } - arm64_force_sig_ptrace_errno_trap(si_errno, - (void __user *)bkpt->trigger, + arm64_force_sig_ptrace_errno_trap(si_errno, bkpt->trigger, desc); } #endif - arm64_force_sig_fault(SIGTRAP, TRAP_HWBKPT, - (void __user *)(bkpt->trigger), - desc); + arm64_force_sig_fault(SIGTRAP, TRAP_HWBKPT, bkpt->trigger, desc); } /* diff --git a/arch/arm64/kernel/sys_compat.c b/arch/arm64/kernel/sys_compat.c index 3c18c2454089..265fe3eb1069 100644 --- a/arch/arm64/kernel/sys_compat.c +++ b/arch/arm64/kernel/sys_compat.c @@ -68,7 +68,7 @@ do_compat_cache_op(unsigned long start, unsigned long end, int flags) */ long compat_arm_syscall(struct pt_regs *regs, int scno) { - void __user *addr; + unsigned long addr; switch (scno) { /* @@ -111,8 +111,7 @@ long compat_arm_syscall(struct pt_regs *regs, int scno) break; } - addr = (void __user *)instruction_pointer(regs) - - (compat_thumb_mode(regs) ? 2 : 4); + addr = instruction_pointer(regs) - (compat_thumb_mode(regs) ? 2 : 4); arm64_notify_die("Oops - bad compat syscall(2)", regs, SIGILL, ILL_ILLTRP, addr, scno); diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 8af4e0e85736..f4ddbe9ed3f1 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -170,32 +170,32 @@ static void arm64_show_signal(int signo, const char *str) __show_regs(regs); } -void arm64_force_sig_fault(int signo, int code, void __user *addr, +void arm64_force_sig_fault(int signo, int code, unsigned long far, const char *str) { arm64_show_signal(signo, str); if (signo == SIGKILL) force_sig(SIGKILL); else - force_sig_fault(signo, code, addr); + force_sig_fault(signo, code, (void __user *)far); } -void arm64_force_sig_mceerr(int code, void __user *addr, short lsb, +void arm64_force_sig_mceerr(int code, unsigned long far, short lsb, const char *str) { arm64_show_signal(SIGBUS, str); - force_sig_mceerr(code, addr, lsb); + force_sig_mceerr(code, (void __user *)far, lsb); } -void arm64_force_sig_ptrace_errno_trap(int errno, void __user *addr, +void arm64_force_sig_ptrace_errno_trap(int errno, unsigned long far, const char *str) { arm64_show_signal(SIGTRAP, str); - force_sig_ptrace_errno_trap(errno, addr); + force_sig_ptrace_errno_trap(errno, (void __user *)far); } void arm64_notify_die(const char *str, struct pt_regs *regs, - int signo, int sicode, void __user *addr, + int signo, int sicode, unsigned long far, int err) { if (user_mode(regs)) { @@ -203,7 +203,7 @@ void arm64_notify_die(const char *str, struct pt_regs *regs, current->thread.fault_address = 0; current->thread.fault_code = err; - arm64_force_sig_fault(signo, sicode, addr, str); + arm64_force_sig_fault(signo, sicode, far, str); } else { die(str, regs, err); } @@ -374,7 +374,7 @@ void force_signal_inject(int signal, int code, unsigned long address, unsigned i signal = SIGKILL; } - arm64_notify_die(desc, regs, signal, code, (void __user *)address, err); + arm64_notify_die(desc, regs, signal, code, address, err); } /* @@ -385,7 +385,7 @@ void arm64_notify_segfault(unsigned long addr) int code; mmap_read_lock(current->mm); - if (find_vma(current->mm, addr) == NULL) + if (find_vma(current->mm, untagged_addr(addr)) == NULL) code = SEGV_MAPERR; else code = SEGV_ACCERR; @@ -448,12 +448,13 @@ NOKPROBE_SYMBOL(do_ptrauth_fault); static void user_cache_maint_handler(unsigned int esr, struct pt_regs *regs) { - unsigned long address; + unsigned long tagged_address, address; int rt = ESR_ELx_SYS64_ISS_RT(esr); int crm = (esr & ESR_ELx_SYS64_ISS_CRM_MASK) >> ESR_ELx_SYS64_ISS_CRM_SHIFT; int ret = 0; - address = untagged_addr(pt_regs_read_reg(regs, rt)); + tagged_address = pt_regs_read_reg(regs, rt); + address = untagged_addr(tagged_address); switch (crm) { case ESR_ELx_SYS64_ISS_CRM_DC_CVAU: /* DC CVAU, gets promoted */ @@ -480,7 +481,7 @@ static void user_cache_maint_handler(unsigned int esr, struct pt_regs *regs) } if (ret) - arm64_notify_segfault(address); + arm64_notify_segfault(tagged_address); else arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE); } @@ -772,7 +773,7 @@ asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr) */ void bad_el0_sync(struct pt_regs *regs, int reason, unsigned int esr) { - void __user *pc = (void __user *)instruction_pointer(regs); + unsigned long pc = instruction_pointer(regs); current->thread.fault_address = 0; current->thread.fault_code = esr; diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 1ee94002801f..c5375cb7763d 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -40,7 +40,7 @@ #include struct fault_info { - int (*fn)(unsigned long addr, unsigned int esr, + int (*fn)(unsigned long far, unsigned int esr, struct pt_regs *regs); int sig; int code; @@ -385,8 +385,11 @@ static void set_thread_esr(unsigned long address, unsigned int esr) current->thread.fault_code = esr; } -static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs) +static void do_bad_area(unsigned long far, unsigned int esr, + struct pt_regs *regs) { + unsigned long addr = untagged_addr(far); + /* * If we are in kernel mode at this point, we have no context to * handle this fault with. @@ -395,8 +398,7 @@ static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *re const struct fault_info *inf = esr_to_fault_info(esr); set_thread_esr(addr, esr); - arm64_force_sig_fault(inf->sig, inf->code, (void __user *)addr, - inf->name); + arm64_force_sig_fault(inf->sig, inf->code, far, inf->name); } else { __do_kernel_fault(addr, esr, regs); } @@ -448,7 +450,7 @@ static bool is_write_abort(unsigned int esr) return (esr & ESR_ELx_WNR) && !(esr & ESR_ELx_CM); } -static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, +static int __kprobes do_page_fault(unsigned long far, unsigned int esr, struct pt_regs *regs) { const struct fault_info *inf; @@ -456,6 +458,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, vm_fault_t fault; unsigned long vm_flags = VM_ACCESS_FLAGS; unsigned int mm_flags = FAULT_FLAG_DEFAULT; + unsigned long addr = untagged_addr(far); if (kprobe_page_fault(regs, esr)) return 0; @@ -567,8 +570,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, * We had some memory, but were unable to successfully fix up * this page fault. */ - arm64_force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)addr, - inf->name); + arm64_force_sig_fault(SIGBUS, BUS_ADRERR, far, inf->name); } else if (fault & (VM_FAULT_HWPOISON_LARGE | VM_FAULT_HWPOISON)) { unsigned int lsb; @@ -576,8 +578,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, if (fault & VM_FAULT_HWPOISON_LARGE) lsb = hstate_index_to_shift(VM_FAULT_GET_HINDEX(fault)); - arm64_force_sig_mceerr(BUS_MCEERR_AR, (void __user *)addr, lsb, - inf->name); + arm64_force_sig_mceerr(BUS_MCEERR_AR, far, lsb, inf->name); } else { /* * Something tried to access memory that isn't in our memory @@ -585,8 +586,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, */ arm64_force_sig_fault(SIGSEGV, fault == VM_FAULT_BADACCESS ? SEGV_ACCERR : SEGV_MAPERR, - (void __user *)addr, - inf->name); + far, inf->name); } return 0; @@ -596,33 +596,35 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, return 0; } -static int __kprobes do_translation_fault(unsigned long addr, +static int __kprobes do_translation_fault(unsigned long far, unsigned int esr, struct pt_regs *regs) { + unsigned long addr = untagged_addr(far); + if (is_ttbr0_addr(addr)) - return do_page_fault(addr, esr, regs); + return do_page_fault(far, esr, regs); - do_bad_area(addr, esr, regs); + do_bad_area(far, esr, regs); return 0; } -static int do_alignment_fault(unsigned long addr, unsigned int esr, +static int do_alignment_fault(unsigned long far, unsigned int esr, struct pt_regs *regs) { - do_bad_area(addr, esr, regs); + do_bad_area(far, esr, regs); return 0; } -static int do_bad(unsigned long addr, unsigned int esr, struct pt_regs *regs) +static int do_bad(unsigned long far, unsigned int esr, struct pt_regs *regs) { return 1; /* "fault" */ } -static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs) +static int do_sea(unsigned long far, unsigned int esr, struct pt_regs *regs) { const struct fault_info *inf; - void __user *siaddr; + unsigned long siaddr; inf = esr_to_fault_info(esr); @@ -635,18 +637,23 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs) } if (esr & ESR_ELx_FnV) - siaddr = NULL; + siaddr = 0; else - siaddr = (void __user *)addr; + siaddr = untagged_addr(far); arm64_notify_die(inf->name, regs, inf->sig, inf->code, siaddr, esr); return 0; } -static int do_tag_check_fault(unsigned long addr, unsigned int esr, +static int do_tag_check_fault(unsigned long far, unsigned int esr, struct pt_regs *regs) { - do_bad_area(addr, esr, regs); + /* + * The architecture specifies that bits 63:60 of FAR_EL1 are UNKNOWN for tag + * check faults. Mask them out now so that userspace doesn't see them. + */ + far &= (1UL << 60) - 1; + do_bad_area(far, esr, regs); return 0; } @@ -717,11 +724,12 @@ static const struct fault_info fault_info[] = { { do_bad, SIGKILL, SI_KERNEL, "unknown 63" }, }; -void do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs) +void do_mem_abort(unsigned long far, unsigned int esr, struct pt_regs *regs) { const struct fault_info *inf = esr_to_fault_info(esr); + unsigned long addr = untagged_addr(far); - if (!inf->fn(addr, esr, regs)) + if (!inf->fn(far, esr, regs)) return; if (!user_mode(regs)) { @@ -730,8 +738,7 @@ void do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs) show_pte(addr); } - arm64_notify_die(inf->name, regs, - inf->sig, inf->code, (void __user *)addr, esr); + arm64_notify_die(inf->name, regs, inf->sig, inf->code, addr, esr); } NOKPROBE_SYMBOL(do_mem_abort); @@ -744,8 +751,8 @@ NOKPROBE_SYMBOL(do_el0_irq_bp_hardening); void do_sp_pc_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs) { - arm64_notify_die("SP/PC alignment exception", regs, - SIGBUS, BUS_ADRALN, (void __user *)addr, esr); + arm64_notify_die("SP/PC alignment exception", regs, SIGBUS, BUS_ADRALN, + addr, esr); } NOKPROBE_SYMBOL(do_sp_pc_abort); @@ -871,8 +878,7 @@ void do_debug_exception(unsigned long addr_if_watchpoint, unsigned int esr, arm64_apply_bp_hardening(); if (inf->fn(addr_if_watchpoint, esr, regs)) { - arm64_notify_die(inf->name, regs, - inf->sig, inf->code, (void __user *)pc, esr); + arm64_notify_die(inf->name, regs, inf->sig, inf->code, pc, esr); } debug_exception_exit(regs); diff --git a/arch/x86/kernel/signal_compat.c b/arch/x86/kernel/signal_compat.c index 222ff6178571..41cbef515b95 100644 --- a/arch/x86/kernel/signal_compat.c +++ b/arch/x86/kernel/signal_compat.c @@ -121,8 +121,8 @@ static inline void signal_compat_build_tests(void) #endif CHECK_CSI_OFFSET(_sigfault); - CHECK_CSI_SIZE (_sigfault, 8*sizeof(int)); - CHECK_SI_SIZE (_sigfault, 16*sizeof(int)); + CHECK_CSI_SIZE (_sigfault, 10*sizeof(int)); + CHECK_SI_SIZE (_sigfault, 20*sizeof(int)); BUILD_BUG_ON(offsetof(siginfo_t, si_addr) != 0x10); BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr) != 0x0C); @@ -141,6 +141,11 @@ static inline void signal_compat_build_tests(void) BUILD_BUG_ON(offsetof(siginfo_t, si_faultflags) != 0x48); BUILD_BUG_ON(offsetof(compat_siginfo_t, si_faultflags) != 0x28); + BUILD_BUG_ON(offsetof(siginfo_t, si_addr_tag_bits) != 0x50); + BUILD_BUG_ON(offsetof(siginfo_t, si_addr_tag_bits_mask) != 0x58); + BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr_tag_bits) != 0x2C); + BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr_tag_bits_mask) != 0x30); + CHECK_CSI_OFFSET(_sigpoll); CHECK_CSI_SIZE (_sigpoll, 2*sizeof(int)); CHECK_SI_SIZE (_sigpoll, 4*sizeof(int)); diff --git a/include/linux/compat.h b/include/linux/compat.h index 84d3b72be701..f3c83a6d6623 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -239,6 +239,8 @@ typedef struct compat_siginfo { compat_uptr_t _pad[6]; }; u32 _faultflags; + compat_uptr_t _addr_tag_bits; + compat_uptr_t _addr_tag_bits_mask; } _sigfault; /* SIGPOLL */ diff --git a/include/linux/signal.h b/include/linux/signal.h index e9fb05041e7a..7fe7ce1d252e 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -482,4 +482,20 @@ struct seq_file; extern void render_sigset_t(struct seq_file *, const char *, sigset_t *); #endif +#ifndef arch_addr_tag_bits_mask +/* + * Given a signal and si_code which correspond to the _sigfault union member, + * if tag bits are present in the fault address which must appear in + * si_addr_tag_bits instead of si_addr, this hook must return a bitmask where 1 + * corresponds to bits appearing in si_addr_tag_bits and 0 corresponds to bits + * appearing in si_addr. The value returned by this function will also be + * available in si_addr_tag_bits_mask. + */ +static inline unsigned long arch_addr_tag_bits_mask(unsigned long sig, + unsigned long si_code) +{ + return 0; +} +#endif + #endif /* _LINUX_SIGNAL_H */ diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h index 10a55aed9ede..df196ad74238 100644 --- a/include/uapi/asm-generic/siginfo.h +++ b/include/uapi/asm-generic/siginfo.h @@ -97,6 +97,8 @@ union __sifields { #ifdef __LP64__ __u32 _pad2; /* to be used if we add another 32-bit field */ #endif + unsigned long _addr_tag_bits; + unsigned long _addr_tag_bits_mask; } _sigfault; /* SIGPOLL */ @@ -159,6 +161,8 @@ typedef struct siginfo { #define si_addr_lsb _sifields._sigfault._addr_lsb /* si_faultflags is only valid if 0 < si_code < SI_KERNEL */ #define si_faultflags _sifields._sigfault._faultflags +#define si_addr_tag_bits _sifields._sigfault._addr_tag_bits +#define si_addr_tag_bits_mask _sifields._sigfault._addr_tag_bits_mask #define si_lower _sifields._sigfault._addr_bnd._lower #define si_upper _sifields._sigfault._addr_bnd._upper #define si_pkey _sifields._sigfault._addr_pkey._pkey @@ -301,6 +305,12 @@ typedef struct siginfo { #define EMT_TAGOVF 1 /* tag overflow */ #define NSIGEMT 1 +/* + * SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT si_faultflags + */ +#define SIFAULTFLAG_ADDR_TAG_BITS 1 +/* si_addr_tag_bits{,_mask} fields valid */ + /* * sigevent definitions * diff --git a/kernel/signal.c b/kernel/signal.c index 1fd1f0d12174..aa69dd312bd5 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1653,11 +1653,16 @@ void force_sigsegv(int sig) static void set_sigfault_common_fields(struct kernel_siginfo *info, int sig, int code, void __user *addr) { + unsigned long addr_long = (unsigned long)addr; + unsigned long tag_bits_mask = arch_addr_tag_bits_mask(sig, code); + info->si_signo = sig; info->si_errno = 0; info->si_code = code; - info->si_addr = addr; - info->si_faultflags = 0; + info->si_addr = (void __user *)(addr_long & ~tag_bits_mask); + info->si_faultflags = SIFAULTFLAG_ADDR_TAG_BITS; + info->si_addr_tag_bits = addr_long & tag_bits_mask; + info->si_addr_tag_bits_mask = tag_bits_mask; } int force_sig_fault_to_task(int sig, int code, void __user *addr @@ -3272,6 +3277,13 @@ void copy_siginfo_to_external32(struct compat_siginfo *to, to->si_trapno = from->si_trapno; #endif to->si_faultflags = from->si_faultflags; + /* + * These assignments involve a truncation, but as with si_addr + * they will be derived from a 32-bit fault address so we + * should not expect any truncation in practice. + */ + to->si_addr_tag_bits = from->si_addr_tag_bits; + to->si_addr_tag_bits_mask = from->si_addr_tag_bits_mask; } switch (layout) { @@ -3348,6 +3360,8 @@ static int post_copy_siginfo_from_user32(kernel_siginfo_t *to, to->si_trapno = from->si_trapno; #endif to->si_faultflags = from->si_faultflags; + to->si_addr_tag_bits = from->si_addr_tag_bits; + to->si_addr_tag_bits_mask = from->si_addr_tag_bits_mask; } switch (layout) {