|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Ping: [PATCH v2] x86: correct asm() constraints when dealing with immediate selector values
On 13.09.2021 08:26, Jan Beulich wrote:
> asm() constraints need to fit both the intended insn(s) which the
> respective operands are going to be used with as well as the actual kind
> of value specified. "m" (alone) together with a constant, however, leads
> to gcc saying
>
> error: memory input <N> is not directly addressable
>
> while clang complains
>
> error: invalid lvalue in asm input for constraint 'm'
>
> And rightly so - in order to access a memory operand, an address needs
> to be specified to the insn. In some cases it might be possible for a
> compiler to synthesize a memory operand holding the requested constant,
> but I think any solution there would have sharp edges.
>
> If "m" alone doesn't work with constants, it is at best pointless (and
> perhaps misleading or even risky - the compiler might decide to actually
> pick "m" and not try very hard to find a suitable register) to specify
> it alongside "r". And indeed clang does, oddly enough despite its
> objection to "m" alone. Which means there the change also improves the
> generated code.
>
> While there also switch the two operand case to using named operands.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> v2: Use named operands in do_double_fault().
This has been pending for over 9 months. May I ask for feedback?
Thanks, Jan
> --- a/xen/arch/x86/cpu/amd.c
> +++ b/xen/arch/x86/cpu/amd.c
> @@ -736,7 +736,7 @@ void __init detect_zen2_null_seg_behavio
> uint64_t base;
>
> wrmsrl(MSR_FS_BASE, 1);
> - asm volatile ( "mov %0, %%fs" :: "rm" (0) );
> + asm volatile ( "mov %0, %%fs" :: "r" (0) );
> rdmsrl(MSR_FS_BASE, base);
>
> if (base == 0)
> --- a/xen/arch/x86/x86_64/traps.c
> +++ b/xen/arch/x86/x86_64/traps.c
> @@ -248,7 +248,8 @@ void do_double_fault(struct cpu_user_reg
>
> console_force_unlock();
>
> - asm ( "lsll %1, %0" : "=r" (cpu) : "rm" (PER_CPU_SELECTOR) );
> + asm ( "lsll %[sel], %[limit]" : [limit] "=r" (cpu)
> + : [sel] "r" (PER_CPU_SELECTOR) );
>
> /* Find information saved during fault and dump it to the console. */
> printk("*** DOUBLE FAULT ***\n");
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |