Received: by 2002:a05:7412:bbc7:b0:fc:a2b0:25d7 with SMTP id kh7csp17282rdb; Thu, 1 Feb 2024 00:09:41 -0800 (PST) X-Google-Smtp-Source: AGHT+IEoP7+ObTZmXROzMFq8EAvrOt739qvMqeAp3AAg5Up0YOjegJeCY1YH4VJkwfR87rupUF5z X-Received: by 2002:a17:906:28db:b0:a35:4927:36c1 with SMTP id p27-20020a17090628db00b00a35492736c1mr2751643ejd.16.1706774981295; Thu, 01 Feb 2024 00:09:41 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706774981; cv=pass; d=google.com; s=arc-20160816; b=CU5AegjiQpKASqNAeRHuek4gCaCpu/Ekp9ALJ2RqU6d8uGunOd+OUl0/EiPzaKl7U6 +rOeMm514eY5dHk0kXb7FxJvr2/QNLF+YkM/24STpJAfVNEaSZZvxDl1XZxP1sao3xfl bOsueefpBIFnWPxBdRsc7hhmrGnWJrX05XMS5Ujq4h33MJ1/1oP1Jx1qI067Ml2aO5jj h1u+77cWPPkLOOZrn6vDsPKqTZhzKlWtaTIR8mgnNZFURz6ZcmcYRDHMZy8oEnfILhq1 ruS/SUfoAiYAfWYnaIYfGkBesImyIYp8Lce+xD1gwM8Ggd9NSvGp6TVeItLTZrEOSS2B XiPQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :dkim-signature; bh=pYT6fXNnrxhTv+XBv/6nXdaXbKCc2hBDZXeDXSl4Jg8=; fh=KZmZA7bVcgij2uO0Uzkx+avpGFTm8hbyzol6uKdyYk4=; b=DOZ4KjyznCpVlqdbsq1JSRijddVDNa/HgeQZG32o6erj0r/ORKOhhjmajy3wnmVAV2 uDqOgcbapXBK6R7jv5vgIuDW+/WL3FJcKN7MROoNnVfqmCqtC7qkOfDSjOK2PxSjP+9y Yj2DbVkyP9+JmgGxuX+wYLREJ/xR2nN7JnLxUQMsMO4fsn6pMIolDa99JSHhsGXG1Eyh cGLYnrQYLh76bsaaE/Hd7tzGBrQsUneeHDpa/uVLlpdYUYd4YWBGZT8FC2uMWgTw1Lra 8xmGGcg4yp1vyC45gCK5lOZ5KUBT/Kd/XkJecH8bKWkT3U1uy9VSZqTjDNNnkGXG58h5 i+AA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZeJcmdHo; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-47759-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-47759-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org X-Forwarded-Encrypted: i=1; AJvYcCWACUXrW5uFRt1St5+L2OGuFJlyOg6r+OXBMAg0KohPPXEKf7jINJTUcyh80DoOt8rC/eI7fJewl5spk/S2dlC9Xpc/X5r4QOpFFdh4Ww== Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id b14-20020a170906038e00b00a2c342cba71si6388684eja.201.2024.02.01.00.09.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Feb 2024 00:09:41 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-47759-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZeJcmdHo; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-47759-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-47759-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org 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 D9C881F22EA0 for ; Thu, 1 Feb 2024 08:09:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 01225158D8C; Thu, 1 Feb 2024 08:08:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZeJcmdHo" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CDA8715A4B0 for ; Thu, 1 Feb 2024 08:08:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706774916; cv=none; b=S6BituEdn1IP2sgAA7Q6nZnMsvJQY/np7ayPQaPRwaP1lilTAUeRa5toVggsjWHHwxR2gmA6VJH5LxRZdDDk5PGFSZ26Z1zxa5/Im+uDd5Ei7A0Q0qqUwWGfeGXtDaRrDB5ugcFF3jojidX6SJsaqqc6cTnQY5ri3jHdEoo0Qt0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706774916; c=relaxed/simple; bh=80iEY38zsgd9OCT3t544kEkSOZkE0dD85Ix/M+1O2BU=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=dho0+R5HuZh5nyh4TOTX/FWlKIW0aapHPgTeDU3wDUOpfPwliuxGLc8HHt9ydb6r4kwVbBDjRCkcEAptA1XmZbT/FDuqEfzurJSe/idHtx5CH19v4GfLroWXqAr1WHTN6bXswsjVRkshZ6PsK9uforLtJicV/G6L4SYD6iA7Ihk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZeJcmdHo; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 59AB9C433C7 for ; Thu, 1 Feb 2024 08:08:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1706774916; bh=80iEY38zsgd9OCT3t544kEkSOZkE0dD85Ix/M+1O2BU=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=ZeJcmdHo9o6FpHFw4iLCXq4+J1qdCA/SlP97RJcgVHtkrMRGoloeByjo9vJsM445B uFCMtVYgiKI0WZtBQFLgHV/qEd6OrzbfYfjv6att+5yiiCXTOTAFn7OSJsLeshYlxO /mOYEs5LMLMAn9wozoIDIAJalV6rMUdkge+IzZDNDeA0x2TdKunilZ4YTS7OkbDkxh lmL74u1lPTX1esKFUCqxJkHJKELhdNgwZArMIxMTPuLqcEWK0rLQT1ftcPQEcfbf8x uie+q7X9bDJJdVdqp7VhUE4sNVHKE4j7dqekD9xkWjrY9keHUXt++Mxgg+udB7u2ZU UeTJ8UOKQv+XA== Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-51025cafb51so937863e87.2 for ; Thu, 01 Feb 2024 00:08:36 -0800 (PST) X-Gm-Message-State: AOJu0Yzo3ohO5CIOW/ZZpfG0AiyZf/e25fp2iMbHNJ9hqrK/VUlRlSUT SzRMwHuv6aBZ/brBM12GeLNC/Re0tL1Z2+HRbDzutx6a9Fbf1TKGFTZEWkbMQIlJVeN9hKwOe4H OqBE2OKgPAA7eo1SFaTZj1Hu0Jrk= X-Received: by 2002:ac2:5329:0:b0:511:f4c:8aa3 with SMTP id f9-20020ac25329000000b005110f4c8aa3mr1219549lfh.7.1706774914479; Thu, 01 Feb 2024 00:08:34 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240131065322.1126831-1-maskray@google.com> <20240201045551.ajg4iqcajyowl2rh@google.com> In-Reply-To: <20240201045551.ajg4iqcajyowl2rh@google.com> From: Ard Biesheuvel Date: Thu, 1 Feb 2024 09:08:22 +0100 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] arm64: jump_label: use constraint "S" instead of "i" To: Fangrui Song Cc: Dave Martin , Catalin Marinas , Will Deacon , linux-arm-kernel@lists.infradead.org, Jisheng Zhang , llvm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" On Thu, 1 Feb 2024 at 05:55, Fangrui Song wrote: > > On 2024-01-31, Dave Martin wrote: > >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 aarch64 one could be inherited from > arch/arm/include/asm/jump_label.h (2012), which could in turn be > inherited from x86 (2010). > Both the constraint "i" and the modifier "c" are generic.. > For -fno-pic this combination can be used for every arch. > > >> > 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...) > > I agree that using "S" and "i" would introduce complexity. > Using just "S" as this patch does should be clear. > > All of "i" "s" "S" support a symbol or label reference and a constant offset (can be zero), > (in object file, a symbol and an addend; in GCC's term, the sum of a SYMBOL_REF and a CONST_INT). > Taken the address of a struct, cast it to char[] and then index it using a boolean is rather disgusting, no? > >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. > The virtual address of the kernel is randomized by KASLR, which relies on PIE linking, and this puts constraints on the permitted types of relocations. IOW, we basically already build the kernel as PIC code, but without relying on -fPIC, because that triggers some behaviors that only make sense for shared objects in user space. > >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? > > Yes, KASLR. The number of kernels is not the point, the point is that the virtual load address of the kernel is usually decided at boot, and so the code needs to be generated to accommodate that. > >If there's another reason why "S" is advantageous though, I'm happy to > >be corrected. > > I remember that Ard has an RFC > https://lore.kernel.org/linux-arm-kernel/20220427171241.2426592-1-ardb@kernel.org/ > "[RFC PATCH 0/2] arm64: use PIE code generation for KASLR kernel" > and see some recent PIE codegen patches. > > > Building the KASLR kernel without -fpie but linking it with -pie works > > in practice, but it is not something that is explicitly supported by the > > toolchains - it happens to work because the default 'small' code model > > used by both GCC and Clang relies mostly on ADRP+ADD/LDR to generate > > symbol references. > > I agree that current -fno-PIE with -shared -Bsymbolic linking is a hack > that works as a conincidence, not guaranteed by the toolchain. > This jump_label improvement (with no object file difference) fixes an > obstacle. If we can get the guaranteed behavior of #pragma GCC visibility push(hidden) from a command line option, we should build the core kernel with -fpie instead. (Modules are partially linked objects, so they can be built non-PIC as before)