|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/4] x86/uaccess: rework user access speculative harden guards
On Tue, Nov 19, 2024 at 03:31:34PM +0000, Andrew Cooper wrote:
> On 19/11/2024 10:34 am, Roger Pau Monne wrote:
> > The current guards to select whether user accesses should be speculative
> > hardened violate Misra rule 20.7, as the UA_KEEP() macro doesn't (and can't)
> > parenthesize the 'args' argument.
> >
> > Change the logic so the guard is implemented inside the assembly block using
> > the .if assembly directive.
> >
> > No functional change intended.
> >
> > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> > ---
> > The guard check could be moved inside of the guest_access_mask_ptr macro,
> > but
> > given it's limited usages it's clearer to keep the check in the callers IMO.
>
> Overall this is far more legible, and I'm tempted to take it on that
> justification alone. But this is Jan's pile of magic.
>
> There is a weird effect from this change:
>
> add/remove: 2/0 grow/shrink: 2/2 up/down: 740/-739 (1)
> Function old new delta
> build_symbol_table - 686 +686
> build_symbol_table.cold - 48 +48
> pv_map_ldt_shadow_page 641 644 +3
> pv_emulate_gate_op 2919 2922 +3
> livepatch_op.cold 557 509 -48
> livepatch_op 5952 5261 -691
So build_symbol_table() is no longer inlined in load_payload_data()
and thus livepatch_op().
> which is clearly changing inlining decisions. I suspect it's related to...
>
> > diff --git a/xen/arch/x86/usercopy.c b/xen/arch/x86/usercopy.c
> > index 7ab2009efe4c..d66beecc5507 100644
> > --- a/xen/arch/x86/usercopy.c
> > +++ b/xen/arch/x86/usercopy.c
> > @@ -11,23 +11,23 @@
> > #include <asm/uaccess.h>
> >
> > #ifndef GUARD
> > -# define GUARD UA_KEEP
> > +# define GUARD 1
> > #endif
> >
> > unsigned int copy_to_guest_ll(void __user *to, const void *from, unsigned
> > int n)
> > {
> > - GUARD(unsigned dummy);
> > + unsigned __maybe_unused dummy;
>
> ... this. This doesn't need to be __maybe_unused, because ...
This is a leftover from when I attempted to use preprocessor #if GUARD
below, and the compiler would then complain about dummy being
unused.
I can fix if there's agreement on the basis of the change.
> >
> > stac();
> > asm volatile (
> > - GUARD(
> > + ".if " STR(GUARD) "\n"
> > " guest_access_mask_ptr %[to], %q[scratch1], %q[scratch2]\n"
> > - )
> > + ".endif\n"
> > "1: rep movsb\n"
> > "2:\n"
> > _ASM_EXTABLE(1b, 2b)
> > - : [cnt] "+c" (n), [to] "+D" (to), [from] "+S" (from)
> > - GUARD(, [scratch1] "=&r" (dummy), [scratch2] "=&r" (dummy))
> > + : [cnt] "+c" (n), [to] "+D" (to), [from] "+S" (from),
> > + [scratch1] "=&r" (dummy), [scratch2] "=&r" (dummy)
>
> ... these parameters are referenced unconditionally.
>
> However, it does mean the compiler is spilling the scratch registers
> even when guard is 0. I expect this is what is affecting the inlining
> decisions.
That's my understanding yes, the registers will be spilled.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |