All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Liu <wl@xen.org>
To: Xen Development List <xen-devel@lists.xenproject.org>
Cc: "Wei Liu" <liuwe@microsoft.com>, "Wei Liu" <wl@xen.org>,
	"Andrew Cooper" <andrew.cooper3@citrix.com>,
	"Michael Kelley" <mikelley@microsoft.com>,
	"Jan Beulich" <jbeulich@suse.com>,
	"Roger Pau Monné" <roger.pau@citrix.com>
Subject: [Xen-devel] [PATCH for-next RFC 5/8] x86: factor out hypervisor agnostic code
Date: Mon, 23 Sep 2019 11:09:28 +0100	[thread overview]
Message-ID: <20190923100931.29670-6-liuwe@microsoft.com> (raw)
In-Reply-To: <20190923100931.29670-1-liuwe@microsoft.com>

The only implementation there is Xen.

No functional change.

Signed-off-by: Wei Liu <liuwe@microsoft.com>
---
 xen/arch/x86/guest/Makefile            |   2 +
 xen/arch/x86/guest/hypervisor.c        | 112 +++++++++++++++++++++++++
 xen/arch/x86/guest/xen/xen.c           |  81 +-----------------
 xen/include/asm-x86/guest.h            |   1 +
 xen/include/asm-x86/guest/hypervisor.h |  58 +++++++++++++
 xen/include/asm-x86/guest/xen.h        |  21 ++---
 6 files changed, 182 insertions(+), 93 deletions(-)
 create mode 100644 xen/arch/x86/guest/hypervisor.c
 create mode 100644 xen/include/asm-x86/guest/hypervisor.h

diff --git a/xen/arch/x86/guest/Makefile b/xen/arch/x86/guest/Makefile
index 6806f04947..f63d64bbee 100644
--- a/xen/arch/x86/guest/Makefile
+++ b/xen/arch/x86/guest/Makefile
@@ -1 +1,3 @@
+obj-y += hypervisor.o
+
 subdir-$(CONFIG_XEN_GUEST) += xen
diff --git a/xen/arch/x86/guest/hypervisor.c b/xen/arch/x86/guest/hypervisor.c
new file mode 100644
index 0000000000..b0a724bf13
--- /dev/null
+++ b/xen/arch/x86/guest/hypervisor.c
@@ -0,0 +1,112 @@
+/******************************************************************************
+ * arch/x86/guest/hypervisor.c
+ *
+ * Support for detecting and running under a hypervisor.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (c) 2017 Citrix Systems Ltd.
+ */
+
+#include <xen/init.h>
+#include <xen/mm.h>
+#include <xen/rangeset.h>
+
+#include <asm/guest.h>
+#include <asm/processor.h>
+
+static struct rangeset *mem;
+
+void __init probe_hypervisor(void)
+{
+    /* Too early to use cpu_has_hypervisor */
+    if ( !(cpuid_ecx(1) & cpufeat_mask(X86_FEATURE_HYPERVISOR)) )
+        return;
+
+    probe_xen();
+}
+
+static void __init init_memmap(void)
+{
+    unsigned int i;
+
+    mem = rangeset_new(NULL, "host memory map", 0);
+    if ( !mem )
+        panic("failed to allocate PFN usage rangeset\n");
+
+    /*
+     * Mark up to the last memory page (or 4GiB) as RAM. This is done because
+     * Xen doesn't know the position of possible MMIO holes, so at least try to
+     * avoid the know MMIO hole below 4GiB. Note that this is subject to future
+     * discussion and improvements.
+     */
+    if ( rangeset_add_range(mem, 0, max_t(unsigned long, max_page - 1,
+                                          PFN_DOWN(GB(4) - 1))) )
+        panic("unable to add RAM to in-use PFN rangeset\n");
+
+    for ( i = 0; i < e820.nr_map; i++ )
+    {
+        struct e820entry *e = &e820.map[i];
+
+        if ( rangeset_add_range(mem, PFN_DOWN(e->addr),
+                                PFN_UP(e->addr + e->size - 1)) )
+            panic("unable to add range [%#lx, %#lx] to in-use PFN rangeset\n",
+                  PFN_DOWN(e->addr), PFN_UP(e->addr + e->size - 1));
+    }
+}
+
+void __init hypervisor_setup(void)
+{
+    init_memmap();
+
+    xen_setup();
+}
+
+void hypervisor_ap_setup(void)
+{
+    xen_ap_setup();
+}
+
+int hypervisor_alloc_unused_page(mfn_t *mfn)
+{
+    unsigned long m;
+    int rc;
+
+    rc = rangeset_claim_range(mem, 1, &m);
+    if ( !rc )
+        *mfn = _mfn(m);
+
+    return rc;
+}
+
+int hypervisor_free_unused_page(mfn_t mfn)
+{
+    return rangeset_remove_range(mem, mfn_x(mfn), mfn_x(mfn));
+}
+
+void hypervisor_resume(void)
+{
+    xen_resume();
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
+
diff --git a/xen/arch/x86/guest/xen/xen.c b/xen/arch/x86/guest/xen/xen.c
index f93c8fbd1c..a730e6ad1b 100644
--- a/xen/arch/x86/guest/xen/xen.c
+++ b/xen/arch/x86/guest/xen/xen.c
@@ -39,7 +39,6 @@ bool __read_mostly xen_guest;
 
 __read_mostly uint32_t xen_cpuid_base;
 extern char hypercall_page[];
-static struct rangeset *mem;
 
 DEFINE_PER_CPU(unsigned int, vcpu_id);
 
@@ -67,15 +66,11 @@ static void __init find_xen_leaves(void)
     }
 }
 
