[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/2] xsm: create idle domain privieged and demote after setup
On Wed, Apr 20, 2022 at 06:28:33PM -0400, Daniel P. Smith wrote: > There are now instances where internal hypervisor logic needs to make resource > allocation calls that are protectd by XSM checks. The internal hypervisor > logic > is represented a number of system domains which by designed are represented by > non-privileged struct domain instances. To enable these logic blocks to > function correctly but in a controlled manner, this commit changes the idle > domain to be created as a privileged domain under the default policy, which is > inherited by the SILO policy, and demoted before transitioning to running. A > new XSM hook, xsm_transition_running, is introduced to allow each XSM policy > type to demote the idle domain appropriately for that policy type. > > For flask a stub is added to ensure that flask policy system will function > correctly with this patch until flask is extended with support for starting > the > idle domain privileged and properly demoting it on the call to > xsm_transtion_running. > > Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx> > --- > xen/arch/arm/setup.c | 6 ++++++ > xen/arch/x86/setup.c | 6 ++++++ > xen/common/sched/core.c | 7 ++++++- > xen/include/xsm/dummy.h | 12 ++++++++++++ > xen/include/xsm/xsm.h | 6 ++++++ > xen/xsm/dummy.c | 1 + > xen/xsm/flask/hooks.c | 15 +++++++++++++++ > 7 files changed, 52 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > index d5d0792ed4..763835aeb5 100644 > --- a/xen/arch/arm/setup.c > +++ b/xen/arch/arm/setup.c > @@ -1048,6 +1048,12 @@ void __init start_xen(unsigned long boot_phys_offset, > /* Hide UART from DOM0 if we're using it */ > serial_endboot(); > > + xsm_transition_running(); Could we put depriv or dipriviledge somewhere here? 'transition' seem to ambiguous IMO (but I'm not a native speaker). xsm_{depriv,demote}_current(); > + > + /* Ensure idle domain was not left privileged */ > + if ( current->domain->is_privileged ) > + panic("idle domain did not properly transition from setup > privilege\n"); > + > system_state = SYS_STATE_active; > > for_each_domain( d ) > diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c > index 6f20e17892..72695dcb07 100644 > --- a/xen/arch/x86/setup.c > +++ b/xen/arch/x86/setup.c > @@ -621,6 +621,12 @@ static void noreturn init_done(void) > void *va; > unsigned long start, end; > > + xsm_transition_running(); > + > + /* Ensure idle domain was not left privileged */ > + if ( current->domain->is_privileged ) > + panic("idle domain did not properly transition from setup > privilege\n"); > + > system_state = SYS_STATE_active; > > domain_unpause_by_systemcontroller(dom0); > diff --git a/xen/common/sched/core.c b/xen/common/sched/core.c > index 19ab678181..22a619e260 100644 > --- a/xen/common/sched/core.c > +++ b/xen/common/sched/core.c > @@ -3021,7 +3021,12 @@ void __init scheduler_init(void) > sched_ratelimit_us = SCHED_DEFAULT_RATELIMIT_US; > } > > - idle_domain = domain_create(DOMID_IDLE, NULL, 0); > + /* > + * idle dom is created privileged to ensure unrestricted access during > + * setup and will be demoted by xsm_transition_running when setup is > + * complete > + */ > + idle_domain = domain_create(DOMID_IDLE, NULL, CDF_privileged); > BUG_ON(IS_ERR(idle_domain)); > BUG_ON(nr_cpu_ids > ARRAY_SIZE(idle_vcpu)); > idle_domain->vcpu = idle_vcpu; > diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h > index 58afc1d589..b33f0ec672 100644 > --- a/xen/include/xsm/dummy.h > +++ b/xen/include/xsm/dummy.h > @@ -101,6 +101,18 @@ static always_inline int xsm_default_action( > } > } > > +static XSM_INLINE void cf_check xsm_transition_running(void) > +{ > + struct domain *d = current->domain; > + > + if ( d->domain_id != DOMID_IDLE ) > + panic("xsm_transition_running should only be called by idle > domain\n"); Could you also add a check that d->is_privileged == true? Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |