Re: [PATCH v6 7/7] KVM: x86: Allow Qemu/KVM to use PVH entry point

2018-04-05 Thread kbuild test robot
Hi Maran,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on next-20180405]
[cannot apply to tip/x86/core xen-tip/linux-next v4.16]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:
https://github.com/0day-ci/linux/commits/Maran-Wilson/KVM-x86-Allow-Qemu-KVM-to-use-PVH-entry-point/20180405-165048
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386 

All warnings (new ones prefixed by >>):

   In file included from arch/x86/platform/pvh/enlighten.c:12:0:
   arch/x86/include/asm/xen/hypercall.h: In function 
'HYPERVISOR_update_va_mapping':
>> arch/x86/include/asm/xen/hypercall.h:366:33: warning: right shift count >= 
>> width of type [-Wshift-count-overflow]
   new_val.pte, new_val.pte >> 32, flags);
^
   arch/x86/include/asm/xen/hypercall.h:132:52: note: in definition of macro 
'__HYPERCALL_3ARG'
 __HYPERCALL_2ARG(a1,a2)  __arg3 = (unsigned long)(a3);
   ^~
>> arch/x86/include/asm/xen/hypercall.h:192:2: note: in expansion of macro 
>> '__HYPERCALL_4ARG'
 __HYPERCALL_4ARG(a1, a2, a3, a4);\
 ^~~~
>> arch/x86/include/asm/xen/hypercall.h:365:10: note: in expansion of macro 
>> '_hypercall4'
  return _hypercall4(int, update_va_mapping, va,
 ^~~
   arch/x86/include/asm/xen/hypercall.h: In function 
'HYPERVISOR_update_va_mapping_otherdomain':
   arch/x86/include/asm/xen/hypercall.h:417:33: warning: right shift count >= 
width of type [-Wshift-count-overflow]
   new_val.pte, new_val.pte >> 32,
^
   arch/x86/include/asm/xen/hypercall.h:132:52: note: in definition of macro 
'__HYPERCALL_3ARG'
 __HYPERCALL_2ARG(a1,a2)  __arg3 = (unsigned long)(a3);
   ^~
   arch/x86/include/asm/xen/hypercall.h:136:2: note: in expansion of macro 
'__HYPERCALL_4ARG'
 __HYPERCALL_4ARG(a1,a2,a3,a4) __arg5 = (unsigned long)(a5);
 ^~~~
>> arch/x86/include/asm/xen/hypercall.h:203:2: note: in expansion of macro 
>> '__HYPERCALL_5ARG'
 __HYPERCALL_5ARG(a1, a2, a3, a4, a5);\
 ^~~~
>> arch/x86/include/asm/xen/hypercall.h:416:10: note: in expansion of macro 
>> '_hypercall5'
  return _hypercall5(int, update_va_mapping_otherdomain, va,
 ^~~
   arch/x86/include/asm/xen/hypercall.h: In function 'MULTI_update_va_mapping':
   arch/x86/include/asm/xen/hypercall.h:511:30: warning: right shift count >= 
width of type [-Wshift-count-overflow]
  mcl->args[2] = new_val.pte >> 32;
 ^~
   arch/x86/include/asm/xen/hypercall.h: In function 
'MULTI_update_va_mapping_otherdomain':
   arch/x86/include/asm/xen/hypercall.h:543:30: warning: right shift count >= 
width of type [-Wshift-count-overflow]
  mcl->args[2] = new_val.pte >> 32;
 ^~

vim +366 arch/x86/include/asm/xen/hypercall.h

a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  188  
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  189  #define _hypercall4(type, name, a1, a2, a3, a4)
  \
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  190  ({ 
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  191   __HYPERCALL_DECLS;
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08 @192   __HYPERCALL_4ARG(a1, a2, a3, a4); 
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  193   asm volatile (__HYPERCALL 
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  194 : __HYPERCALL_4PARAM
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  195 : __HYPERCALL_ENTRY(name)   
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  196 : __HYPERCALL_CLOBBER4);
  \
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  197   (type)__res;  
  \
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  198  })
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  199  
a42089dd3 

Re: [PATCH v6 7/7] KVM: x86: Allow Qemu/KVM to use PVH entry point

2018-04-05 Thread kbuild test robot
Hi Maran,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on next-20180405]
[cannot apply to tip/x86/core xen-tip/linux-next v4.16]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:
https://github.com/0day-ci/linux/commits/Maran-Wilson/KVM-x86-Allow-Qemu-KVM-to-use-PVH-entry-point/20180405-165048
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386 

All warnings (new ones prefixed by >>):

   In file included from arch/x86/platform/pvh/enlighten.c:12:0:
   arch/x86/include/asm/xen/hypercall.h: In function 
'HYPERVISOR_update_va_mapping':
>> arch/x86/include/asm/xen/hypercall.h:366:33: warning: right shift count >= 
>> width of type [-Wshift-count-overflow]
   new_val.pte, new_val.pte >> 32, flags);
^
   arch/x86/include/asm/xen/hypercall.h:132:52: note: in definition of macro 
'__HYPERCALL_3ARG'
 __HYPERCALL_2ARG(a1,a2)  __arg3 = (unsigned long)(a3);
   ^~
>> arch/x86/include/asm/xen/hypercall.h:192:2: note: in expansion of macro 
>> '__HYPERCALL_4ARG'
 __HYPERCALL_4ARG(a1, a2, a3, a4);\
 ^~~~
>> arch/x86/include/asm/xen/hypercall.h:365:10: note: in expansion of macro 
>> '_hypercall4'
  return _hypercall4(int, update_va_mapping, va,
 ^~~
   arch/x86/include/asm/xen/hypercall.h: In function 
'HYPERVISOR_update_va_mapping_otherdomain':
   arch/x86/include/asm/xen/hypercall.h:417:33: warning: right shift count >= 
width of type [-Wshift-count-overflow]
   new_val.pte, new_val.pte >> 32,
^
   arch/x86/include/asm/xen/hypercall.h:132:52: note: in definition of macro 
'__HYPERCALL_3ARG'
 __HYPERCALL_2ARG(a1,a2)  __arg3 = (unsigned long)(a3);
   ^~
   arch/x86/include/asm/xen/hypercall.h:136:2: note: in expansion of macro 
'__HYPERCALL_4ARG'
 __HYPERCALL_4ARG(a1,a2,a3,a4) __arg5 = (unsigned long)(a5);
 ^~~~
>> arch/x86/include/asm/xen/hypercall.h:203:2: note: in expansion of macro 
>> '__HYPERCALL_5ARG'
 __HYPERCALL_5ARG(a1, a2, a3, a4, a5);\
 ^~~~
>> arch/x86/include/asm/xen/hypercall.h:416:10: note: in expansion of macro 
>> '_hypercall5'
  return _hypercall5(int, update_va_mapping_otherdomain, va,
 ^~~
   arch/x86/include/asm/xen/hypercall.h: In function 'MULTI_update_va_mapping':
   arch/x86/include/asm/xen/hypercall.h:511:30: warning: right shift count >= 
width of type [-Wshift-count-overflow]
  mcl->args[2] = new_val.pte >> 32;
 ^~
   arch/x86/include/asm/xen/hypercall.h: In function 
'MULTI_update_va_mapping_otherdomain':
   arch/x86/include/asm/xen/hypercall.h:543:30: warning: right shift count >= 
width of type [-Wshift-count-overflow]
  mcl->args[2] = new_val.pte >> 32;
 ^~

vim +366 arch/x86/include/asm/xen/hypercall.h

a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  188  
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  189  #define _hypercall4(type, name, a1, a2, a3, a4)
  \
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  190  ({ 
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  191   __HYPERCALL_DECLS;
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08 @192   __HYPERCALL_4ARG(a1, a2, a3, a4); 
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  193   asm volatile (__HYPERCALL 
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  194 : __HYPERCALL_4PARAM
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  195 : __HYPERCALL_ENTRY(name)   
  \
e74359028 include/asm-x86/xen/hypercall.h  Jeremy Fitzhardinge
2008-07-08  196 : __HYPERCALL_CLOBBER4);
  \
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  197   (type)__res;  
  \
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  198  })
a42089dd3 include/asm-i386/xen/hypercall.h Jeremy Fitzhardinge
2007-07-17  199  
a42089dd3 

[PATCH v6 7/7] KVM: x86: Allow Qemu/KVM to use PVH entry point

2018-04-04 Thread Maran Wilson
For certain applications it is desirable to rapidly boot a KVM virtual
machine. In cases where legacy hardware and software support within the
guest is not needed, Qemu should be able to boot directly into the
uncompressed Linux kernel binary without the need to run firmware.

There already exists an ABI to allow this for Xen PVH guests and the ABI
is supported by Linux and FreeBSD:

   https://xenbits.xen.org/docs/unstable/misc/pvh.html

This patch enables Qemu to use that same entry point for booting KVM
guests.

Signed-off-by: Maran Wilson 
Suggested-by: Konrad Rzeszutek Wilk 
Suggested-by: Boris Ostrovsky 
Tested-by: Boris Ostrovsky 
---
 arch/x86/Kbuild   |  2 +-
 arch/x86/Kconfig  |  8 
 arch/x86/platform/pvh/Makefile|  4 ++--
 arch/x86/platform/pvh/enlighten.c | 43 +--
 4 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/arch/x86/Kbuild b/arch/x86/Kbuild
index 2089e4414300..c625f57472f7 100644
--- a/arch/x86/Kbuild
+++ b/arch/x86/Kbuild
@@ -7,7 +7,7 @@ obj-$(CONFIG_KVM) += kvm/
 # Xen paravirtualization support
 obj-$(CONFIG_XEN) += xen/
 
-obj-$(CONFIG_XEN_PVH) += platform/pvh/
+obj-$(CONFIG_PVH) += platform/pvh/
 
 # Hyper-V paravirtualization support
 obj-$(subst m,y,$(CONFIG_HYPERV)) += hyperv/
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index e3b836d7ad09..1e6d83e181b5 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -787,6 +787,14 @@ config PVH
  This option enables the PVH entry point for guest virtual machines
  as specified in the x86/HVM direct boot ABI.
 
+config KVM_GUEST_PVH
+   bool "Support for running as a KVM PVH guest"
+   depends on KVM_GUEST
+   select PVH
+   ---help---
+ This option enables starting KVM guests via the PVH entry point as
+ specified in the x86/HVM direct boot ABI.
+
 config KVM_DEBUG_FS
bool "Enable debug information for KVM Guests in debugfs"
depends on KVM_GUEST && DEBUG_FS
diff --git a/arch/x86/platform/pvh/Makefile b/arch/x86/platform/pvh/Makefile
index 9fd25efcd2a3..5dec5067c9fb 100644
--- a/arch/x86/platform/pvh/Makefile
+++ b/arch/x86/platform/pvh/Makefile
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
 OBJECT_FILES_NON_STANDARD_head.o := y
 
-obj-$(CONFIG_XEN_PVH) += enlighten.o
-obj-$(CONFIG_XEN_PVH) += head.o
+obj-$(CONFIG_PVH) += enlighten.o
+obj-$(CONFIG_PVH) += head.o
diff --git a/arch/x86/platform/pvh/enlighten.c 
b/arch/x86/platform/pvh/enlighten.c
index efbceba8db4f..815a09ad625c 100644
--- a/arch/x86/platform/pvh/enlighten.c
+++ b/arch/x86/platform/pvh/enlighten.c
@@ -8,6 +8,9 @@
 #include 
 #include 
 
+#include 
+#include 
+
 #include 
 #include 
 
@@ -40,11 +43,28 @@ void __init __weak mem_map_via_hcall(struct boot_params 
*ptr __maybe_unused)
BUG();
 }
 
-static void __init init_pvh_bootparams(void)
+static void __init init_pvh_bootparams(bool xen_guest)
 {
memset(_bootparams, 0, sizeof(pvh_bootparams));
 
-   mem_map_via_hcall(_bootparams);
+   if ((pvh_start_info.version > 0) && (pvh_start_info.memmap_entries)) {
+   struct hvm_memmap_table_entry *ep;
+   int i;
+
+   ep = __va(pvh_start_info.memmap_paddr);
+   pvh_bootparams.e820_entries = pvh_start_info.memmap_entries;
+
+   for (i = 0; i < pvh_bootparams.e820_entries ; i++, ep++) {
+   pvh_bootparams.e820_table[i].addr = ep->addr;
+   pvh_bootparams.e820_table[i].size = ep->size;
+   pvh_bootparams.e820_table[i].type = ep->type;
+   }
+   } else if (xen_guest) {
+   mem_map_via_hcall(_bootparams);
+   } else {
+   /* Non-xen guests are not supported by version 0 */
+   BUG();
+   }
 
if (pvh_bootparams.e820_entries < E820_MAX_ENTRIES_ZEROPAGE - 1) {
pvh_bootparams.e820_table[pvh_bootparams.e820_entries].addr =
@@ -75,7 +95,7 @@ static void __init init_pvh_bootparams(void)
 * environment (i.e. hardware_subarch 0).
 */
pvh_bootparams.hdr.version = 0x212;
-   pvh_bootparams.hdr.type_of_loader = (9 << 4) | 0; /* Xen loader */
+   pvh_bootparams.hdr.type_of_loader = ((xen_guest ? 0x9 : 0xb) << 4) | 0;
 
x86_init.acpi.get_root_pointer = pvh_get_root_pointer;
 }
@@ -90,13 +110,10 @@ void __init __weak xen_pvh_init(void)
BUG();
 }
 
-/*
- * When we add support for other hypervisors like Qemu/KVM, this routine can
- * selectively invoke the appropriate initialization based on guest type.
- */
-static void hypervisor_specific_init(void)
+static void hypervisor_specific_init(bool xen_guest)
 {
-   xen_pvh_init();
+   if (xen_guest)
+   xen_pvh_init();
 }
 
 /*
@@ -105,13 +122,17 @@ static void hypervisor_specific_init(void)
  */
 

[PATCH v6 7/7] KVM: x86: Allow Qemu/KVM to use PVH entry point

2018-04-04 Thread Maran Wilson
For certain applications it is desirable to rapidly boot a KVM virtual
machine. In cases where legacy hardware and software support within the
guest is not needed, Qemu should be able to boot directly into the
uncompressed Linux kernel binary without the need to run firmware.

There already exists an ABI to allow this for Xen PVH guests and the ABI
is supported by Linux and FreeBSD:

   https://xenbits.xen.org/docs/unstable/misc/pvh.html

This patch enables Qemu to use that same entry point for booting KVM
guests.

Signed-off-by: Maran Wilson 
Suggested-by: Konrad Rzeszutek Wilk 
Suggested-by: Boris Ostrovsky 
Tested-by: Boris Ostrovsky 
---
 arch/x86/Kbuild   |  2 +-
 arch/x86/Kconfig  |  8 
 arch/x86/platform/pvh/Makefile|  4 ++--
 arch/x86/platform/pvh/enlighten.c | 43 +--
 4 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/arch/x86/Kbuild b/arch/x86/Kbuild
index 2089e4414300..c625f57472f7 100644
--- a/arch/x86/Kbuild
+++ b/arch/x86/Kbuild
@@ -7,7 +7,7 @@ obj-$(CONFIG_KVM) += kvm/
 # Xen paravirtualization support
 obj-$(CONFIG_XEN) += xen/
 
-obj-$(CONFIG_XEN_PVH) += platform/pvh/
+obj-$(CONFIG_PVH) += platform/pvh/
 
 # Hyper-V paravirtualization support
 obj-$(subst m,y,$(CONFIG_HYPERV)) += hyperv/
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index e3b836d7ad09..1e6d83e181b5 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -787,6 +787,14 @@ config PVH
  This option enables the PVH entry point for guest virtual machines
  as specified in the x86/HVM direct boot ABI.
 
+config KVM_GUEST_PVH
+   bool "Support for running as a KVM PVH guest"
+   depends on KVM_GUEST
+   select PVH
+   ---help---
+ This option enables starting KVM guests via the PVH entry point as
+ specified in the x86/HVM direct boot ABI.
+
 config KVM_DEBUG_FS
bool "Enable debug information for KVM Guests in debugfs"
depends on KVM_GUEST && DEBUG_FS
diff --git a/arch/x86/platform/pvh/Makefile b/arch/x86/platform/pvh/Makefile
index 9fd25efcd2a3..5dec5067c9fb 100644
--- a/arch/x86/platform/pvh/Makefile
+++ b/arch/x86/platform/pvh/Makefile
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
 OBJECT_FILES_NON_STANDARD_head.o := y
 
-obj-$(CONFIG_XEN_PVH) += enlighten.o
-obj-$(CONFIG_XEN_PVH) += head.o
+obj-$(CONFIG_PVH) += enlighten.o
+obj-$(CONFIG_PVH) += head.o
diff --git a/arch/x86/platform/pvh/enlighten.c 
b/arch/x86/platform/pvh/enlighten.c
index efbceba8db4f..815a09ad625c 100644
--- a/arch/x86/platform/pvh/enlighten.c
+++ b/arch/x86/platform/pvh/enlighten.c
@@ -8,6 +8,9 @@
 #include 
 #include 
 
+#include 
+#include 
+
 #include 
 #include 
 
@@ -40,11 +43,28 @@ void __init __weak mem_map_via_hcall(struct boot_params 
*ptr __maybe_unused)
BUG();
 }
 
-static void __init init_pvh_bootparams(void)
+static void __init init_pvh_bootparams(bool xen_guest)
 {
memset(_bootparams, 0, sizeof(pvh_bootparams));
 
-   mem_map_via_hcall(_bootparams);
+   if ((pvh_start_info.version > 0) && (pvh_start_info.memmap_entries)) {
+   struct hvm_memmap_table_entry *ep;
+   int i;
+
+   ep = __va(pvh_start_info.memmap_paddr);
+   pvh_bootparams.e820_entries = pvh_start_info.memmap_entries;
+
+   for (i = 0; i < pvh_bootparams.e820_entries ; i++, ep++) {
+   pvh_bootparams.e820_table[i].addr = ep->addr;
+   pvh_bootparams.e820_table[i].size = ep->size;
+   pvh_bootparams.e820_table[i].type = ep->type;
+   }
+   } else if (xen_guest) {
+   mem_map_via_hcall(_bootparams);
+   } else {
+   /* Non-xen guests are not supported by version 0 */
+   BUG();
+   }
 
if (pvh_bootparams.e820_entries < E820_MAX_ENTRIES_ZEROPAGE - 1) {
pvh_bootparams.e820_table[pvh_bootparams.e820_entries].addr =
@@ -75,7 +95,7 @@ static void __init init_pvh_bootparams(void)
 * environment (i.e. hardware_subarch 0).
 */
pvh_bootparams.hdr.version = 0x212;
-   pvh_bootparams.hdr.type_of_loader = (9 << 4) | 0; /* Xen loader */
+   pvh_bootparams.hdr.type_of_loader = ((xen_guest ? 0x9 : 0xb) << 4) | 0;
 
x86_init.acpi.get_root_pointer = pvh_get_root_pointer;
 }
@@ -90,13 +110,10 @@ void __init __weak xen_pvh_init(void)
BUG();
 }
 
-/*
- * When we add support for other hypervisors like Qemu/KVM, this routine can
- * selectively invoke the appropriate initialization based on guest type.
- */
-static void hypervisor_specific_init(void)
+static void hypervisor_specific_init(bool xen_guest)
 {
-   xen_pvh_init();
+   if (xen_guest)
+   xen_pvh_init();
 }
 
 /*
@@ -105,13 +122,17 @@ static void hypervisor_specific_init(void)
  */
 void __init xen_prepare_pvh(void)
 {
+
+   u32 msr = xen_cpuid_base();
+   bool xen_guest = !!msr;