From patchwork Wed Nov 30 16:49:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Roger_Pau_Monn=C3=A9?= X-Patchwork-Id: 9454617 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 4F25860235 for ; Wed, 30 Nov 2016 16:55:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 382FA219AC for ; Wed, 30 Nov 2016 16:55:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2C56928471; Wed, 30 Nov 2016 16:55:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id BCFB5219AC for ; Wed, 30 Nov 2016 16:55:28 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cC88X-0003KM-L0; Wed, 30 Nov 2016 16:53:37 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cC88W-0003IY-EG for xen-devel@lists.xenproject.org; Wed, 30 Nov 2016 16:53:36 +0000 Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id 91/FA-23854-F040F385; Wed, 30 Nov 2016 16:53:35 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrIIsWRWlGSWpSXmKPExsXitHSDvS4/i32 EwanNXBbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8aGtjlMBR+VKt62LWZrYNwo1cXIySEh4C9x b94yVhCbTUBH4uLcnWwgtohArMS6xqtMXYwcHMwC5RIzbsSDhIUFHCSOrd0CVsIioCpx48c3d hCbV8BK4v2NmYwQI3Ulbi/bxQ7SygkU/3BUHcQUErCUaNtcCVEtKHFy5hMWEJtZQFOidftvdg hbXqJ562xmEFtIQFGif94DtgmMfLOQtMxC0jILScsCRuZVjOrFqUVlqUW6ZnpJRZnpGSW5iZk 5uoYGxnq5qcXFiempOYlJxXrJ+bmbGIFBVs/AwLiD8Uqb8yFGSQ4mJVHeowz2EUJ8SfkplRmJ xRnxRaU5qcWHGDU4OAQ2r119gVGKJS8/L1VJgvcLE1CdYFFqempFWmYOMA5gSiU4eJREeCtB0 rzFBYm5xZnpEKlTjLocb3a9fMAkBDZDSpzXmxmoSACkKKM0D24ELCYvMcpKCfMyMjAwCPEUpB blZpagyr9iFOdgVBLmjQCZwpOZVwK36RXQEUxAR7x9bQ1yREkiQkqqgbG7se/YkfdyjPvaZqm 7X06K5lRncxbZ9nt1yDn366nCl8UuNS64u/xTbNYM3//nzB7NfT/hXm+ca+LLyEWHSneKG7yt bmtkftbZ3ZSxdI9o3kqV3NlsxTUX9acEX60slHxayPljx3phs/sTr+v3MysGTGTc6dd0aHeyu 8w5byuJwmx+F8WzckosxRmJhlrMRcWJAEi4qIrEAgAA X-Env-Sender: prvs=1355645f8=roger.pau@citrix.com X-Msg-Ref: server-13.tower-31.messagelabs.com!1480524813!73121874!1 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.0.16; banners=-,-,- X-VirusChecked: Checked Received: (qmail 33496 invoked from network); 30 Nov 2016 16:53:34 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-13.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 30 Nov 2016 16:53:34 -0000 X-IronPort-AV: E=Sophos;i="5.31,574,1473120000"; d="scan'208";a="401046938" From: Roger Pau Monne To: , , Date: Wed, 30 Nov 2016 16:49:49 +0000 Message-ID: <20161130164950.43543-14-roger.pau@citrix.com> X-Mailer: git-send-email 2.9.3 (Apple Git-75) In-Reply-To: <20161130164950.43543-1-roger.pau@citrix.com> References: <20161130164950.43543-1-roger.pau@citrix.com> MIME-Version: 1.0 Cc: Andrew Cooper , Jan Beulich , Roger Pau Monne Subject: [Xen-devel] [PATCH v4 13/14] xen/x86: hack to setup PVHv2 Dom0 CPUs X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Initialize Dom0 BSP/APs and setup the memory and IO permissions. Signed-off-by: Roger Pau Monné --- Cc: Jan Beulich Cc: Andrew Cooper --- DO NOT APPLY. The logic used to setup the CPUID leaves is clearly lacking. This patch will be rebased on top of Andrew's CPUID work, that will move CPUID setup from libxc into Xen. For the time being this is needed in order to be able to boot a PVHv2 Dom0, in order to test the rest of the patches. --- xen/arch/x86/domain_build.c | 97 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index 7e22ba3..5c7592b 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -41,6 +41,7 @@ #include #include #include +#include static long __initdata dom0_nrpages; static long __initdata dom0_min_nrpages; @@ -2069,6 +2070,93 @@ static int __init hvm_load_kernel(struct domain *d, const module_t *image, return 0; } +static int __init hvm_setup_cpus(struct domain *d, paddr_t entry, + paddr_t start_info) +{ + vcpu_hvm_context_t cpu_ctx; + struct vcpu *v = d->vcpu[0]; + int cpu, i, rc; + struct { + uint32_t index; + uint32_t count; + } cpuid_leaves[] = { + {0, XEN_CPUID_INPUT_UNUSED}, + {1, XEN_CPUID_INPUT_UNUSED}, + {2, XEN_CPUID_INPUT_UNUSED}, + {4, 0}, + {4, 1}, + {4, 2}, + {4, 3}, + {4, 4}, + {7, 0}, + {0xa, XEN_CPUID_INPUT_UNUSED}, + {0xd, 0}, + {0x80000000, XEN_CPUID_INPUT_UNUSED}, + {0x80000001, XEN_CPUID_INPUT_UNUSED}, + {0x80000002, XEN_CPUID_INPUT_UNUSED}, + {0x80000003, XEN_CPUID_INPUT_UNUSED}, + {0x80000004, XEN_CPUID_INPUT_UNUSED}, + {0x80000005, XEN_CPUID_INPUT_UNUSED}, + {0x80000006, XEN_CPUID_INPUT_UNUSED}, + {0x80000007, XEN_CPUID_INPUT_UNUSED}, + {0x80000008, XEN_CPUID_INPUT_UNUSED}, + }; + + cpu = v->processor; + for ( i = 1; i < d->max_vcpus; i++ ) + { + cpu = cpumask_cycle(cpu, &dom0_cpus); + setup_dom0_vcpu(d, i, cpu); + } + + memset(&cpu_ctx, 0, sizeof(cpu_ctx)); + + cpu_ctx.mode = VCPU_HVM_MODE_32B; + + cpu_ctx.cpu_regs.x86_32.ebx = start_info; + cpu_ctx.cpu_regs.x86_32.eip = entry; + cpu_ctx.cpu_regs.x86_32.cr0 = X86_CR0_PE | X86_CR0_ET; + + cpu_ctx.cpu_regs.x86_32.cs_limit = ~0u; + cpu_ctx.cpu_regs.x86_32.ds_limit = ~0u; + cpu_ctx.cpu_regs.x86_32.ss_limit = ~0u; + cpu_ctx.cpu_regs.x86_32.tr_limit = 0x67; + cpu_ctx.cpu_regs.x86_32.cs_ar = 0xc9b; + cpu_ctx.cpu_regs.x86_32.ds_ar = 0xc93; + cpu_ctx.cpu_regs.x86_32.ss_ar = 0xc93; + cpu_ctx.cpu_regs.x86_32.tr_ar = 0x8b; + + rc = arch_set_info_hvm_guest(v, &cpu_ctx); + if ( rc ) + { + printk("Unable to setup Dom0 BSP context: %d\n", rc); + return rc; + } + + for ( i = 0; i < ARRAY_SIZE(cpuid_leaves); i++ ) + { + d->arch.cpuids[i].input[0] = cpuid_leaves[i].index; + d->arch.cpuids[i].input[1] = cpuid_leaves[i].count; + cpuid_count(d->arch.cpuids[i].input[0], d->arch.cpuids[i].input[1], + &d->arch.cpuids[i].eax, &d->arch.cpuids[i].ebx, + &d->arch.cpuids[i].ecx, &d->arch.cpuids[i].edx); + /* XXX: we need to do much more filtering here. */ + if ( d->arch.cpuids[i].input[0] == 1 ) + d->arch.cpuids[i].ecx &= ~X86_FEATURE_VMX; + } + + rc = setup_permissions(d); + if ( rc ) + { + panic("Unable to setup Dom0 permissions: %d\n", rc); + return rc; + } + + update_domain_wallclock_time(d); + + return 0; +} + static int __init construct_dom0_hvm(struct domain *d, const module_t *image, unsigned long image_headroom, module_t *initrd, @@ -2101,6 +2189,15 @@ static int __init construct_dom0_hvm(struct domain *d, const module_t *image, return rc; } + rc = hvm_setup_cpus(d, entry, start_info); + if ( rc ) + { + printk("Failed to setup Dom0 CPUs: %d\n", rc); + return rc; + } + + clear_bit(_VPF_down, &d->vcpu[0]->pause_flags); + return 0; }