|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 20/22] x86/traps: Alter switch_stack_and_jump() for FRED mode
On 15/08/2025 10:10 am, Jan Beulich wrote:
> On 14.08.2025 22:55, Andrew Cooper wrote:
>> On 14/08/2025 4:35 pm, Jan Beulich wrote:
>>> On 08.08.2025 22:23, Andrew Cooper wrote:
>>>> FRED and IDT differ by a Supervisor Token on the base of the shstk. This
>>>> means that switch_stack_and_jump() needs to discard one extra word when
>>>> FRED
>>>> is active.
>>>>
>>>> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>>>> ---
>>>> CC: Jan Beulich <JBeulich@xxxxxxxx>
>>>> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>>>>
>>>> RFC. I don't like this, but it does work.
>>>>
>>>> This emits opt_fred logic outside of CONFIG_XEN_SHSTK.
>>> opt_fred and XEN_SHSTK are orthogonal, so that's fine anyway. What I guess
>>> you may mean is that you now have a shstk-related calculation outside of
>>> a respective #ifdef.
>> I really mean "outside of the path where shadow stacks are known to be
>> active", i.e. inside the middle of SHADOW_STACK_WORK
>>
>>> Given the simplicity of the calculation, ...
>>>
>>>> But frankly, the
>>>> construct is already too unweildly, and all options I can think of make it
>>>> moreso.
>>> ... I agree having it like this is okay.
>> Yes, but it is a read of a global even when it's not used.
>>
>> And as a tangent, we probably want __ro_after_init_read_mostly too. The
>> read mostly is about cache locality, and is applicable even to the
>> __ro_after_init section.
> Not really: __read_mostly is to keep stuff rarely written apart from stuff
> more frequently written (cache locality, yes). There's not going to be any
> frequently written data next to a __ro_after_init item; it's all r/o post-
> boot. And I don't think we care much during boot.
It's not about boot, but hot variables do need grouping. opt_fred is
read on fastpaths, whereas trampoline_phys is not.
>
>>>> @@ -154,7 +155,6 @@ unsigned long get_stack_dump_bottom (unsigned long sp);
>>>> "rdsspd %[ssp];" \
>>>> "cmp $1, %[ssp];" \
>>>> "je .L_shstk_done.%=;" /* CET not active? Skip. */ \
>>>> - "mov $%c[skstk_base], %[val];" \
>>>> "and $%c[stack_mask], %[ssp];" \
>>>> "sub %[ssp], %[val];" \
>>>> "shr $3, %[val];" \
>>> With the latter two insns here, ...
>>>
>>>> @@ -177,6 +177,8 @@ unsigned long get_stack_dump_bottom (unsigned long sp);
>>>>
>>>> #define switch_stack_and_jump(fn, instr, constr) \
>>>> ({ \
>>>> + unsigned int token_offset = \
>>>> + (PRIMARY_SHSTK_SLOT + 1) * PAGE_SIZE - (opt_fred ? 0 : 8); \
>>>> unsigned int tmp; \
>>>> BUILD_BUG_ON(!ssaj_has_attr_noreturn(fn)); \
>>>> __asm__ __volatile__ ( \
>>>> @@ -184,12 +186,11 @@ unsigned long get_stack_dump_bottom (unsigned long
>>>> sp);
>>>> "mov %[stk], %%rsp;" \
>>>> CHECK_FOR_LIVEPATCH_WORK \
>>>> instr "[fun]" \
>>>> - : [val] "=&r" (tmp), \
>>>> + : [val] "=r" (tmp), \
>>> ... I don't think you can legitimately drop the & from here? With it
>>> retained:
>>> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
>> You chopped the bit which has an explicit input for "[val]", making the
>> earlyclobber incorrect.
> I was wondering whether there was a connection there, but ...
>
>> IIRC, one version of Clang complained.
> ... that's not good. Without the early-clobber the asm() isn't quite
> correct imo. If the same value appeared as another input, the compiler
> may validly tie both together, assuming the register stays intact until
> the very last insn (and hence even that last insn could still use the
> register as an input). IOW if there's a Clang issue here, I think it
> may need working around explicitly.
Given that I need an alternative anyway, this becomes much easier, and
shrinks to this single hunk:
diff --git a/xen/arch/x86/include/asm/current.h
b/xen/arch/x86/include/asm/current.h
index c1eb27b1c4c2..35cc61fa88e7 100644
--- a/xen/arch/x86/include/asm/current.h
+++ b/xen/arch/x86/include/asm/current.h
@@ -154,7 +154,9 @@ unsigned long get_stack_dump_bottom (unsigned long sp);
"rdsspd %[ssp];" \
"cmp $1, %[ssp];" \
"je .L_shstk_done.%=;" /* CET not active? Skip. */ \
- "mov $%c[skstk_base], %[val];" \
+ ALTERNATIVE("mov $%c[skstk_base], %[val];", \
+ "mov $%c[skstk_base] + 8, %[val];", \
+ X86_FEATURE_XEN_FRED) \
"and $%c[stack_mask], %[ssp];" \
"sub %[ssp], %[val];" \
"shr $3, %[val];" \
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |