/************************************************/
void hap_domain_init(struct domain *d)
{
+ static const struct log_dirty_ops hap_ops = {
+ .enable = hap_enable_log_dirty,
+ .disable = hap_disable_log_dirty,
+ .clean = hap_clean_dirty_bitmap,
+ };
+
INIT_PAGE_LIST_HEAD(&d->arch.paging.hap.freelist);
/* Use HAP logdirty mechanism. */
- paging_log_dirty_init(d, hap_enable_log_dirty,
- hap_disable_log_dirty,
- hap_clean_dirty_bitmap);
+ paging_log_dirty_init(d, &hap_ops);
}
/* return 0 for success, -errno for failure */
return -EINVAL;
domain_pause(d);
- ret = d->arch.paging.log_dirty.enable_log_dirty(d, log_global);
+ ret = d->arch.paging.log_dirty.ops->enable(d, log_global);
domain_unpause(d);
return ret;
/* Safe because the domain is paused. */
if ( paging_mode_log_dirty(d) )
{
- ret = d->arch.paging.log_dirty.disable_log_dirty(d);
+ ret = d->arch.paging.log_dirty.ops->disable(d);
ASSERT(ret <= 0);
}
}
{
/* We need to further call clean_dirty_bitmap() functions of specific
* paging modes (shadow or hap). Safe because the domain is paused. */
- d->arch.paging.log_dirty.clean_dirty_bitmap(d);
+ d->arch.paging.log_dirty.ops->clean(d);
}
domain_unpause(d);
return rv;
flush_tlb_mask(d->domain_dirty_cpumask);
}
-/* Note that this function takes three function pointers. Callers must supply
- * these functions for log dirty code to call. This function usually is
- * invoked when paging is enabled. Check shadow_enable() and hap_enable() for
- * reference.
+/*
+ * Callers must supply log_dirty_ops for the log dirty code to call. This
+ * function usually is invoked when paging is enabled. Check shadow_enable()
+ * and hap_enable() for reference.
*
* These function pointers must not be followed with the log-dirty lock held.
*/
-void paging_log_dirty_init(struct domain *d,
- int (*enable_log_dirty)(struct domain *d,
- bool_t log_global),
- int (*disable_log_dirty)(struct domain *d),
- void (*clean_dirty_bitmap)(struct domain *d))
+void paging_log_dirty_init(struct domain *d, const struct log_dirty_ops *ops)
{
- d->arch.paging.log_dirty.enable_log_dirty = enable_log_dirty;
- d->arch.paging.log_dirty.disable_log_dirty = disable_log_dirty;
- d->arch.paging.log_dirty.clean_dirty_bitmap = clean_dirty_bitmap;
+ d->arch.paging.log_dirty.ops = ops;
}
/************************************************/
* Called for every domain from arch_domain_create() */
int shadow_domain_init(struct domain *d, unsigned int domcr_flags)
{
+ static const struct log_dirty_ops sh_ops = {
+ .enable = sh_enable_log_dirty,
+ .disable = sh_disable_log_dirty,
+ .clean = sh_clean_dirty_bitmap,
+ };
+
INIT_PAGE_LIST_HEAD(&d->arch.paging.shadow.freelist);
INIT_PAGE_LIST_HEAD(&d->arch.paging.shadow.pinned_shadows);
/* Use shadow pagetables for log-dirty support */
- paging_log_dirty_init(d, sh_enable_log_dirty,
- sh_disable_log_dirty, sh_clean_dirty_bitmap);
+ paging_log_dirty_init(d, &sh_ops);
#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
d->arch.paging.shadow.oos_active = 0;
unsigned int dirty_count;
/* functions which are paging mode specific */
- int (*enable_log_dirty )(struct domain *d, bool_t log_global);
- int (*disable_log_dirty )(struct domain *d);
- void (*clean_dirty_bitmap )(struct domain *d);
+ const struct log_dirty_ops {
+ int (*enable )(struct domain *d, bool log_global);
+ int (*disable )(struct domain *d);
+ void (*clean )(struct domain *d);
+ } *ops;
};
struct paging_domain {
int paging_log_dirty_enable(struct domain *d, bool_t log_global);
/* log dirty initialization */
-void paging_log_dirty_init(struct domain *d,
- int (*enable_log_dirty)(struct domain *d,
- bool_t log_global),
- int (*disable_log_dirty)(struct domain *d),
- void (*clean_dirty_bitmap)(struct domain *d));
+void paging_log_dirty_init(struct domain *d, const struct log_dirty_ops *ops);
/* mark a page as dirty */
void paging_mark_dirty(struct domain *d, mfn_t gmfn);