From patchwork Wed Aug 24 10:11:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 9297403 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 7303A607F0 for ; Wed, 24 Aug 2016 10:14:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 64B3E28E9A for ; Wed, 24 Aug 2016 10:14:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 570E328E8E; Wed, 24 Aug 2016 10:14:04 +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 E6E5028E8E for ; Wed, 24 Aug 2016 10:14:03 +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 1bcVA9-00021j-KB; Wed, 24 Aug 2016 10:12:01 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bcVA7-0001ur-Tn; Wed, 24 Aug 2016 10:12:00 +0000 Received: from [85.158.143.35] by server-9.bemta-6.messagelabs.com id 21/5C-28857-FE27DB75; Wed, 24 Aug 2016 10:11:59 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrFLMWRWlGSWpSXmKPExsVyuP0Ov+67or3 hBrPPq1i8/bqE2eL7lslMDkwehz9cYQlgjGLNzEvKr0hgzZh1dCFLwTGFignru1kaGJdKdjFy ckgIGEm8nfiPqYuRi0NIYCGjxLMTpxlBEmwCqhIbrp9iBbFFBNwkvnyfxQZiMwtESMz5cIoFx BYWcJbYvmc3O4jNAlT/9PkTsBpeAXuJ3b9nM0IskJO4PnM6E4jNKeAgMW3xA7BeIaCa/W+nsk 5g5F7AyLCKUb04tagstUjXTC+pKDM9oyQ3MTNH19DATC83tbg4MT01JzGpWC85P3cTI9DPDEC wg3HeCf9DjJIcTEqivDdV94YL8SXlp1RmJBZnxBeV5qQWH2KU4eBQkuAtKATKCRalpqdWpGXm AAMOJi3BwaMkwhsCkuYtLkjMLc5Mh0idYlSUEufdCpIQAElklObBtcGC/BKjrJQwLyPQIUI8B alFuZklqPKvGMU5GJWEee1ApvBk5pXATX8FtJgJaHHL/d0gi0sSEVJSDYz3kqUe3F8wx3nVIV VdMQadwGldAoeWxlrkGN4s4RK6FWXFbHV3OXvd1CXPwg+HWK5vNzYOd1XNWXNfwYan7frJdVf W3j8R/6nQ6f9j/aU1x7JZC45bKFk3XpPt3BicxmTQzRbiI5PQv5kxumW937yM0mVWDUtmrzhY dubUbrcdX6Tu/jZjWKXEUpyRaKjFXFScCAB+A93RbQIAAA== X-Env-Sender: jgross@suse.com X-Msg-Ref: server-8.tower-21.messagelabs.com!1472033518!29818307!1 X-Originating-IP: [195.135.220.15] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Received: (qmail 35455 invoked from network); 24 Aug 2016 10:11:58 -0000 Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by server-8.tower-21.messagelabs.com with DHE-RSA-CAMELLIA256-SHA encrypted SMTP; 24 Aug 2016 10:11:58 -0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 2539DAC04; Wed, 24 Aug 2016 10:11:49 +0000 (UTC) From: Juergen Gross To: minios-devel@lists.xenproject.org, xen-devel@lists.xenproject.org Date: Wed, 24 Aug 2016 12:11:28 +0200 Message-Id: <1472033504-23180-7-git-send-email-jgross@suse.com> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1472033504-23180-1-git-send-email-jgross@suse.com> References: <1472033504-23180-1-git-send-email-jgross@suse.com> Cc: Juergen Gross , samuel.thibault@ens-lyon.org, wei.liu2@citrix.com Subject: [Xen-devel] [PATCH v2 06/22] mini-os: setup hypercall page for HVMlite 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: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP When running in HVMlite mode we need to setup the hypercall page by ourself. Signed-off-by: Juergen Gross Reviewed-by: Samuel Thibault --- V2: move wrmsr definitions as requested by Samuel Thibault --- arch/x86/events.c | 4 ++-- arch/x86/setup.c | 26 ++++++++++++++++++++++++++ include/x86/os.h | 28 ++++++++++++++++++++-------- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/arch/x86/events.c b/arch/x86/events.c index 5198cf3..342662d 100644 --- a/arch/x86/events.c +++ b/arch/x86/events.c @@ -16,7 +16,7 @@ void arch_init_events(void) { #if defined(__x86_64__) asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0)); - wrmsrl(0xc0000101, &cpu0_pda); /* 0xc0000101 is MSR_GS_BASE */ + wrmsrl(0xc0000101, (uint64_t)&cpu0_pda); /* 0xc0000101 is MSR_GS_BASE */ cpu0_pda.irqcount = -1; cpu0_pda.irqstackptr = (void*) (((unsigned long)irqstack + 2 * STACK_SIZE) & ~(STACK_SIZE - 1)); @@ -30,6 +30,6 @@ void arch_unbind_ports(void) void arch_fini_events(void) { #if defined(__x86_64__) - wrmsrl(0xc0000101, NULL); /* 0xc0000101 is MSR_GS_BASE */ + wrmsrl(0xc0000101, 0); /* 0xc0000101 is MSR_GS_BASE */ #endif } diff --git a/arch/x86/setup.c b/arch/x86/setup.c index 30a9143..edc4ca4 100644 --- a/arch/x86/setup.c +++ b/arch/x86/setup.c @@ -30,6 +30,7 @@ #include /* for printk, memcpy */ #include #include +#include /* * Shared page for communicating with the hypervisor. @@ -89,6 +90,30 @@ static inline void sse_init(void) { #define sse_init() #endif +#ifdef CONFIG_PARAVIRT +#define hpc_init() +#else +static void hpc_init(void) +{ + uint32_t eax, ebx, ecx, edx, base; + + for ( base = XEN_CPUID_FIRST_LEAF; + base < XEN_CPUID_FIRST_LEAF + 0x10000; base += 0x100 ) + { + cpuid(base, &eax, &ebx, &ecx, &edx); + + if ( (ebx == XEN_CPUID_SIGNATURE_EBX) && + (ecx == XEN_CPUID_SIGNATURE_ECX) && + (edx == XEN_CPUID_SIGNATURE_EDX) && + ((eax - base) >= 2) ) + break; + } + + cpuid(base + 2, &eax, &ebx, &ecx, &edx); + wrmsrl(ebx, (unsigned long)&hypercall_page); + barrier(); +} +#endif /* * INITIAL C ENTRY POINT. @@ -99,6 +124,7 @@ arch_init(void *par) static char hello[] = "Bootstrapping...\n"; start_info_t *si; + hpc_init(); (void)HYPERVISOR_console_io(CONSOLEIO_write, strlen(hello), hello); trap_init(); diff --git a/include/x86/os.h b/include/x86/os.h index eeefbe2..7b7869a 100644 --- a/include/x86/os.h +++ b/include/x86/os.h @@ -440,20 +440,23 @@ static __inline__ unsigned long __ffs(unsigned long word) (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ } while(0) -#define wrmsr(msr,val1,val2) \ - __asm__ __volatile__("wrmsr" \ - : /* no outputs */ \ - : "c" (msr), "a" (val1), "d" (val2)) - -#define wrmsrl(msr,val) wrmsr(msr,(uint32_t)((uint64_t)(val)),((uint64_t)(val))>>32) - - #else /* ifdef __x86_64__ */ #error "Unsupported architecture" #endif + #endif /* ifdef __INSIDE_MINIOS */ /********************* common i386 and x86_64 ****************************/ +#define wrmsr(msr,val1,val2) \ + __asm__ __volatile__("wrmsr" \ + : /* no outputs */ \ + : "c" (msr), "a" (val1), "d" (val2)) + +static inline void wrmsrl(unsigned msr, uint64_t val) +{ + wrmsr(msr, (uint32_t)(val & 0xffffffffULL), (uint32_t)(val >> 32)); +} + struct __synch_xchg_dummy { unsigned long a[100]; }; #define __synch_xg(x) ((struct __synch_xchg_dummy *)(x)) @@ -571,6 +574,15 @@ HYPERVISOR_xsm_op( return _hypercall1(int, xsm_op, op); } +static inline void cpuid(uint32_t leaf, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + asm volatile ("cpuid" + : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) + : "0" (leaf)); +} + #undef ADDR #endif /* not assembly */