mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/paging: move update_paging_modes() hook
The hook isn't mode dependent, hence it's misplaced in struct paging_mode. (Or alternatively I see no reason why the alloc_page() and free_page() hooks don't also live there.) Move it to struct paging_domain. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
1 parent
6b41622ae0
commit
d0816a9085
7 files changed
+27
-19
No files matched your search
@@ -235,6 +235,8 @@ struct paging_domain {
|
||||
* (used by p2m and log-dirty code for their tries) */
|
||||
struct page_info * (*alloc_page)(struct domain *d);
|
||||
void (*free_page)(struct domain *d, struct page_info *pg);
|
||||
|
||||
void (*update_paging_modes)(struct vcpu *v);
|
||||
};
|
||||
|
||||
struct paging_vcpu {
|
||||
|
||||
@@ -139,7 +139,6 @@ struct paging_mode {
|
||||
#endif
|
||||
void (*update_cr3 )(struct vcpu *v, int do_locking,
|
||||
bool noflush);
|
||||
void (*update_paging_modes )(struct vcpu *v);
|
||||
bool (*flush_tlb )(const unsigned long *vcpu_bitmap);
|
||||
|
||||
unsigned int guest_levels;
|
||||
@@ -315,7 +314,7 @@ static inline void paging_update_cr3(struct vcpu *v, bool noflush)
|
||||
* has changed, and when bringing up a VCPU for the first time. */
|
||||
static inline void paging_update_paging_modes(struct vcpu *v)
|
||||
{
|
||||
paging_get_hostmode(v)->update_paging_modes(v);
|
||||
v->domain->arch.paging.update_paging_modes(v);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PV
|
||||
|
||||
@@ -443,6 +443,9 @@ static void hap_destroy_monitor_table(struct vcpu* v, mfn_t mmfn)
|
||||
/************************************************/
|
||||
/* HAP DOMAIN LEVEL FUNCTIONS */
|
||||
/************************************************/
|
||||
|
||||
static void cf_check hap_update_paging_modes(struct vcpu *v);
|
||||
|
||||
void hap_domain_init(struct domain *d)
|
||||
{
|
||||
static const struct log_dirty_ops hap_ops = {
|
||||
@@ -453,6 +456,8 @@ void hap_domain_init(struct domain *d)
|
||||
|
||||
/* Use HAP logdirty mechanism. */
|
||||
paging_log_dirty_init(d, &hap_ops);
|
||||
|
||||
d->arch.paging.update_paging_modes = hap_update_paging_modes;
|
||||
}
|
||||
|
||||
/* return 0 for success, -errno for failure */
|
||||
@@ -842,7 +847,6 @@ static const struct paging_mode hap_paging_real_mode = {
|
||||
.gva_to_gfn = hap_gva_to_gfn_real_mode,
|
||||
.p2m_ga_to_gfn = hap_p2m_ga_to_gfn_real_mode,
|
||||
.update_cr3 = hap_update_cr3,
|
||||
.update_paging_modes = hap_update_paging_modes,
|
||||
.flush_tlb = flush_tlb,
|
||||
.guest_levels = 1
|
||||
};
|
||||
@@ -853,7 +857,6 @@ static const struct paging_mode hap_paging_protected_mode = {
|
||||
.gva_to_gfn = hap_gva_to_gfn_2_levels,
|
||||
.p2m_ga_to_gfn = hap_p2m_ga_to_gfn_2_levels,
|
||||
.update_cr3 = hap_update_cr3,
|
||||
.update_paging_modes = hap_update_paging_modes,
|
||||
.flush_tlb = flush_tlb,
|
||||
.guest_levels = 2
|
||||
};
|
||||
@@ -864,7 +867,6 @@ static const struct paging_mode hap_paging_pae_mode = {
|
||||
.gva_to_gfn = hap_gva_to_gfn_3_levels,
|
||||
.p2m_ga_to_gfn = hap_p2m_ga_to_gfn_3_levels,
|
||||
.update_cr3 = hap_update_cr3,
|
||||
.update_paging_modes = hap_update_paging_modes,
|
||||
.flush_tlb = flush_tlb,
|
||||
.guest_levels = 3
|
||||
};
|
||||
@@ -875,7 +877,6 @@ static const struct paging_mode hap_paging_long_mode = {
|
||||
.gva_to_gfn = hap_gva_to_gfn_4_levels,
|
||||
.p2m_ga_to_gfn = hap_p2m_ga_to_gfn_4_levels,
|
||||
.update_cr3 = hap_update_cr3,
|
||||
.update_paging_modes = hap_update_paging_modes,
|
||||
.flush_tlb = flush_tlb,
|
||||
.guest_levels = 4
|
||||
};
|
||||
|
||||
@@ -83,6 +83,8 @@ static int cf_check sh_enable_log_dirty(struct domain *, bool log_global);
|
||||
static int cf_check sh_disable_log_dirty(struct domain *);
|
||||
static void cf_check sh_clean_dirty_bitmap(struct domain *);
|
||||
|
||||
static void cf_check shadow_update_paging_modes(struct vcpu *);
|
||||
|
||||
/* Set up the shadow-specific parts of a domain struct at start of day.
|
||||
* Called for every domain from arch_domain_create() */
|
||||
int shadow_domain_init(struct domain *d)
|
||||
@@ -98,6 +100,8 @@ int shadow_domain_init(struct domain *d)
|
||||
/* Use shadow pagetables for log-dirty support */
|
||||
paging_log_dirty_init(d, &sh_ops);
|
||||
|
||||
d->arch.paging.update_paging_modes = shadow_update_paging_modes;
|
||||
|
||||
#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
|
||||
d->arch.paging.shadow.oos_active = 0;
|
||||
#endif
|
||||
@@ -2514,7 +2518,12 @@ static void sh_update_paging_modes(struct vcpu *v)
|
||||
v->arch.paging.mode->update_cr3(v, 0, false);
|
||||
}
|
||||
|
||||
void cf_check shadow_update_paging_modes(struct vcpu *v)
|
||||
/*
|
||||
* Update all the things that are derived from the guest's CR0/CR3/CR4.
|
||||
* Called to initialize paging structures if the paging mode has changed,
|
||||
* and when bringing up a VCPU for the first time.
|
||||
*/
|
||||
static void cf_check shadow_update_paging_modes(struct vcpu *v)
|
||||
{
|
||||
paging_lock(v->domain);
|
||||
sh_update_paging_modes(v);
|
||||
|
||||
@@ -4167,7 +4167,6 @@ const struct paging_mode sh_paging_mode = {
|
||||
.gva_to_gfn = sh_gva_to_gfn,
|
||||
#endif
|
||||
.update_cr3 = sh_update_cr3,
|
||||
.update_paging_modes = shadow_update_paging_modes,
|
||||
.flush_tlb = shadow_flush_tlb,
|
||||
.guest_levels = GUEST_PAGING_LEVELS,
|
||||
#ifdef CONFIG_PV
|
||||
|
||||
@@ -18,8 +18,14 @@ static void cf_check _clean_dirty_bitmap(struct domain *d)
|
||||
ASSERT(is_pv_domain(d));
|
||||
}
|
||||
|
||||
static void cf_check _update_paging_modes(struct vcpu *v)
|
||||
{
|
||||
ASSERT_UNREACHABLE();
|
||||
}
|
||||
|
||||
int shadow_domain_init(struct domain *d)
|
||||
{
|
||||
/* For HVM set up pointers for safety, then fail. */
|
||||
static const struct log_dirty_ops sh_none_ops = {
|
||||
.enable = _enable_log_dirty,
|
||||
.disable = _disable_log_dirty,
|
||||
@@ -27,6 +33,9 @@ int shadow_domain_init(struct domain *d)
|
||||
};
|
||||
|
||||
paging_log_dirty_init(d, &sh_none_ops);
|
||||
|
||||
d->arch.paging.update_paging_modes = _update_paging_modes;
|
||||
|
||||
return is_hvm_domain(d) ? -EOPNOTSUPP : 0;
|
||||
}
|
||||
|
||||
@@ -57,11 +66,6 @@ static void cf_check _update_cr3(struct vcpu *v, int do_locking, bool noflush)
|
||||
ASSERT_UNREACHABLE();
|
||||
}
|
||||
|
||||
static void cf_check _update_paging_modes(struct vcpu *v)
|
||||
{
|
||||
ASSERT_UNREACHABLE();
|
||||
}
|
||||
|
||||
static const struct paging_mode sh_paging_none = {
|
||||
.page_fault = _page_fault,
|
||||
.invlpg = _invlpg,
|
||||
@@ -69,7 +73,6 @@ static const struct paging_mode sh_paging_none = {
|
||||
.gva_to_gfn = _gva_to_gfn,
|
||||
#endif
|
||||
.update_cr3 = _update_cr3,
|
||||
.update_paging_modes = _update_paging_modes,
|
||||
};
|
||||
|
||||
void shadow_vcpu_init(struct vcpu *v)
|
||||
|
||||
@@ -434,11 +434,6 @@ void cf_check sh_write_guest_entry(
|
||||
intpte_t cf_check sh_cmpxchg_guest_entry(
|
||||
struct vcpu *v, intpte_t *p, intpte_t old, intpte_t new, mfn_t gmfn);
|
||||
|
||||
/* Update all the things that are derived from the guest's CR0/CR3/CR4.
|
||||
* Called to initialize paging structures if the paging mode
|
||||
* has changed, and when bringing up a VCPU for the first time. */
|
||||
void cf_check shadow_update_paging_modes(struct vcpu *v);
|
||||
|
||||
/* Unhook the non-Xen mappings in this top-level shadow mfn.
|
||||
* With user_only == 1, unhooks only the user-mode mappings. */
|
||||
void shadow_unhook_mappings(struct domain *d, mfn_t smfn, int user_only);
|
||||
|
||||