-static void __init probe_xen(void)
+void __init probe_xen(void)
 {
     if ( xen_guest )
         return;
 
-    /* Too early to use cpu_has_hypervisor */
-    if ( !(cpuid_ecx(1) & cpufeat_mask(X86_FEATURE_HYPERVISOR)) )
-        return;
-
     find_xen_leaves();
 
     if ( !xen_cpuid_base )
@@ -87,11 +82,6 @@ static void __init probe_xen(void)
     xen_guest = true;
 }
 
-void __init probe_hypervisor(void)
-{
-    probe_xen();
-}
-
 static void map_shared_info(void)
 {
     mfn_t mfn;
@@ -166,35 +156,6 @@ static void set_vcpu_id(void)
         this_cpu(vcpu_id) = smp_processor_id();
 }
 
-static void __init init_memmap(void)
-{
-    unsigned int i;
-
-    mem = rangeset_new(NULL, "host memory map", 0);
-    if ( !mem )
-        panic("failed to allocate PFN usage rangeset\n");
-
-    /*
-     * Mark up to the last memory page (or 4GiB) as RAM. This is done because
-     * Xen doesn't know the position of possible MMIO holes, so at least try to
-     * avoid the know MMIO hole below 4GiB. Note that this is subject to future
-     * discussion and improvements.
-     */
-    if ( rangeset_add_range(mem, 0, max_t(unsigned long, max_page - 1,
-                                          PFN_DOWN(GB(4) - 1))) )
-        panic("unable to add RAM to in-use PFN rangeset\n");
-
-    for ( i = 0; i < e820.nr_map; i++ )
-    {
-        struct e820entry *e = &e820.map[i];
-
-        if ( rangeset_add_range(mem, PFN_DOWN(e->addr),
-                                PFN_UP(e->addr + e->size - 1)) )
-            panic("unable to add range [%#lx, %#lx] to in-use PFN rangeset\n",
-                  PFN_DOWN(e->addr), PFN_UP(e->addr + e->size - 1));
-    }
-}
-
 static void xen_evtchn_upcall(struct cpu_user_regs *regs)
 {
     struct vcpu_info *vcpu_info = this_cpu(vcpu_info);
@@ -254,7 +215,7 @@ static void init_evtchn(void)
     }
 }
 
-static void __init xen_setup(void)
+void __init xen_setup(void)
 {
     map_shared_info();
 
@@ -280,49 +241,20 @@ static void __init xen_setup(void)
     init_evtchn();
 }
 
