[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC 5/6] capabilities: add dom0 cpu faulting disable
On 01.08.2023 22:20, Daniel P. Smith wrote: > --- a/xen/arch/x86/cpu/common.c > +++ b/xen/arch/x86/cpu/common.c > @@ -164,48 +164,46 @@ static void set_cpuid_faulting(bool enable) > > void ctxt_switch_levelling(const struct vcpu *next) > { > - const struct domain *nextd = next ? next->domain : NULL; > - bool enable_cpuid_faulting; > - > - if (cpu_has_cpuid_faulting || > - boot_cpu_has(X86_FEATURE_CPUID_USER_DIS)) { > - /* > - * No need to alter the faulting setting if we are switching > - * to idle; it won't affect any code running in idle context. > - */ > - if (nextd && is_idle_domain(nextd)) > - return; > - /* > - * We *should* be enabling faulting for PV control domains. > - * > - * The domain builder has now been updated to not depend on > - * seeing host CPUID values. This makes it compatible with > - * PVH toolstack domains, and lets us enable faulting by > - * default for all PV domains. > - * > - * However, as PV control domains have never had faulting > - * enforced on them before, there might plausibly be other > - * dependenices on host CPUID data. Therefore, we have left > - * an interim escape hatch in the form of > - * `dom0=no-cpuid-faulting` to restore the older behaviour. > - */ > - enable_cpuid_faulting = nextd && (opt_dom0_cpuid_faulting || > - !is_control_domain(nextd) || > - !is_pv_domain(nextd)) && > - (is_pv_domain(nextd) || > - next->arch.msrs-> > - misc_features_enables.cpuid_faulting); > - > - if (cpu_has_cpuid_faulting) > - set_cpuid_faulting(enable_cpuid_faulting); > - else > - amd_set_cpuid_user_dis(enable_cpuid_faulting); > - > - return; > - } > - > - if (ctxt_switch_masking) > - alternative_vcall(ctxt_switch_masking, next); > + const struct domain *nextd = next ? next->domain : NULL; > + bool enable_cpuid_faulting; > + > + if ( cpu_has_cpuid_faulting || > + boot_cpu_has(X86_FEATURE_CPUID_USER_DIS) ) { > + /* > + * No need to alter the faulting setting if we are switching > + * to idle; it won't affect any code running in idle context. > + */ > + if (nextd && is_idle_domain(nextd)) > + return; > + /* > + * We *should* be enabling faulting for PV control domains. > + * > + * The domain builder has now been updated to not depend on > + * seeing host CPUID values. This makes it compatible with > + * PVH toolstack domains, and lets us enable faulting by > + * default for all PV domains. > + * > + * However, as PV control domains have never had faulting > + * enforced on them before, there might plausibly be other > + * dependenices on host CPUID data. Therefore, we have left > + * an interim escape hatch in the form of > + * `dom0=no-cpuid-faulting` to restore the older behaviour. > + */ > + enable_cpuid_faulting = nextd && > + domain_has_cap(nextd, CAP_DISABLE_CPU_FAULT) && > + (is_pv_domain(nextd) || > + next->arch.msrs->misc_features_enables.cpuid_faulting); > + > + if (cpu_has_cpuid_faulting) > + set_cpuid_faulting(enable_cpuid_faulting); > + else > + amd_set_cpuid_user_dis(enable_cpuid_faulting); > + > + return; > + } > + > + if (ctxt_switch_masking) > + alternative_vcall(ctxt_switch_masking, next); > } I don't think I can spot what exactly changes here. Please avoid re- indenting the entire function. > --- a/xen/arch/x86/setup.c > +++ b/xen/arch/x86/setup.c > @@ -907,6 +907,10 @@ static struct domain *__init create_dom0(const module_t > *image, > > d->role |= ROLE_UNBOUNDED_DOMAIN; > > + if ( !opt_dom0_cpuid_faulting && > + !domain_set_cap(d, CAP_DISABLE_CPU_FAULT) ) > + printk(XENLOG_WARNING "failed to set CPU faulting on Dom %pd\n", d); No "Dom" please when you use %pd. Also I don't think you mean "set". Plus we commonly use "%pd: xyz failed\n". > --- a/xen/include/xen/sched.h > +++ b/xen/include/xen/sched.h > @@ -472,7 +472,8 @@ struct domain > #define ROLE_HARDWARE_DOMAIN (1U<<2) > #define ROLE_XENSTORE_DOMAIN (1U<<3) > uint8_t role; > -#define CAP_CONSOLE_IO (1U<<0) > +#define CAP_CONSOLE_IO (1U<<0) > +#define CAP_DISABLE_CPU_FAULT (1U<<1) > uint8_t capabilities; > /* Is this guest being debugged by dom0? */ > bool debugger_attached; > @@ -1160,6 +1161,11 @@ static always_inline bool domain_set_cap( > case CAP_CONSOLE_IO: > d->capabilities |= cap; > break; > + case CAP_DISABLE_CPU_FAULT: > + /* Disabling cpu faulting is only allowed for a PV control domain. */ > + if ( is_pv_domain(d) && is_control_domain(d) ) > + d->capabilities |= cap; > + break; How do you express the x86-ness of this? Plus shouldn't this fail when either of the two conditions isn't met? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |