From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 771B8C4338F for ; Wed, 28 Jul 2021 20:15:53 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 38E4460527 for ; Wed, 28 Jul 2021 20:15:53 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 38E4460527 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:Cc:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=AqBBGmEO58zQv9i2tVVUNAedf7r94lwz2LJqnVoQveM=; b=CwYKKLah62xNZNXb0jYQpoljLS Y5u9pQ86azSZH4xLfM/2ksAup7ZlVreHXXmsiGyTLFZ48Jrb1+I7BJ61tq0fowASg3rILS5PUPLnA eLMYXz/CwQj3bQ4N55LdYxh0x9bR29sul87wkhujHJ1RMQz7ZG/J3N9XmLKnl+vhFup5TDpMC2JeD koZwya1wQzC8A46i39v1/VcgLzGyxxqR424B6I4x03/DfICSudoKWLU/ylff3HxhnJnW4yDna4LMv ZC29DMIJz6P8t4Uf7jwCrke5/Z+jJ2hlBa4j4jb9QxW3VstWTheK/2OBTJnB0ihuOdKDyDIvWKohQ +eFKTf4Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m8pvs-002IBy-8w; Wed, 28 Jul 2021 20:13:36 +0000 Received: from mail-wr1-x42c.google.com ([2a00:1450:4864:20::42c]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m8pvn-002IB5-D5 for linux-arm-kernel@lists.infradead.org; Wed, 28 Jul 2021 20:13:33 +0000 Received: by mail-wr1-x42c.google.com with SMTP id z4so3983878wrv.11 for ; Wed, 28 Jul 2021 13:13:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=0aFm8vJ9RhhQPVCobXlUfl/fGOpGkmciFT8CCiUV9Ds=; b=pNIYW9pHPGpgFxNsGG0MOF8rV9jrzsDLuCf8DSzy8dSaIrjl83h3WJcIpxMww1reVG xB22lX8b7gVV4Pqps3FvOK/KiHspI1sXBoLWs3aBFarSlUD5OTkJoQcejEC5XzmW22VL StEELVtmPlZddBnJy3AIEWOvfm7WPFAdZbqeLSwyb1lSSZgDfVcQxAunODoIthEpTw1u Us1K/VzMklFdFUd+RQ4ZD4jN89Ie+JZyCUGyYW0iY6cXMuMB6G7M42vQ0ilRAUnf6iPH P0W5mtCUofkbcMvjI4F0P57AO9NwNBZiGXMuyy6HYQ3h/+cHdgcggpytrDs+BipGZ2lH nTLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=0aFm8vJ9RhhQPVCobXlUfl/fGOpGkmciFT8CCiUV9Ds=; b=tNxHlLdBZzRnDYR6GaMiN6YkMYkW5JfUhtQp0Kqbdc0HfLiTS5KdAac5zOk/YUK56Q 3Zmk323eCe55b83X17xwxhodNcOzcfuk6cvx0lTTE2oKOyrDWpeMNdCMfpmOvgKR7Vu/ hdzmdfXrOmAV/2DKDe2fKC+ZX3Pcms8YXaFuP2si2sTVqZgfGZyN50B+EMHxkpHGrEN3 8Cr6qGXMOTFRnR/gecffBomu9vJyzao7dxE87lFP2pSXtOximXxVUFVI4hWovhbMR3lE XWgPtgLLgMsD955gDd/vqgHwiMbZnwRHMTgVZhAh+dfMYheYl2Dm4DHANYGC2Kbm8c/V eTJg== X-Gm-Message-State: AOAM530sKwFzsYJQ2KS5/VZojlIwMNZYAGa5kvJ7io7cp7vxDP8jptjN LQtO7C3zhzEl/hAkTasDeMg= X-Google-Smtp-Source: ABdhPJxwOgubwGNFSJIa28VUtkeY3zG1bc+o3V2A07YpK/NtVHk1bCKpNANBjepAbgLBfBchpbSSZw== X-Received: by 2002:a05:6000:1367:: with SMTP id q7mr1047285wrz.395.1627503209132; Wed, 28 Jul 2021 13:13:29 -0700 (PDT) Received: from [10.8.0.150] ([195.53.121.100]) by smtp.gmail.com with ESMTPSA id i5sm839339wrw.13.2021.07.28.13.13.27 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 28 Jul 2021 13:13:28 -0700 (PDT) Subject: Re: [PATCH v4] sigaction.2: Document SA_EXPOSE_TAGBITS and the flag support detection protocol To: Peter Collingbourne , Catalin Marinas , Evgenii Stepanov , Kostya Serebryany , Vincenzo Frascino , Dave Martin , Will Deacon , Oleg Nesterov , "Eric W. Biederman" , "James E.J. Bottomley" , Michael Kerrisk Cc: Linux ARM , Kevin Brodsky , Andrey Konovalov , linux-api@vger.kernel.org, Helge Deller , David Spickett , linux-man@vger.kernel.org References: <20210715204610.575999-1-pcc@google.com> From: "Alejandro Colomar (man-pages)" Message-ID: Date: Wed, 28 Jul 2021 22:13:26 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <20210715204610.575999-1-pcc@google.com> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210728_131331_522447_B00ABCBD X-CRM114-Status: GOOD ( 41.36 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Peter, On 7/15/21 10:46 PM, Peter Collingbourne wrote: > Signed-off-by: Peter Collingbourne Thanks! I applied the patch. I applied some minor tweaks in a following commit (I didn't send it back to you because it was a bit of my fault for not having seen it before, and didn't want to make you lose more time with that): sigaction.2: Apply minor tweaks to Peter's patch - Move example program to a new EXAMPLES section - Invert logic in the handler to have the failure in the conditional path, and the success out of any conditionals. - Use NULL, EXIT_SUCCESS, and EXIT_FAILURE instead of magic numbers - Separate declarations from code - Put function return type on its own line - Put function opening brace on its line You can see the diff in my tree: I'll resend it to Michael very soon (I hope today), so you'll see there anyway. You can comment there if you find something that you don't like , or if I broke anything accidentally :) Cheers, Alex > --- > v4: > - s/.BR/.BR/ in one location > - 4 space indentation > - raise(SIGSEGV) instead of manual SIGSEGV > - use C99 initialization > > v3: > - s/5.x/5.11/g > - s/.IR/.I/ in one location > > v2: > - fix formatting > - address feedback from Dave > > man2/sigaction.2 | 123 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 123 insertions(+) > > diff --git a/man2/sigaction.2 b/man2/sigaction.2 > index 57ad6418c..4bf6f095e 100644 > --- a/man2/sigaction.2 > +++ b/man2/sigaction.2 > @@ -261,6 +261,44 @@ This flag is meaningful only when establishing a signal handler. > .\" .I sa_sigaction > .\" field was added in Linux 2.1.86.) > .\" > +.TP > +.B SA_UNSUPPORTED > +Used to dynamically probe for flag bit support. > +.IP > +If an attempt to register a handler succeeds with this flag set in > +.I act->sa_flags > +alongside other flags that are potentially unsupported by the kernel, > +and an immediately subsequent > +.BR sigaction () > +call specifying the same signal number n and with non-NULL > +.I oldact > +yields > +.B SA_UNSUPPORTED > +.I clear > +in > +.IR oldact->sa_flags , > +then > +.I oldact->sa_flags > +may be used as a bitmask > +describing which of the potentially unsupported flags are, > +in fact, supported. > +See the section "Dynamically probing for flag bit support" > +below for more details. > +.TP > +.BR SA_EXPOSE_TAGBITS " (since Linux 5.11)" > +Normally, when delivering a signal, > +an architecture-specific set of tag bits are cleared from the > +.I si_addr > +field of > +.IR siginfo_t . > +If this flag is set, > +an architecture-specific subset of the tag bits will be preserved in > +.IR si_addr . > +.IP > +Programs that need to be compatible with Linux versions older than 5.11 > +must use > +.B SA_UNSUPPORTED > +to probe for support. > .SS The siginfo_t argument to a SA_SIGINFO handler > When the > .B SA_SIGINFO > @@ -846,6 +884,91 @@ Triggered by a > .BR seccomp (2) > filter rule. > .RE > +.SS Dynamically probing for flag bit support > +The > +.BR sigaction () > +call on Linux accepts unknown bits set in > +.I act->sa_flags > +without error. > +The behavior of the kernel starting with Linux 5.11 is that a second > +.BR sigaction () > +will clear unknown bits from > +.IR oldact->sa_flags . > +However, historically, a second > +.BR sigaction () > +call would typically leave those bits set in > +.IR oldact->sa_flags . > +.PP > +This means that support for new flags cannot be detected > +simply by testing for a flag in > +.IR sa_flags , > +and a program must test that > +.B SA_UNSUPPORTED > +has been cleared before relying on the contents of > +.IR sa_flags . > +.PP > +Since the behavior of the signal handler cannot be guaranteed > +unless the check passes, > +it is wise to either block the affected signal > +while registering the handler and performing the check in this case, > +or where this is not possible, > +for example if the signal is synchronous, to issue the second > +.BR sigaction () > +in the signal handler itself. > +.PP > +In kernels that do not support a specific flag, > +the kernel's behavior is as if the flag was not set, > +even if the flag was set in > +.IR act->sa_flags . > +.PP > +The flags > +.BR SA_NOCLDSTOP , > +.BR SA_NOCLDWAIT , > +.BR SA_SIGINFO , > +.BR SA_ONSTACK , > +.BR SA_RESTART , > +.BR SA_NODEFER , > +.BR SA_RESETHAND , > +and, if defined by the architecture, > +.B SA_RESTORER > +may not be reliably probed for using this mechanism, > +because they were introduced before Linux 5.11. > +However, in general, programs may assume that these flags are supported, > +since they have all been supported since Linux 2.6, > +which was released in the year 2003. > +.PP > +The following example program exits with status 0 if > +.B SA_EXPOSE_TAGBITS > +is determined to be supported, and 1 otherwise. > +.PP > +.EX > +#include > +#include > +#include > + > +void handler(int signo, siginfo_t *info, void *context) { > + struct sigaction oldact; > + if (sigaction(SIGSEGV, 0, &oldact) == 0 && > + !(oldact.sa_flags & SA_UNSUPPORTED) && > + (oldact.sa_flags & SA_EXPOSE_TAGBITS)) { > + _exit(0); > + } else { > + _exit(1); > + } > +} > + > +int main(void) { > + struct sigaction act = {0}; > + act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS; > + act.sa_sigaction = handler; > + if (sigaction(SIGSEGV, &act, 0) != 0) { > + perror("sigaction"); > + return 1; > + } > + > + raise(SIGSEGV); > +} > +.EE > .SH RETURN VALUE > .BR sigaction () > returns 0 on success; on error, \-1 is returned, and > -- Alejandro Colomar Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/ http://www.alejandro-colomar.es/ _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel