[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 22/27] xen mtrr: Implement xen_get_free_region()
From: Mark McLoughlin <markmc@xxxxxxxxxx> When an already set MTRR is being changed, we need to first unset, since Xen also maintains a usage count. Signed-off-by: Mark McLoughlin <markmc@xxxxxxxxxx> --- arch/x86/kernel/cpu/mtrr/mtrr.h | 2 ++ arch/x86/kernel/cpu/mtrr/xen.c | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletions(-) diff --git a/arch/x86/kernel/cpu/mtrr/mtrr.h b/arch/x86/kernel/cpu/mtrr/mtrr.h index eb23ca2..6142d6e 100644 --- a/arch/x86/kernel/cpu/mtrr/mtrr.h +++ b/arch/x86/kernel/cpu/mtrr/mtrr.h @@ -5,6 +5,8 @@ #include <linux/types.h> #include <linux/stddef.h> +#include <asm/mtrr.h> + #define MTRRcap_MSR 0x0fe #define MTRRdefType_MSR 0x2ff diff --git a/arch/x86/kernel/cpu/mtrr/xen.c b/arch/x86/kernel/cpu/mtrr/xen.c index 622d075..1ffb93c 100644 --- a/arch/x86/kernel/cpu/mtrr/xen.c +++ b/arch/x86/kernel/cpu/mtrr/xen.c @@ -15,13 +15,38 @@ static int __init xen_num_var_ranges(void); +static int xen_get_free_region(unsigned long base, unsigned long size, int replace_reg) +{ + struct xen_platform_op op; + int error; + + if (replace_reg < 0) + return generic_get_free_region(base, size, -1); + + /* If we're replacing the contents of a register, + * we need to first unset it since Xen also keeps + * a usage count. + */ + op.cmd = XENPF_del_memtype; + op.u.del_memtype.handle = 0; + op.u.del_memtype.reg = replace_reg; + + error = HYPERVISOR_dom0_op(&op); + if (error) { + BUG_ON(error > 0); + return error; + } + + return replace_reg; +} + /* DOM0 TODO: Need to fill in the remaining mtrr methods to have full * working userland mtrr support. */ static struct mtrr_ops xen_mtrr_ops = { .vendor = X86_VENDOR_UNKNOWN, // .set = xen_set_mtrr, // .get = xen_get_mtrr, - .get_free_region = generic_get_free_region, + .get_free_region = xen_get_free_region, .validate_add_page = generic_validate_add_page, .have_wrcomb = positive_have_wrcomb, .use_intel_if = 0, -- 1.6.0.6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |