[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 02/16] x86/msr: Rework rdmsr_safe() using asm goto()
On 19.08.2025 15:52, Andrew Cooper wrote: > On 18/08/2025 12:27 pm, Jan Beulich wrote: >> On 15.08.2025 22:41, Andrew Cooper wrote: >>> ... on capable toolchains. >>> >>> This avoids needing to hold rc in a register across the RDMSR, and in most >>> cases removes direct testing and branching based on rc, as the fault label >>> can >>> be rearranged to directly land on the out-of-line block. >>> >>> There is a subtle difference in behaviour. The old behaviour would, on >>> fault, >>> still produce 0's and write to val. >>> >>> The new behaviour only writes val on success, and write_msr() is the only >>> place where this matters. Move temp out of switch() scope and initialise it >>> to 0. >> But what's the motivation behind making this behavioral change? At least in >> the cases where the return value isn't checked, it would feel safer if we >> continued clearing the value. Even if in all cases where this could matter >> (besides the one you cover here) one can prove correctness by looking at >> surrounding code. > > I didn't realise I'd made a change at first, but it's a consequence of > the compiler's ability to rearrange basic blocks. > > It can be fixed with ... > >> >>> --- a/xen/arch/x86/include/asm/msr.h >>> +++ b/xen/arch/x86/include/asm/msr.h >>> @@ -55,6 +55,24 @@ static inline void wrmsrns(uint32_t msr, uint64_t val) >>> /* rdmsr with exception handling */ >>> static inline int rdmsr_safe(unsigned int msr, uint64_t *val) >>> { >>> +#ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT >>> + uint64_t lo, hi; >>> + asm_inline goto ( >>> + "1: rdmsr\n\t" >>> + _ASM_EXTABLE(1b, %l[fault]) >>> + : "=a" (lo), "=d" (hi) >>> + : "c" (msr) >>> + : >>> + : fault ); >>> + >>> + *val = lo | (hi << 32); >>> + >>> + return 0; >>> + >>> + fault: > > *val = 0; > > here, but I don't want to do this. Because val is by pointer and > generally spilled to the stack, the compiler can't optimise away the store. But the compiler is dealing with such indirection in inline functions just fine. I don't expect it would typically spill val to the stack. Is there anything specific here that you think would make this more likely? > I'd far rather get a real compiler error, than to have logic relying on > the result of a faulting MSR read. A compiler error? (Hmm, perhaps you think of uninitialized variable diagnostics. That may or may not trigger, depending on how else the caller's variable is used.) Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |