mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/paging: Delete update_cr3()'s do_locking parameter
Nicola reports that the XSA-438 fix introduced new MISRA violations because of some incidental tidying it tried to do. The parameter is useless, so resolve the MISRA regression by removing it. hap_update_cr3() discards the parameter entirely, while sh_update_cr3() uses it to distinguish internal and external callers and therefore whether the paging lock should be taken. However, we have paging_lock_recursive() for this purpose, which also avoids the ability for the shadow internal callers to accidentally not hold the lock. Fixes:fb0ff49fe9("x86/shadow: defer releasing of PV's top-level shadow reference") Reported-by: Nicola Vetrini <nicola.vetrini@bugseng.com> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Release-acked-by: Henry Wang <Henry.Wang@arm.com> (cherry picked from commite71157d1ac)
This commit is contained in:
1 parent
762cd54236
commit
ac20165f11
5 files changed
+14
-16
No files matched your search
@@ -728,7 +728,7 @@ static bool_t hap_invlpg(struct vcpu *v, unsigned long linear)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static pagetable_t hap_update_cr3(struct vcpu *v, bool do_locking, bool noflush)
|
||||
static pagetable_t hap_update_cr3(struct vcpu *v, bool noflush)
|
||||
{
|
||||
v->arch.hvm.hw_cr[3] = v->arch.hvm.guest_cr[3];
|
||||
hvm_update_guest_cr3(v, noflush);
|
||||
@@ -818,7 +818,7 @@ static void hap_update_paging_modes(struct vcpu *v)
|
||||
}
|
||||
|
||||
/* CR3 is effectively updated by a mode change. Flush ASIDs, etc. */
|
||||
hap_update_cr3(v, 0, false);
|
||||
hap_update_cr3(v, false);
|
||||
|
||||
unlock:
|
||||
paging_unlock(d);
|
||||
|
||||
@@ -2563,7 +2563,7 @@ static void sh_update_paging_modes(struct vcpu *v)
|
||||
}
|
||||
#endif /* OOS */
|
||||
|
||||
v->arch.paging.mode->update_cr3(v, 0, false);
|
||||
v->arch.paging.mode->update_cr3(v, false);
|
||||
}
|
||||
|
||||
void shadow_update_paging_modes(struct vcpu *v)
|
||||
|
||||
@@ -2499,7 +2499,7 @@ static int sh_page_fault(struct vcpu *v,
|
||||
* In any case, in the PAE case, the ASSERT is not true; it can
|
||||
* happen because of actions the guest is taking. */
|
||||
#if GUEST_PAGING_LEVELS == 3
|
||||
v->arch.paging.mode->update_cr3(v, 0, false);
|
||||
v->arch.paging.mode->update_cr3(v, false);
|
||||
#else
|
||||
ASSERT(d->is_shutting_down);
|
||||
#endif
|
||||
@@ -3219,17 +3219,13 @@ sh_detach_old_tables(struct vcpu *v)
|
||||
}
|
||||
}
|
||||
|
||||
static pagetable_t
|
||||
sh_update_cr3(struct vcpu *v, bool do_locking, bool noflush)
|
||||
static pagetable_t sh_update_cr3(struct vcpu *v, bool noflush)
|
||||
/* Updates vcpu->arch.cr3 after the guest has changed CR3.
|
||||
* Paravirtual guests should set v->arch.guest_table (and guest_table_user,
|
||||
* if appropriate).
|
||||
* HVM guests should also make sure hvm_get_guest_cntl_reg(v, 3) works;
|
||||
* this function will call hvm_update_guest_cr(v, 3) to tell them where the
|
||||
* shadow tables are.
|
||||
* If do_locking != 0, assume we are being called from outside the
|
||||
* shadow code, and must take and release the paging lock; otherwise
|
||||
* that is the caller's responsibility.
|
||||
*/
|
||||
{
|
||||
struct domain *d = v->domain;
|
||||
@@ -3247,7 +3243,11 @@ sh_update_cr3(struct vcpu *v, bool do_locking, bool noflush)
|
||||
return old_entry;
|
||||
}
|
||||
|
||||
if ( do_locking ) paging_lock(v->domain);
|
||||
/*
|
||||
* This is used externally (with the paging lock not taken) and internally
|
||||
* by the shadow code (with the lock already taken).
|
||||
*/
|
||||
paging_lock_recursive(v->domain);
|
||||
|
||||
#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
|
||||
/* Need to resync all the shadow entries on a TLB flush. Resync
|
||||
@@ -3483,8 +3483,7 @@ sh_update_cr3(struct vcpu *v, bool do_locking, bool noflush)
|
||||
shadow_sync_other_vcpus(v);
|
||||
#endif
|
||||
|
||||
/* Release the lock, if we took it (otherwise it's the caller's problem) */
|
||||
if ( do_locking ) paging_unlock(v->domain);
|
||||
paging_unlock(v->domain);
|
||||
|
||||
return old_entry;
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ static unsigned long _gva_to_gfn(struct vcpu *v, struct p2m_domain *p2m,
|
||||
}
|
||||
#endif
|
||||
|
||||
static pagetable_t _update_cr3(struct vcpu *v, bool do_locking, bool noflush)
|
||||
static pagetable_t _update_cr3(struct vcpu *v, bool noflush)
|
||||
{
|
||||
ASSERT_UNREACHABLE();
|
||||
return pagetable_null();
|
||||
|
||||
@@ -138,8 +138,7 @@ struct paging_mode {
|
||||
paddr_t ga, uint32_t *pfec,
|
||||
unsigned int *page_order);
|
||||
#endif
|
||||
pagetable_t (*update_cr3 )(struct vcpu *v, bool do_locking,
|
||||
bool noflush);
|
||||
pagetable_t (*update_cr3 )(struct vcpu *v, bool noflush);
|
||||
void (*update_paging_modes )(struct vcpu *v);
|
||||
bool (*flush_tlb )(bool (*flush_vcpu)(void *ctxt,
|
||||
struct vcpu *v),
|
||||
@@ -317,7 +316,7 @@ static inline unsigned long paging_ga_to_gfn_cr3(struct vcpu *v,
|
||||
* as the value to load into the host CR3 to schedule this vcpu */
|
||||
static inline pagetable_t paging_update_cr3(struct vcpu *v, bool noflush)
|
||||
{
|
||||
return paging_get_hostmode(v)->update_cr3(v, 1, noflush);
|
||||
return paging_get_hostmode(v)->update_cr3(v, noflush);
|
||||
}
|
||||
|
||||
/* Update all the things that are derived from the guest's CR0/CR3/CR4.
|
||||
|
||||