Thread (22 messages) 22 messages, 4 authors, 2021-10-19

Re: [PATCH 01/13] arm64: lib: __arch_clear_user(): fold fixups into body

From: Mark Rutland <mark.rutland@arm.com>
Date: 2021-10-14 11:12:04

On Wed, Oct 13, 2021 at 08:55:31PM +0100, Robin Murphy wrote:
On 2021-10-13 12:00, Mark Rutland wrote:
quoted
Like other functions, __arch_clear_user() places its exception fixups in
the `.fixup` section without any clear association with
__arch_clear_user() itself. If we backtrace the fixup code, it will be
symbolized as an offset from the nearest prior symbol, which happens to
be `__entry_tramp_text_end`. Further, since the PC adjustment for the
fixup is akin to a direct branch rather than a function call,
__arch_clear_user() itself will be missing from the backtrace.

This is confusing and hinders debugging. In general this pattern will
also be problematic for CONFIG_LIVEPATCH, since fixups often return to
their associated function, but this isn't accurately captured in the
stacktrace.

To solve these issues for assembly functions, we must move fixups into
the body of the functions themselves, after the usual fast-path returns.
This patch does so for __arch_clear_user().

Inline assembly will be dealt with in subsequent patches.

Other than the improved backtracing, there should be no functional
change as a result of this patch.
Oh, I always assumed the .fixup section might have some special significance
of its own. If not, all the better - modulo one possible nit below, this is
fine by me.
Cheers, I'll go fix those up.
Also it's led me to see that copy_in_user() has finally left us,
hooray! Guess I've got no more excuses to put off that promised usercopy
rewrite other than finding the time now...
;)
quoted
diff --git a/arch/arm64/lib/clear_user.S b/arch/arm64/lib/clear_user.S
index a7efb2ad2a1c..dac13df4a1ed 100644
--- a/arch/arm64/lib/clear_user.S
+++ b/arch/arm64/lib/clear_user.S
@@ -45,13 +45,10 @@ USER(9f, sttrh	wzr, [x0])
  USER(7f, sttrb	wzr, [x2, #-1])
  5:	mov	x0, #0
  	ret
-SYM_FUNC_END(__arch_clear_user)
-EXPORT_SYMBOL(__arch_clear_user)
-	.section .fixup,"ax"
The one useful purpose this did serve is to provide a handy visual cue - if
you have any more concrete reason to respin the series, would you mind
sticking in a little comment like "// Exception fixup" here and in the other
two assembly routines, just so it's harder to overlook that the preceding
ret is the normal exit path?
I've added:

| // Exception fixups

... to the start of the fixups in patches 1-3.
Either way, for patches 1-3,

Acked-by: Robin Murphy <robin.murphy@arm.com>
Thanks!
 
I got totally lost trying to follow the _ASM_EXTABLE_UACCESS_* business, but
I don't think the rest of the series gets in the way of any outstanding
plans either (and FWIW I always thought "fixup->fixup" was pretty awful so
feel free to have an ack for patch #9 as well).
Thanks again!
Indeed, I guess the new type field should mean that we can implement
"proper" address-aware fault handlers without the Itanium trick if we
still need to.
Yes -- my thinking was that we can capture the address register(s) and
offset(s) in the data field, and *also* provide the ESR and/or FAR if
necessary in the exception handler.

What's the Itanium trick?

Thanks,
Mark.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help