mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/mtrr: move is_var_mtrr_overlapped
Move it to x86 generic code. While at it, use proper boolean type and fix some cosmetic issues. Signed-off-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
c94ea358a3
commit
d6876bf23d
3 files changed
+33
-32
No files matched your search
@@ -51,6 +51,38 @@ get_fixed_ranges(mtrr_type * frs)
|
||||
}
|
||||
}
|
||||
|
||||
bool is_var_mtrr_overlapped(const struct mtrr_state *m)
|
||||
{
|
||||
unsigned int seg, i;
|
||||
unsigned int num_var_ranges = MASK_EXTR(m->mtrr_cap, MTRRcap_VCNT);
|
||||
|
||||
for ( i = 0; i < num_var_ranges; i++ )
|
||||
{
|
||||
uint64_t base1 = m->var_ranges[i].base >> PAGE_SHIFT;
|
||||
uint64_t mask1 = m->var_ranges[i].mask >> PAGE_SHIFT;
|
||||
|
||||
if ( !(m->var_ranges[i].mask & MTRR_PHYSMASK_VALID) )
|
||||
continue;
|
||||
|
||||
for ( seg = i + 1; seg < num_var_ranges; seg++ )
|
||||
{
|
||||
uint64_t base2 = m->var_ranges[seg].base >> PAGE_SHIFT;
|
||||
uint64_t mask2 = m->var_ranges[seg].mask >> PAGE_SHIFT;
|
||||
|
||||
if ( !(m->var_ranges[seg].mask & MTRR_PHYSMASK_VALID) )
|
||||
continue;
|
||||
|
||||
if ( (base1 & mask1 & mask2) == (base2 & mask2 & mask1) )
|
||||
{
|
||||
/* MTRRs overlap. */
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void mtrr_save_fixed_ranges(void *info)
|
||||
{
|
||||
get_fixed_ranges(mtrr_state.fixed_ranges);
|
||||
|
||||
@@ -75,37 +75,6 @@ static uint8_t __read_mostly mtrr_epat_tbl[MTRR_NUM_TYPES][MEMORY_NUM_TYPES] =
|
||||
static uint8_t __read_mostly pat_entry_tbl[PAT_TYPE_NUMS] =
|
||||
{ [0 ... PAT_TYPE_NUMS-1] = INVALID_MEM_TYPE };
|
||||
|
||||
bool_t is_var_mtrr_overlapped(const struct mtrr_state *m)
|
||||
{
|
||||
unsigned int seg, i;
|
||||
unsigned int num_var_ranges = MASK_EXTR(m->mtrr_cap, MTRRcap_VCNT);
|
||||
|
||||
for ( i = 0; i < num_var_ranges; i++ )
|
||||
{
|
||||
uint64_t base1 = m->var_ranges[i].base >> PAGE_SHIFT;
|
||||
uint64_t mask1 = m->var_ranges[i].mask >> PAGE_SHIFT;
|
||||
|
||||
if ( !(m->var_ranges[i].mask & MTRR_PHYSMASK_VALID) )
|
||||
continue;
|
||||
|
||||
for ( seg = i + 1; seg < num_var_ranges; seg ++ )
|
||||
{
|
||||
uint64_t base2 = m->var_ranges[seg].base >> PAGE_SHIFT;
|
||||
uint64_t mask2 = m->var_ranges[seg].mask >> PAGE_SHIFT;
|
||||
|
||||
if ( !(m->var_ranges[seg].mask & MTRR_PHYSMASK_VALID) )
|
||||
continue;
|
||||
|
||||
if ( (base1 & mask1 & mask2) == (base2 & mask2 & mask1) )
|
||||
{
|
||||
/* MTRR is overlapped. */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init hvm_mtrr_pat_init(void)
|
||||
{
|
||||
unsigned int i, j;
|
||||
|
||||
@@ -95,7 +95,7 @@ extern bool_t mtrr_def_type_msr_set(struct domain *, struct mtrr_state *,
|
||||
extern void memory_type_changed(struct domain *);
|
||||
extern bool_t pat_msr_set(uint64_t *pat, uint64_t msr);
|
||||
|
||||
bool_t is_var_mtrr_overlapped(const struct mtrr_state *m);
|
||||
bool is_var_mtrr_overlapped(const struct mtrr_state *m);
|
||||
bool mtrr_pat_not_equal(const struct vcpu *vd, const struct vcpu *vs);
|
||||
|
||||
#endif /* __ASM_X86_MTRR_H__ */
|
||||