Received: by 2002:a05:7412:d1aa:b0:fc:a2b0:25d7 with SMTP id ba42csp1639201rdb; Wed, 31 Jan 2024 05:03:07 -0800 (PST) X-Google-Smtp-Source: AGHT+IFgpVQw2GhWa7r0yVfbPpvgovsi2MR6KG9cZK8UoT52vc34D6j1vkd4mazEbQ6ixoA2W1bc X-Received: by 2002:a17:906:6bc6:b0:a31:818e:c98a with SMTP id t6-20020a1709066bc600b00a31818ec98amr1179071ejs.19.1706706187124; Wed, 31 Jan 2024 05:03:07 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706706187; cv=pass; d=google.com; s=arc-20160816; b=DafyDo+jhpArh0Zpbqena5aXoVW/BWF13Em7oFUpsOvncYjU/qBSMcTBXt5zDTFdgj fccWrEwB6SpuDzUd0H4PNSvdXd89qm1aS83qDZCqI+Ne144otXmEcW8ZaT7Nar4nFiDl sLw2xINIyGhZ3aZKbdqLKX/4w00yxsuUFhEHeptiLDA9Zz+lhZZD7btklUUG6kthiH9I QWFt9TcT5wcFNEcEDl96S0NAWQGhWbEa1QDyRhXTdTZMjsATw0g71Js6iHpmvA494Qnn H/X2hC1Ka6K9vqzZt8wBY/2kPIRlz70Onjm2l8XSYtTfECPJhTe2zAY4S9GTbMD0H1FN xp4Q== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:message-id:subject:cc :to:from:date; bh=LXHP6w+PVA3pfCAcH8L0jFmlN0JkbI0PAtnw2QTG9es=; fh=iODBTY6+JdtS/68v51TxoOltZH8dZlXwQAiTb1nCrOo=; b=OKe+JR5DKB0V+FDtD+LUOZGWkNzOl3663D80hT8r42v+BO50qgeYIqeJpJEPXuU/FK pHarerDtpEKHiUsxhYg4BsJwkUya2MfRwuVqmCQ8LVGNVRbsTnZdVLxe3MqJ120B7bRQ RrGn8XuSi1NnO7Q6Jtyx9qN8BfXJPWaR/xTswO37btMhlI8cyk5qr+0tIw/tD84OXD20 n/2lLxJXdI9ZT7ewz9YNWVrjSRPggJA1LGi2HTPsrMwcs7bjDXtoUxVOnLRTf9ECAiL4 R8RsE6/qvNM3JGPZziHmgO5/EsG3LxZN+lvlFXc8R5OExZwF5iDJCF1WU/7Ez3BIbn/t vIGQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=arm.com dmarc=pass fromdomain=arm.com); spf=pass (google.com: domain of linux-kernel+bounces-46455-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-46455-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com X-Forwarded-Encrypted: i=1; AJvYcCUg1Wn7p21p6D/1XaGLPUk4YKDO9fmfVju4gvAZsFQVnTrkcPY4H70+bOv60TuMQGms1eM6bTgOPa/EuTP5sdbZWh7b5NUTWPCfvkyR5w== Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id mj22-20020a170906af9600b00a367e12d0c2si474575ejb.603.2024.01.31.05.03.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Jan 2024 05:03:07 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-46455-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=arm.com dmarc=pass fromdomain=arm.com); spf=pass (google.com: domain of linux-kernel+bounces-46455-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-46455-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id C3E041F25478 for ; Wed, 31 Jan 2024 13:01:37 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 65AAC7AE68; Wed, 31 Jan 2024 13:01:27 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CDD9A55C14 for ; Wed, 31 Jan 2024 13:01:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706706086; cv=none; b=QMVlk7SJh4z0JKBbDMnRcgkFO4FEEJM6fhqFJuxR2BSQ3ryamoi9GKLBQ5sAMILYni+kNyYqeRvm1V52ubY442cA0igyfY/W6TR+hwwQewtt169fKX9uMxNMH9+5nbx4Zu/97hzddmurn4QilbEQxFroJ1nwzZFC7zUk3rFy4ME= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706706086; c=relaxed/simple; bh=5CKTpaFjsTe6lonuoOUlHY2T/WH+/JtSRrKIXyTcYD4=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=ABaiMIBiuEIOgrNkFcu4O3eSnwzcvWSXycGjzOf6kaLKlGLsXu2KyqIzVCmMrf/cqxyfnK94AdSKjtPQhV8wkwvVeZKcJ+p/mqIWyvf40F8gD+RhV51JAdrc1PSQnHm0Zd+LEd60M3zIT+lFWZCrddpXwrHGhpKjf5OQozn+WgE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A7774DA7; Wed, 31 Jan 2024 05:02:06 -0800 (PST) Received: from e133380.arm.com (e133380.arm.com [10.1.197.58]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1469B3F738; Wed, 31 Jan 2024 05:01:21 -0800 (PST) Date: Wed, 31 Jan 2024 13:01:16 +0000 From: Dave Martin To: Ard Biesheuvel Cc: Fangrui Song , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Jisheng Zhang , llvm@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH] arm64: jump_label: use constraint "S" instead of "i" Message-ID: References: <20240131065322.1126831-1-maskray@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: On Wed, Jan 31, 2024 at 08:16:04AM +0100, Ard Biesheuvel wrote: > Hello Fangrui, > > On Wed, 31 Jan 2024 at 07:53, Fangrui Song wrote: > > > > The constraint "i" seems to be copied from x86 (and with a redundant > > modifier "c"). It works with -fno-PIE but not with -fPIE/-fPIC in GCC's > > aarch64 port. (I'm not sure of the exact history, but the "c" may be inherited from arm, where an output modifier was needed to suppress the "#" that prefixes immediates in the traditional asm syntax. This does not actually seem to be required for AArch64: rather while a # is allowed and still considered good style in handwritten asm code, the syntax doesn't require it, and the compiler doesn't emit it for "i" arguments, AFAICT.) > > The constraint "S", which denotes a symbol reference (e.g. function, > > global variable) or label reference, is more appropriate, and has been > > available in GCC since 2012 and in Clang since 7.0. > > > > Signed-off-by: Fangrui Song > > Link: https://maskray.me/blog/2024-01-30-raw-symbol-names-in-inline-assembly > > --- > > arch/arm64/include/asm/jump_label.h | 8 ++++---- > > 1 file changed, 4 insertions(+), 4 deletions(-) > > > > diff --git a/arch/arm64/include/asm/jump_label.h b/arch/arm64/include/asm/jump_label.h > > index 48ddc0f45d22..31862b3bb33d 100644 > > --- a/arch/arm64/include/asm/jump_label.h > > +++ b/arch/arm64/include/asm/jump_label.h > > @@ -23,9 +23,9 @@ static __always_inline bool arch_static_branch(struct static_key * const key, > > " .pushsection __jump_table, \"aw\" \n\t" > > " .align 3 \n\t" > > " .long 1b - ., %l[l_yes] - . \n\t" > > - " .quad %c0 - . \n\t" > > + " .quad %0 - . \n\t" > > " .popsection \n\t" > > - : : "i"(&((char *)key)[branch]) : : l_yes); > > + : : "S"(&((char *)key)[branch]) : : l_yes); > > 'key' is not used as a raw symbol name. We should make this > > " .quad %0 + %1 - ." > > and > > :: "S"(key), "i"(branch) :: l_yes); > > if we want to really clean this up. This hides more logic in the asm so it's arguably more cryptic (although the code is fairly cryptic to begin with -- I don't really see why the argument wasn't written as the equivalent (char *)key + branch...) Anyway, I don't think the "i" versys "S" distinction makes any difference without -fpic or equivalent, so it is not really relevant for the kernel (except that "S" breaks compatibility with older compilers...) I think the main advantage of "S" is that it stops you accidentally emitting undesirable relocations from asm code that is not written for the -fpic case. But just changing "i" to "S" is not sufficient to port asms to -fpic: the asms still need to be reviewed. So unless the asm has been reviewed for position-independence, it may anyway be better to stick with "i" so that the compiler actually chokes if someone tries to build the code with -fpic. Since we are not trying to run arbitraily many running kernels in a common address space (and not likely to do that), I'm not sure that we would ever build the kernel with -fpic except for a few special-case bits like the EFI stub and vDSO... unless I've missed something? If there's another reason why "S" is advantageous though, I'm happy to be corrected. [...] Cheers ---Dave