-void __init hypervisor_setup(void)
-{
-    init_memmap();
-
-    xen_setup();
-}
-
-static void xen_ap_setup(void)
+void xen_ap_setup(void)
 {
     set_vcpu_id();
     map_vcpuinfo();
     init_evtchn();
 }
 
-void hypervisor_ap_setup(void)
-{
-    xen_ap_setup();
-}
-
-int hypervisor_alloc_unused_page(mfn_t *mfn)
-{
-    unsigned long m;
-    int rc;
-
-    rc = rangeset_claim_range(mem, 1, &m);
-    if ( !rc )
-        *mfn = _mfn(m);
-
-    return rc;
-}
-
-int hypervisor_free_unused_page(mfn_t mfn)
-{
-    return rangeset_remove_range(mem, mfn_x(mfn), mfn_x(mfn));
-}
-
 static void ap_resume(void *unused)
 {
     map_vcpuinfo();
     init_evtchn();
 }
 
-static void xen_resume(void)
+void xen_resume(void)
 {
     /* Reset shared info page. */
     map_shared_info();
@@ -345,11 +277,6 @@ static void xen_resume(void)
         pv_console_init();
 }
 
-void hypervisor_resume(void)
-{
-    xen_resume();
-}
-
 /*
  * Local variables:
  * mode: C
diff --git a/xen/include/asm-x86/guest.h b/xen/include/asm-x86/guest.h
index a38c6b5b3f..8e167165ae 100644
--- a/xen/include/asm-x86/guest.h
+++ b/xen/include/asm-x86/guest.h
@@ -20,6 +20,7 @@
 #define __X86_GUEST_H__
 
 #include <asm/guest/hypercall.h>
+#include <asm/guest/hypervisor.h>
 #include <asm/guest/pvh-boot.h>
 #include <asm/guest/xen.h>
 #include <asm/pv/shim.h>
diff --git a/xen/include/asm-x86/guest/hypervisor.h b/xen/include/asm-x86/guest/hypervisor.h
new file mode 100644
index 0000000000..135ad36f72
--- /dev/null
+++ b/xen/include/asm-x86/guest/hypervisor.h
@@ -0,0 +1,58 @@
+/******************************************************************************
+ * asm-x86/guest/hypervisor.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms and conditions of the GNU General Public
+ * License, version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __X86_GUEST_HYPERVISOR_H__
+#define __X86_GUEST_HYPERVISOR_H__
+
+#ifdef CONFIG_GUEST
+
+#include <xen/mm.h>
+
+void probe_hypervisor(void);
+void hypervisor_setup(void);
+void hypervisor_ap_setup(void);
+int hypervisor_alloc_unused_page(mfn_t *mfn);
+int hypervisor_free_unused_page(mfn_t mfn);
+uint32_t hypervisor_cpuid_base(void);
+void hypervisor_resume(void);
+
+#else
+
+#include <xen/lib.h>
+
+static inline void probe_hypervisor(void) {}
+
+static inline void hypervisor_setup(void)
+{
+    ASSERT_UNREACHABLE();
+}
+static inline void hypervisor_ap_setup(void)
+{
+    ASSERT_UNREACHABLE();
+}
+
+#endif /* CONFIG_GUEST */
+#endif /* __X86_GUEST_HYPERVISOR_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-x86/guest/xen.h b/xen/include/asm-x86/guest/xen.h
index b015ed1883..d031f1f70d 100644
--- a/xen/include/asm-x86/guest/xen.h
+++ b/xen/include/asm-x86/guest/xen.h
@@ -32,12 +32,10 @@ extern bool xen_guest;
 extern bool pv_console;
 extern uint32_t xen_cpuid_base;
 
-void probe_hypervisor(void);
-void hypervisor_setup(void);
-void hypervisor_ap_setup(void);
-int hypervisor_alloc_unused_page(mfn_t *mfn);
-int hypervisor_free_unused_page(mfn_t mfn);
-void hypervisor_resume(void);
+void probe_xen(void);
+void xen_setup(void);
+void xen_ap_setup(void);
+void xen_resume(void);
 
 DECLARE_PER_CPU(unsigned int, vcpu_id);
 DECLARE_PER_CPU(struct vcpu_info *, vcpu_info);
