From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D09002AD3D for ; Tue, 10 Mar 2026 03:26:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773113212; cv=none; b=iTtRl0ig5Xpf+ALMUZH84MuF5g6yi9rzmtifvUCdLcG+Orm/3NxP+MAr4jm0jMdkcfu72YiE1op+hJ8l6eebaXA5QmVLajfJ3NeEewaHtzw5r2BmJ/y3wVnNMqMpr9sDgseBXUQEmYuzcV46b0PP0yYkcnzs9iWZcvv8LT25hOg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773113212; c=relaxed/simple; bh=zwQ0w1WX3o6PWRSVmotXMBuOjQSh4o7Ox2tjItokEHM=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=kFbd2lXKNuhW6SAUHmj/W9/Xrukm9YNYoVxhMnsJIPOg8tVDzuvJFUvD9ywJDIoUoKJfomsklCHAV5w0MQLH9d9XlVGXXN01c8zPP3t3LpOjBtS2H/UGaD5rJtBt5PeenMRW49roVcyiJvp8Z18it7RS+4Uhq7r5SUWVs/b0yNo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Vj9sDCUz; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Vj9sDCUz" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2ae4b40999bso34085ad.1 for ; Mon, 09 Mar 2026 20:26:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1773113210; x=1773718010; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=7QgFRu6ww+X4eKkkmrkBaNqzfyYluZEMATZgmk40+ZI=; b=Vj9sDCUzlkx915B6pAAeWHZSTNeGQMR0BoVemdmhKJroupD8UWJo/w6TiJfi+yZm6O eqVtSnjVPVVmlMQ9gA8I8OzJcXm3y0rvSRrX1nLTubxqCmFE3liH8RX7XkFw69l804OR pmoMShE+8k0FUQfvwHLeyKEs3Tps4zff9hT043kHaUverDk/g6Plx1y0VMNorazDKBvg VcD/NBoViRhAbhm1iRD21ZqDVdITEO8SPLLKfWCROXm5aXzaFaKkYyUy9sDbmRNlOwsw NVVH4YgNgtQP23ocWnsK06EyUe1iDgTq/Uu2jDaxPkCfUUgMmkZ2A3nSNDDuwLx97+qj 3uBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773113210; x=1773718010; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7QgFRu6ww+X4eKkkmrkBaNqzfyYluZEMATZgmk40+ZI=; b=xBIlTtHaZqS5kT/v7jRmuuMuoywWED5plw29Cuakb2Iu/fEY5At3QCc5Ki4lR3MPht MIwx+X58s+OxX+ULCQ0/lk9mXoWB+cbFKaQGaMb3QylWwvP2XRmSINxxUL6vMUCioDrM j7WujE8HLFcuaZD2lHkOmYbd6jgY+2XQ3BkYf/IN//xLJbQf/uBVmrUfTM1RCw1FrZDM Xp6hRD58K3TwQhFp5lbCp4rfPUljZGLu3zo6x8lv/b0EPjM4tcUyL5jokBuX1fgJxaAU xiLymsdjCR2Ap2Fzjt9pyY1T3O3UTF4iUCfyCu3sviWykTNchVkxKdqudDvxWS+NSvAi 4sHg== X-Forwarded-Encrypted: i=1; AJvYcCWCSpL4RBxpaL9Uluxh5NkxIZ4Tl8NobS4mHibq4kdc/j5D7DXTHxieHlm8qkDrQ/p7lDKAAaJq66kIocA=@vger.kernel.org X-Gm-Message-State: AOJu0YxWg9Y9v7lLqCbNnO02FfdjFNE9+lAjPZzyWYfez2xxH+Bx9Uxg NPYlHKUMkeA3DmMLNqsN1aNAqE+xn77a6x5gXkQp7dRewA7MmV/I+9kBTXlpbgB5ig== X-Gm-Gg: ATEYQzy1DS0VbI2yCwL3hE11Ciw5dxd49mJc/ZE2A+eC4Aee0Tjzokehc/iXbozaNJ0 WMWNJkD46FXG1cHySRx9ZIBwpkx+MDDNbLuARfq2TqQZRGRqGhPccCLAhiVNRH1RtcBOnnbpJ25 bXYPZgvxikSY76Y3bdru60P2KDxcG/JO+f9NvfskjOscOtEKmDVighR+1kQhwCLm6GsoCZeJPiw lQFGVcHgLTnaZMFtgLTONBWsxoh1sjpjyccV3Dx/S5CvC/+QqJgDDEClkpcnVN3PJnsYLy3j937 cIMl8YBtmBjm87hoHlwh8s3omG9W5wd+eRVSGhGQVjeZmP7dlr2eb6hFSYvPr6F+juGlVzqLnY2 9Rs3skD2/XiT8MHkF5gCf8uItRKrLLB3OocH41fJqwUCeZbeebrCTfBNtUAbkn+pEhKg08SroYA ZR4dZeeyDDNIq0n3QBRNnIdP5f7SWfvQX0IxrQuYt6g16L/EICWLdHrHPZIQ5UgQ== X-Received: by 2002:a17:903:1a07:b0:2ad:6f9b:7817 with SMTP id d9443c01a7336-2aea30c2c43mr124325ad.22.1773113209615; Mon, 09 Mar 2026 20:26:49 -0700 (PDT) Received: from google.com (154.52.125.34.bc.googleusercontent.com. [34.125.52.154]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ae83e585b3sm152536955ad.10.2026.03.09.20.26.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Mar 2026 20:26:48 -0700 (PDT) Date: Tue, 10 Mar 2026 03:26:44 +0000 From: Carlos Llamas To: Sami Tolvanen Cc: Kees Cook , Peter Zijlstra , Sean Christopherson , LKML , linux-arm-kernel , kvmarm , kvm@vger.kernel.org, Will McVicker Subject: Re: [PATCH v4 09/17] perf/core: Use static_call to optimize perf_guest_info_callbacks Message-ID: References: <20211111020738.2512932-1-seanjc@google.com> <20211111020738.2512932-10-seanjc@google.com> <202202061011.A255DE55B@keescook> <202202061854.B5B11282@keescook> <20260309223156.GA73501@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: <20260309223156.GA73501@google.com> On Mon, Mar 09, 2026 at 10:31:56PM +0000, Sami Tolvanen wrote: > Hi Carlos, > > If you need a stub with a matching CFI type for an arbitrary function, > perhaps you can do something like this (arm64, untested): > > #define DEFINE_TYPED_STUB_RET0(name, reffunc) \ > typeof(reffunc) name; \ > __ADDRESSABLE(name); \ > asm( \ > " " __ALIGN_STR " \n" \ > " .4byte __kcfi_typeid_" #name " \n" \ > #name ": \n" \ > " bti c \n" \ > " mov x0, xzr \n" \ > " ret " \ > ) > > For the !CONFIG_CFI case, or architectures that implement static calls, > you can probably just point the stub to __static_call_return0: > > #define DEFINE_TYPED_STUB_RET0(name, reffunc) \ > typeof(reffunc) name __asm__("__static_call_return0") > > Sami Oh that is pretty cool it worked for me. This is the patch I tested with. Still needs a bit more plumbing but no more CFI issues. --- diff --git a/arch/arm64/include/asm/linkage.h b/arch/arm64/include/asm/linkage.h index 40bd17add539..708dbdf2c9fe 100644 --- a/arch/arm64/include/asm/linkage.h +++ b/arch/arm64/include/asm/linkage.h @@ -5,8 +5,10 @@ #include #endif +#include + #define __ALIGN .balign CONFIG_FUNCTION_ALIGNMENT -#define __ALIGN_STR ".balign " #CONFIG_FUNCTION_ALIGNMENT +#define __ALIGN_STR __stringify(__ALIGN) /* * When using in-kernel BTI we need to ensure that PCS-conformant diff --git a/include/linux/static_call.h b/include/linux/static_call.h index 78a77a4ae0ea..8b96eb66d2c8 100644 --- a/include/linux/static_call.h +++ b/include/linux/static_call.h @@ -184,6 +184,9 @@ extern int static_call_text_reserved(void *start, void *end); extern long __static_call_return0(void); +#define static_call_update_stub(name) \ + static_call_update(name, __static_call_return0) + #define DEFINE_STATIC_CALL(name, _func) \ DECLARE_STATIC_CALL(name, _func); \ struct static_call_key STATIC_CALL_KEY(name) = { \ @@ -270,6 +273,9 @@ static inline int static_call_text_reserved(void *start, void *end) extern long __static_call_return0(void); +#define static_call_update_stub(name) \ + static_call_update(name, __static_call_return0) + #define EXPORT_STATIC_CALL(name) \ EXPORT_SYMBOL(STATIC_CALL_KEY(name)); \ EXPORT_SYMBOL(STATIC_CALL_TRAMP(name)) @@ -306,8 +312,25 @@ static inline long __static_call_return0(void) #define DEFINE_STATIC_CALL_NULL(name, _func) \ __DEFINE_STATIC_CALL(name, _func, NULL) +/* Move somewhere under arch/arm64/... */ +#define ARCH_DEFINE_TYPED_STUB_RET0(name, reffunc) \ + typeof(reffunc) name; \ + __ADDRESSABLE(name); \ + asm( \ + " " __ALIGN_STR "\n" \ + " .4byte __kcfi_typeid_" #name "\n" \ + #name ":\n" \ + " bti c\n" \ + " mov x0, xzr\n" \ + " ret" \ + ); + #define DEFINE_STATIC_CALL_RET0(name, _func) \ - __DEFINE_STATIC_CALL(name, _func, __static_call_return0) + ARCH_DEFINE_TYPED_STUB_RET0(__static_call_##name, _func) \ + __DEFINE_STATIC_CALL(name, _func, __static_call_##name) + +#define static_call_update_stub(name) \ + static_call_update(name, __static_call_##name) static inline void __static_call_nop(void) { } diff --git a/kernel/events/core.c b/kernel/events/core.c index 1f5699b339ec..b60a1991474b 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7701,10 +7701,10 @@ void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs) return; rcu_assign_pointer(perf_guest_cbs, NULL); - static_call_update(__perf_guest_state, (void *)&__static_call_return0); - static_call_update(__perf_guest_get_ip, (void *)&__static_call_return0); - static_call_update(__perf_guest_handle_intel_pt_intr, (void *)&__static_call_return0); - static_call_update(__perf_guest_handle_mediated_pmi, (void *)&__static_call_return0); + static_call_update_stub(__perf_guest_state); + static_call_update_stub(__perf_guest_get_ip); + static_call_update_stub(__perf_guest_handle_intel_pt_intr); + static_call_update_stub(__perf_guest_handle_mediated_pmi); synchronize_rcu(); } EXPORT_SYMBOL_GPL(perf_unregister_guest_info_callbacks);