From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762689AbZB1CHo (ORCPT ); Fri, 27 Feb 2009 21:07:44 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1761219AbZB1B7p (ORCPT ); Fri, 27 Feb 2009 20:59:45 -0500 Received: from adsl-76-233-236-102.dsl.pltn13.sbcglobal.net ([76.233.236.102]:59183 "EHLO abulafia.goop.org" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1757736AbZB1B7e (ORCPT ); Fri, 27 Feb 2009 20:59:34 -0500 From: Jeremy Fitzhardinge To: "H. Peter Anvin" Cc: the arch/x86 maintainers , Linux Kernel Mailing List , Xen-devel , Mark McLoughlin Subject: [PATCH] xen mtrr: Add xen_{get,set}_mtrr() implementations Date: Fri, 27 Feb 2009 17:59:25 -0800 Message-Id: <1235786365-17744-20-git-send-email-jeremy@goop.org> X-Mailer: git-send-email 1.6.0.6 In-Reply-To: <1235786365-17744-1-git-send-email-jeremy@goop.org> References: <1235786365-17744-1-git-send-email-jeremy@goop.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mark McLoughlin Straightforward apart from the hack to turn mtrr_ops->set() into a no-op on all but one CPU. Signed-off-by: Mark McLoughlin --- arch/x86/kernel/cpu/mtrr/xen.c | 52 ++++++++++++++++++++++++++++++++++++--- 1 files changed, 48 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/cpu/mtrr/xen.c b/arch/x86/kernel/cpu/mtrr/xen.c index d715843..50a45db 100644 --- a/arch/x86/kernel/cpu/mtrr/xen.c +++ b/arch/x86/kernel/cpu/mtrr/xen.c @@ -9,6 +9,52 @@ static int __init xen_num_var_ranges(void); +static void xen_set_mtrr(unsigned int reg, unsigned long base, + unsigned long size, mtrr_type type) +{ + struct xen_platform_op op; + int error; + + /* mtrr_ops->set() is called once per CPU, + * but Xen's ops apply to all CPUs. + */ + if (smp_processor_id()) + return; + + if (size == 0) { + op.cmd = XENPF_del_memtype; + op.u.del_memtype.handle = 0; + op.u.del_memtype.reg = reg; + } else { + op.cmd = XENPF_add_memtype; + op.u.add_memtype.mfn = base; + op.u.add_memtype.nr_mfns = size; + op.u.add_memtype.type = type; + } + + error = HYPERVISOR_dom0_op(&op); + BUG_ON(error != 0); +} + +static void xen_get_mtrr(unsigned int reg, unsigned long *base, + unsigned long *size, mtrr_type *type) +{ + struct xen_platform_op op; + + op.cmd = XENPF_read_memtype; + op.u.read_memtype.reg = reg; + if (HYPERVISOR_dom0_op(&op) != 0) { + *base = 0; + *size = 0; + *type = 0; + return; + } + + *size = op.u.read_memtype.nr_mfns; + *base = op.u.read_memtype.mfn; + *type = op.u.read_memtype.type; +} + static int xen_get_free_region(unsigned long base, unsigned long size, int replace_reg) { struct xen_platform_op op; @@ -34,12 +80,10 @@ static int xen_get_free_region(unsigned long base, unsigned long size, int repla 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, + .set = xen_set_mtrr, + .get = xen_get_mtrr, .get_free_region = xen_get_free_region, .validate_add_page = generic_validate_add_page, .have_wrcomb = positive_have_wrcomb, -- 1.6.0.6