@@ -47,16 +45,7 @@ DECLARE_PER_CPU(struct vcpu_info *, vcpu_info);
 #define xen_guest 0
 #define pv_console 0
 
-static inline void probe_hypervisor(void) {}
-
-static inline void hypervisor_setup(void)
-{
-    ASSERT_UNREACHABLE();
-}
-static inline void hypervisor_ap_setup(void)
-{
-    ASSERT_UNREACHABLE();
-}
+static inline void probe_xen(void) {}
 
 #endif /* CONFIG_XEN_GUEST */
 #endif /* __X86_GUEST_XEN_H__ */
-- 
2.20.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  parent reply	other threads:[~2019-09-23 10:10 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-23 10:09 [Xen-devel] [PATCH for-next RFC 0/8] Port Xen to Hyper-V Wei Liu
2019-09-23 10:09 ` [Xen-devel] [PATCH for-next RFC 1/8] x86: introduce CONFIG_GUEST and move code Wei Liu
2019-09-25  9:59   ` Roger Pau Monné
2019-09-23 10:09 ` [Xen-devel] [PATCH for-next RFC 2/8] x86: include asm_defns.h directly in hypercall.h Wei Liu
2019-09-25 10:02   ` Roger Pau Monné
2019-09-23 10:09 ` [Xen-devel] [PATCH for-next RFC 3/8] x86: drop hypervisor_cpuid_base Wei Liu
2019-09-25 10:07   ` Roger Pau Monné
2019-09-23 10:09 ` [Xen-devel] [PATCH for-next RFC 4/8] x86: factor out xen variants for hypervisor setup code Wei Liu
2019-09-25 10:23   ` Roger Pau Monné
2019-09-27 11:30     ` Wei Liu
2019-09-27 11:39       ` Jan Beulich
2019-09-27 12:47         ` Wei Liu
2019-09-27 12:56           ` Jan Beulich
2019-09-27 11:41       ` Roger Pau Monné
2019-09-27 12:46         ` Wei Liu
2019-09-23 10:09 ` Wei Liu [this message]
2019-09-25 10:39   ` [Xen-devel] [PATCH for-next RFC 5/8] x86: factor out hypervisor agnostic code Roger Pau Monné
2019-09-27 11:18     ` Wei Liu
2019-09-23 10:09 ` [Xen-devel] [PATCH for-next RFC 6/8] x86: make probe_xen return boolean value Wei Liu
2019-09-25 10:44   ` Roger Pau Monné
2019-09-27 11:18     ` Wei Liu
2019-09-23 10:09 ` [Xen-devel] [PATCH for-next RFC 7/8] x86: introduce CONFIG_HYPERV and hyperv directory Wei Liu
2019-09-25 10:48   ` Roger Pau Monné
2019-09-27 11:18     ` Wei Liu
2019-09-23 10:09 ` [Xen-devel] [PATCH for-next RFC 8/8] x86: be more verbose when running nested Wei Liu
2019-09-25 10:54   ` Roger Pau Monné
2019-09-23 10:48 ` [Xen-devel] [PATCH for-next RFC 0/8] Port Xen to Hyper-V Paul Durrant
2019-09-23 11:27   ` Wei Liu
2019-09-23 12:11     ` Paul Durrant
2019-09-23 12:54       ` Wei Liu
2019-09-23 13:33         ` Wei Liu
2019-09-23 13:47           ` Paul Durrant
2019-09-23 14:21             ` Wei Liu
2019-09-23 14:39               ` Paul Durrant
2019-09-23 14:41                 ` Wei Liu
2019-09-25 11:02 ` Roger Pau Monné
2019-09-25 15:36   ` Wei Liu
2019-09-26 10:37     ` Wei Liu
2019-09-26 10:41     ` Roger Pau Monné
2019-09-26 10:50       ` Wei Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190923100931.29670-6-liuwe@microsoft.com \
    --to=wl@xen.org \
    --cc=andrew.cooper3@citrix.com \
    --cc=jbeulich@suse.com \
    --cc=liuwe@microsoft.com \
    --cc=mikelley@microsoft.com \
    --cc=roger.pau@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.