return true;
}
+static void free_evtchn_bucket(struct domain *d, struct evtchn *bucket)
+{
+ if ( !bucket )
+ return;
+
+ xsm_free_security_evtchns(bucket, EVTCHNS_PER_BUCKET);
+ xfree(bucket);
+}
static struct evtchn *alloc_evtchn_bucket(struct domain *d, unsigned int port)
{
chn = xzalloc_array(struct evtchn, EVTCHNS_PER_BUCKET);
if ( !chn )
- return NULL;
+ goto err;
+
+ if ( xsm_alloc_security_evtchns(chn, EVTCHNS_PER_BUCKET) )
+ goto err;
for ( i = 0; i < EVTCHNS_PER_BUCKET; i++ )
{
- if ( xsm_alloc_security_evtchn(&chn[i]) )
- {
- while ( i-- )
- xsm_free_security_evtchn(&chn[i]);
- xfree(chn);
- return NULL;
- }
chn[i].port = port + i;
rwlock_init(&chn[i].lock);
}
- return chn;
-}
-
-static void free_evtchn_bucket(struct domain *d, struct evtchn *bucket)
-{
- unsigned int i;
- if ( !bucket )
- return;
-
- for ( i = 0; i < EVTCHNS_PER_BUCKET; i++ )
- xsm_free_security_evtchn(bucket + i);
+ return chn;
- xfree(bucket);
+ err:
+ free_evtchn_bucket(d, chn);
+ return NULL;
}
int evtchn_allocate_port(struct domain *d, evtchn_port_t port)
return xsm_default_action(action, d1, d2);
}
-static XSM_INLINE int xsm_alloc_security_evtchn(struct evtchn *chn)
+static XSM_INLINE int xsm_alloc_security_evtchns(
+ struct evtchn chn[], unsigned int nr)
{
return 0;
}
-static XSM_INLINE void xsm_free_security_evtchn(struct evtchn *chn)
+static XSM_INLINE void xsm_free_security_evtchns(
+ struct evtchn chn[], unsigned int nr)
{
return;
}
int (*alloc_security_domain) (struct domain *d);
void (*free_security_domain) (struct domain *d);
- int (*alloc_security_evtchn) (struct evtchn *chn);
- void (*free_security_evtchn) (struct evtchn *chn);
+ int (*alloc_security_evtchns) (struct evtchn chn[], unsigned int nr);
+ void (*free_security_evtchns) (struct evtchn chn[], unsigned int nr);
char *(*show_security_evtchn) (struct domain *d, const struct evtchn *chn);
int (*init_hardware_domain) (struct domain *d);
xsm_ops->free_security_domain(d);
}
-static inline int xsm_alloc_security_evtchn (struct evtchn *chn)
+static inline int xsm_alloc_security_evtchns(
+ struct evtchn chn[], unsigned int nr)
{
- return xsm_ops->alloc_security_evtchn(chn);
+ return xsm_ops->alloc_security_evtchns(chn, nr);
}
-static inline void xsm_free_security_evtchn (struct evtchn *chn)
+static inline void xsm_free_security_evtchns(
+ struct evtchn chn[], unsigned int nr)
{
- (void)xsm_ops->free_security_evtchn(chn);
+ xsm_ops->free_security_evtchns(chn, nr);
}
static inline char *xsm_show_security_evtchn (struct domain *d, const struct evtchn *chn)
set_to_dummy_if_null(ops, alloc_security_domain);
set_to_dummy_if_null(ops, free_security_domain);
- set_to_dummy_if_null(ops, alloc_security_evtchn);
- set_to_dummy_if_null(ops, free_security_evtchn);
+ set_to_dummy_if_null(ops, alloc_security_evtchns);
+ set_to_dummy_if_null(ops, free_security_evtchns);
set_to_dummy_if_null(ops, show_security_evtchn);
set_to_dummy_if_null(ops, init_hardware_domain);
return domain_has_perm(d1, d2, SECCLASS_EVENT, EVENT__RESET);
}
-static int flask_alloc_security_evtchn(struct evtchn *chn)
+static int flask_alloc_security_evtchns(struct evtchn chn[], unsigned int nr)
{
- chn->ssid.flask_sid = SECINITSID_UNLABELED;
+ unsigned int i;
+
+ for ( i = 0; i < nr; ++i )
+ chn[i].ssid.flask_sid = SECINITSID_UNLABELED;
- return 0;
+ return 0;
}
-static void flask_free_security_evtchn(struct evtchn *chn)
+static void flask_free_security_evtchns(struct evtchn chn[], unsigned int nr)
{
+ unsigned int i;
+
if ( !chn )
return;
- chn->ssid.flask_sid = SECINITSID_UNLABELED;
+ for ( i = 0; i < nr; ++i )
+ chn[i].ssid.flask_sid = SECINITSID_UNLABELED;
}
static char *flask_show_security_evtchn(struct domain *d, const struct evtchn *chn)
.alloc_security_domain = flask_domain_alloc_security,
.free_security_domain = flask_domain_free_security,
- .alloc_security_evtchn = flask_alloc_security_evtchn,
- .free_security_evtchn = flask_free_security_evtchn,
+ .alloc_security_evtchns = flask_alloc_security_evtchns,
+ .free_security_evtchns = flask_free_security_evtchns,
.show_security_evtchn = flask_show_security_evtchn,
.init_hardware_domain = flask_init_hardware_domain,