[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/4] x86: Introduce MSR_UNHANDLED
On 1/8/21 9:55 AM, Jan Beulich wrote: > On 07.01.2021 21:34, Boris Ostrovsky wrote: >> --- a/xen/include/xen/lib/x86/msr.h >> +++ b/xen/include/xen/lib/x86/msr.h >> @@ -2,8 +2,21 @@ >> #ifndef XEN_LIB_X86_MSR_H >> #define XEN_LIB_X86_MSR_H >> >> +/* >> + * Behavior on accesses to MSRs that are not handled by emulation: > What about ones handled by emulation, when emulation decides to > raise #GP and this still causes trouble to a guest? (Slightly > orthogonal, so we may want to defer this aspect.) Yes, that's a good point --- in some cases the situation is somewhat similar, e.g. when a new bit shows up in an MSR that until now was considered invalid. > >> + * 0 = return #GP, warning emitted >> + * 1 = read as 0, writes are dropped, no warning >> + * 2 = read as 0, writes are dropped, warning emitted >> + */ >> +#define MSR_UNHANDLED_NEVER 0 >> +#define MSR_UNHANDLED_SILENT 1 >> +#define MSR_UNHANDLED_VERBOSE 2 >> + >> +/* MSR that is not explicitly processed by emulation */ >> +#define MSR_UNHANDLED -1 > Not sure about this choice: I'd consider an MSR index in the Xen > range more safe to use, not the least because this value > effectively becomes part of the migration ABI. Or if you use one > outside, then maybe a less prominent one than 0xffffffff (I > guess -1, irrespective of the missing parentheses, isn't > appropriate to use here). All MSRs in Xen range are currently handled (although most return an exception). I can reserve the last one (0x400002ff) if you feel it's more appropriate. > >> @@ -77,7 +78,7 @@ int x86_msr_copy_from_buffer(struct msr_policy *p, >> if ( copy_from_buffer_offset(&data, msrs, i, 1) ) >> return -EFAULT; >> >> - if ( data.flags ) /* .flags MBZ */ >> + if ( data.idx != MSR_UNHANDLED && data.flags ) > You permit all flags bits set here, but ... > >> @@ -101,6 +102,7 @@ int x86_msr_copy_from_buffer(struct msr_policy *p, >> >> case MSR_INTEL_PLATFORM_INFO: ASSIGN(platform_info.raw); break; >> case MSR_ARCH_CAPABILITIES: ASSIGN(arch_caps.raw); break; >> + case MSR_UNHANDLED: p->ignore_msrs = data.flags & 0xff; >> break; > ... you use only the low 8 ones here. You want to forbid any we > don't know of, and even restrict the low two ones to just the > three values you define. E.g. for now > > if ( data.idx != MSR_UNHANDLED ? data.flags > : data.flags > MSR_UNHANDLED_VERBOSE ) > { > rc = -EINVAL; > goto err; > > Otoh I don't see why you need to use flags here - I think you > could as well use the MSR value to convey the setting. And if > you don't, you'd want to check the value to be zero. Sure, using value will result in a slightly smaller diffstat too. -boris
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |