From patchwork Sun Jan 2 17:22:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John David Anglin X-Patchwork-Id: 49450 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D8A383858405 for ; Sun, 2 Jan 2022 17:22:35 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from cmx-mtlrgo002.bell.net (mta-mtl-002.bell.net [209.71.208.12]) by sourceware.org (Postfix) with ESMTP id 35FC73858C27 for ; Sun, 2 Jan 2022 17:22:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 35FC73858C27 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=bell.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=bell.net X-RG-CM-BuS: 0 X-RG-CM-SC: 0 X-RG-CM: Clean X-Originating-IP: [67.71.8.137] X-RG-Env-Sender: dave.anglin@bell.net X-RG-Rigid: 61CA829900704EDC X-CM-Envelope: MS4xfAZelDzGaElngx7RVm/fGZ90RTrexpv3bNXQWcw3LnDSbGJWtT+56PnM8V4AXcGadLui4iTyf/0SxDFtuQ0pai93OZUi27QL8jxE6fE7Fjb8PTvaUMit kS/LXsBpH04437vpEum+lxzsHmAJOGmTmyND1KP8RFaZrALto7eTjgM1FoRcg6m1DqiH1ydX4rzjTxjUagXSPATnpbyszRCEbSQUsTfB0N8Z6EgNPyiXwu0r urGlymadGMI4nfsQr91IDqEjbLiR3REH06v7xN8+d1YpXuGmt1ysvh+NBYdzf9ARmGKATOnFX5wDkmGWl9Wjecu1ZmEFl6cKXIK9eVzNPMA= X-CM-Analysis: v=2.4 cv=WtFIjfTv c=1 sm=1 tr=0 ts=61d1df4a a=jrdA9tB8yuRqUzQ1EpSZjA==:117 a=jrdA9tB8yuRqUzQ1EpSZjA==:17 a=DghFqjY3_ZEA:10 a=mDV3o1hIAAAA:8 a=DpuZwSqmHoSlXb56frEA:9 a=CjuIK1q_8ugA:10 a=ECIALPXgYrfvhQgYSZYA:9 a=FfaGCDsud1wA:10 a=_FVE-zBwftR9WsbkzFJk:22 Received: from mx3210.localdomain (67.71.8.137) by cmx-mtlrgo002.bell.net (5.8.716.03) (authenticated as dave.anglin@bell.net) id 61CA829900704EDC; Sun, 2 Jan 2022 12:22:18 -0500 Received: by mx3210.localdomain (Postfix, from userid 1000) id D6FCF220115; Sun, 2 Jan 2022 17:22:17 +0000 (UTC) Date: Sun, 2 Jan 2022 17:22:17 +0000 From: John David Anglin To: GCC Patches Subject: [COMMITTED] hppa: Generate illegal instruction fault if LWS syscall returns -EFAULT Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-9.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" The kernel compare and exchange calls will never succeed if they return -EFAULT. This change generates an instruction fault if a call returns -EFAULT. This prevents the code from spinning forever. Tested on hppa-unknown-linux-gnu. Committed to trunk and gcc-11 branch. Dave --- Generate illegal instruction fault if LWS syscall returns -EFAULT. 2022-01-02 John David Anglin libgcc/ChangeLog: * config/pa/linux-atomic.c (_ASM_EFAULT): Define. (__kernel_cmpxchg): Nullify illegal iitlbp instruction if error return is not equal _ASM_EFAULT. (__kernel_cmpxchg2): Likewise. diff --git a/libgcc/config/pa/linux-atomic.c b/libgcc/config/pa/linux-atomic.c index 500a3652499..e4d74b2d598 100644 --- a/libgcc/config/pa/linux-atomic.c +++ b/libgcc/config/pa/linux-atomic.c @@ -28,6 +28,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define EBUSY 16 #define ENOSYS 251 +#define _ASM_EFAULT "-14" + typedef unsigned char u8; typedef short unsigned int u16; #ifdef __LP64__ @@ -58,6 +60,8 @@ __kernel_cmpxchg (volatile void *mem, int oldval, int newval) register long lws_errno asm("r21"); asm volatile ( "ble 0xb0(%%sr2, %%r0) \n\t" "ldi %2, %%r20 \n\t" + "cmpiclr,<> " _ASM_EFAULT ", %%r21, %%r0\n\t" + "iitlbp %%r0,(%%sr0, %%r0) \n\t" : "=r" (lws_ret), "=r" (lws_errno) : "i" (LWS_CAS), "r" (lws_mem), "r" (lws_old), "r" (lws_new) : "r1", "r20", "r22", "r23", "r29", "r31", "memory" @@ -84,6 +88,8 @@ __kernel_cmpxchg2 (volatile void *mem, const void *oldval, const void *newval, register long lws_errno asm("r21"); asm volatile ( "ble 0xb0(%%sr2, %%r0) \n\t" "ldi %6, %%r20 \n\t" + "cmpiclr,<> " _ASM_EFAULT ", %%r21, %%r0\n\t" + "iitlbp %%r0,(%%sr0, %%r0) \n\t" : "=r" (lws_ret), "=r" (lws_errno), "+r" (lws_mem), "+r" (lws_old), "+r" (lws_new), "+r" (lws_size) : "i" (2)