Thread (9 messages) 9 messages, 5 authors, 2026-03-30

Re: [PATCH v7] arm64: implement support for static call trampolines

From: Peter Zijlstra <peterz@infradead.org>
Date: 2026-03-17 11:34:17
Also in: lkml

On Tue, Mar 17, 2026 at 12:31:51PM +0100, Ard Biesheuvel wrote:
On Tue, 17 Mar 2026, at 12:24, Peter Zijlstra wrote:
quoted
On Tue, Mar 17, 2026 at 11:59:49AM +0100, Ard Biesheuvel wrote:
quoted
quoted
+#define __ARCH_DEFINE_STATIC_CALL_TRAMP(name, target)			    \
+	asm("	.pushsection .static_call.text, \"ax\"			\n" \
+	    "	.align	3						\n" \
+	    "	.globl	" STATIC_CALL_TRAMP_STR(name) "			\n" \
+	    STATIC_CALL_TRAMP_STR(name) ":				\n" \
+	    "	hint	34	/* BTI C */				\n" \
+	    "	adrp	x16, 1f						\n" \
+	    "	ldr	x16, [x16, :lo12:1f]				\n" \
+	    "	cbz	x16, 0f						\n" \
+	    "	br	x16						\n" \
+	    "0:	ret							\n" \
+	    "	.type	" STATIC_CALL_TRAMP_STR(name) ", %function	\n" \
+	    "	.size	" STATIC_CALL_TRAMP_STR(name) ", . - " 
STATIC_CALL_TRAMP_STR(name) " \n" \
+	    "	.popsection						\n" \
+	    "	.pushsection .rodata, \"a\"				\n" \
+	    "	.align	3						\n" \
+	    "1:	.quad	" target "					\n" \
+	    "	.popsection						\n")
quoted
quoted
+void arch_static_call_transform(void *site, void *tramp, void *func, 
bool tail)
+{
+	u64 literal;
+	int ret;
+
Here, set func to &__static_call_return0 if it is NULL.
I'm confused. NULL is for the static_call_cond() case, where we NO-OP.
And the trampoline above does that cbz 0f to ret. So far so good.

But ret0 should return 0, and IIRC arm64 uses x0 for the return value.
But I don't see the above clearing it. Hmm?
(your MUA seems busted and generates these silly long lines, let me
reflow again)
The RET0 case will tail call __static_call_return0() which will take
care of this.

I am just saying that the NULL case could just do the same, rather
than have a conditional branch in the trampoline, as even in that
case, the surrounding code must assume that X0 is clobbered.
Alternatively, we could tail call __static_call_nop(), which would do
just the 'ret'.

IOW, if we guarantee that the target is always set to something
appropriate, we can elide the NULL check, and __static_call_return0()
and __static_call_nop() are equally appropriate for the NULL case.
Ah, yes that is possible. Trade that cbz for an unconditional branch to
a function. That works fine.

Do whatever is best for the uarch etc..
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help