All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23
@ 2019-01-23  1:01 Paolo Bonzini
  2019-01-23  1:02 ` [Qemu-devel] [PULL 29/51] linuxboot_dma: move common functions in a new header Paolo Bonzini
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Paolo Bonzini @ 2019-01-23  1:01 UTC (permalink / raw)
  To: qemu-devel

The following changes since commit cce871c504694cf1034adf525556e3ca3c7eebb6:

  hw/block/xen: use proper format string for printing sectors (2019-01-21 14:45:49 +0000)

are available in the git repository at:

  git://github.com/bonzini/qemu.git tags/for-upstream

for you to fetch changes up to 3cf01054d896fa88ea0dd31c5abb605c2e68bb29:

  docker: disable Xen on CentOS 7 (2019-01-23 01:40:47 +0100)

----------------------------------------------------------------
* cpu-exec fixes (Emilio, Laurent)
* high address load for linuxboot (Zhijian)
* PVH support (Liam, Stefano)
* Linux header update (Paolo)
* enable vhost-net for all targets that have virtio-net (Paolo)
* vhost-user-test cleanups (Paolo)
* misc i386 changes (Paolo, Robert)
* hexloader-test change to avoid O_NONBLOCK on stdin (Peter)
* configure tweak for openpty (Thomas)
* elf2dmp port to Windows (Viktor)

----------------------------------------------------------------
v1->v2: clang fixes, new patch to tie PVH support to the machine type

Emilio G. Cota (2):
      cpu-exec: add assert_no_pages_locked() after longjmp
      cpu-exec: reset BQL after longjmp in cpu_exec_step_atomic

Laurent Vivier (1):
      cpus: ignore ESRCH in qemu_cpu_kick_thread()

Li Zhijian (4):
      unify len and addr type for memory/address APIs
      hw/core/loader.c: Read as long as possible in load_image_size()
      i386: import & use bootparam.h
      i386: allow to load initrd below 4 GB for recent linux

Liam Merwick (4):
      elf: Add optional function ptr to load_elf() to parse ELF notes
      elf-ops.h: Add get_elf_note_type()
      pvh: Add x86/HVM direct boot ABI header file
      pvh: Boot uncompressed kernel using direct boot ABI

Paolo Bonzini (23):
      scripts/update-linux-headers.sh: adjust for Linux 4.21-rc1 (or 5.0-rc1)
      include: update Linux headers to 4.21-rc1/5.0-rc1
      vhost-net: move stubs to a separate file
      vhost-net-user: add stubs for when no virtio-net device is present
      vhost: restrict Linux dependency to kernel vhost
      vhost-net: compile it on all targets that have virtio-net.
      vhost-net: revamp configure logic
      vhost-user-test: use g_cond_broadcast
      vhost-user-test: signal data_cond when s->rings changes
      vhost-user: support cross-endian vnet headers
      vhost-user-test: support VHOST_USER_PROTOCOL_F_CROSS_ENDIAN
      vhost-user-test: skip if there is no memory at address 0
      vhost-user-test: reduce usage of global_qtest
      vhost-user-test: create a main loop per TestServer
      vhost-user-test: small changes to init_hugepagefs
      vhost-user-test: create a temporary directory per TestServer
      tap: flush STDOUT on newline
      i386: remove the 'INTEL_PT' CPUID bit from named CPU models
      target-i386: hvf: remove MPX support
      monitor: do not use QTAILQ_FOREACH_SAFE across critical sections
      crypto: finish removing TABs
      ui: vnc: finish removing TABs
      docker: disable Xen on CentOS 7

Peter Maydell (1):
      tests/hexloader-test: Don't pass -nographic to the QEMU under test

Robert Hoo (2):
      i386: remove the new CPUID 'PCONFIG' from Icelake-Server CPU model
      Revert "i386: Add CPUID bit for PCONFIG"

Stefano Garzarella (7):
      pvh: load initrd and expose it through fw_cfg
      linuxboot_dma: remove duplicate definitions of FW_CFG
      linuxboot_dma: move common functions in a new header
      optionrom: add new PVH option rom
      hw/i386/pc: use PVH option rom
      optionrom/pvh: load initrd from fw_cfg
      hw/i386/pc: enable PVH only for machine type >= 4.0

Thomas Huth (1):
      configure: Add a proper check for openpty() in libutil

Viktor Prutyanov (6):
      contrib/elf2dmp: fix elf.h including
      contrib/elf2dmp: use GLib in ELF processing
      contrib/elf2dmp: use GLib in PDB processing
      contrib/elf2dmp: fix structures definitions
      contrib/elf2dmp: fix printf format
      configure: enable elf2dmp build for Windows hosts

 .gitignore                                         |    4 +
 Makefile                                           |    6 +-
 accel/tcg/cpu-exec.c                               |    4 +
 backends/Makefile.objs                             |    5 +-
 configure                                          |  118 ++-
 contrib/elf2dmp/kdbg.h                             |   12 +-
 contrib/elf2dmp/main.c                             |   27 +-
 contrib/elf2dmp/pdb.c                              |   33 +-
 contrib/elf2dmp/pdb.h                              |    4 +-
 contrib/elf2dmp/pe.h                               |    6 +-
 contrib/elf2dmp/qemu_elf.c                         |   27 +-
 contrib/elf2dmp/qemu_elf.h                         |   10 +-
 cpus.c                                             |    2 +-
 crypto/aes.c                                       |  414 ++++----
 crypto/desrfb.c                                    |  594 +++++------
 default-configs/virtio.mak                         |    4 +-
 exec.c                                             |   47 +-
 hw/alpha/dp264.c                                   |    4 +-
 hw/arm/armv7m.c                                    |    3 +-
 hw/arm/boot.c                                      |    2 +-
 hw/core/generic-loader.c                           |    2 +-
 hw/core/loader.c                                   |   35 +-
 hw/cris/boot.c                                     |    3 +-
 hw/hppa/machine.c                                  |    6 +-
 hw/i386/multiboot.c                                |    2 +-
 hw/i386/pc.c                                       |  191 +++-
 hw/i386/pc_piix.c                                  |    3 +
 hw/i386/pc_q35.c                                   |    3 +
 hw/lm32/lm32_boards.c                              |    6 +-
 hw/lm32/milkymist.c                                |    3 +-
 hw/m68k/an5206.c                                   |    2 +-
 hw/m68k/mcf5208.c                                  |    2 +-
 hw/microblaze/boot.c                               |    7 +-
 hw/mips/mips_fulong2e.c                            |    5 +-
 hw/mips/mips_malta.c                               |    5 +-
 hw/mips/mips_mipssim.c                             |    5 +-
 hw/mips/mips_r4k.c                                 |    5 +-
 hw/moxie/moxiesim.c                                |    2 +-
 hw/net/Makefile.objs                               |    4 +-
 hw/net/vhost_net-stub.c                            |   92 ++
 hw/net/vhost_net.c                                 |   85 +-
 hw/nios2/boot.c                                    |    7 +-
 hw/openrisc/openrisc_sim.c                         |    2 +-
 hw/pci-host/prep.c                                 |    2 +-
 hw/ppc/e500.c                                      |    3 +-
 hw/ppc/mac_newworld.c                              |    5 +-
 hw/ppc/mac_oldworld.c                              |    5 +-
 hw/ppc/ppc440_bamboo.c                             |    2 +-
 hw/ppc/sam460ex.c                                  |    3 +-
 hw/ppc/spapr.c                                     |    7 +-
 hw/ppc/virtex_ml507.c                              |    2 +-
 hw/riscv/sifive_e.c                                |    2 +-
 hw/riscv/sifive_u.c                                |    2 +-
 hw/riscv/spike.c                                   |    2 +-
 hw/riscv/virt.c                                    |    2 +-
 hw/s390x/ipl.c                                     |    9 +-
 hw/sparc/leon3.c                                   |    3 +-
 hw/sparc/sun4m.c                                   |    6 +-
 hw/sparc64/sun4u.c                                 |    4 +-
 hw/tricore/tricore_testboard.c                     |    2 +-
 hw/virtio/Makefile.objs                            |    8 +-
 hw/virtio/vhost-backend.c                          |   12 +-
 hw/virtio/vhost-user.c                             |   13 +-
 hw/virtio/vhost.c                                  |    2 +-
 hw/xtensa/sim.c                                    |   12 +-
 hw/xtensa/xtfpga.c                                 |    2 +-
 include/elf.h                                      |   10 +
 include/exec/cpu-all.h                             |    2 +-
 include/exec/cpu-common.h                          |    8 +-
 include/exec/memory.h                              |   22 +-
 include/exec/poison.h                              |    1 -
 include/hw/elf_ops.h                               |   77 ++
 include/hw/i386/pc.h                               |    3 +
 include/hw/loader.h                                |    9 +-
 include/hw/xen/start_info.h                        |  146 +++
 include/standard-headers/asm-x86/bootparam.h       |   34 +
 include/standard-headers/drm/drm_fourcc.h          |   63 ++
 include/standard-headers/linux/ethtool.h           |   19 +-
 include/standard-headers/linux/input-event-codes.h |   17 +
 include/standard-headers/linux/pci_regs.h          |    1 +
 include/standard-headers/linux/vhost_types.h       |  128 +++
 include/standard-headers/linux/virtio_balloon.h    |    8 +
 include/standard-headers/linux/virtio_blk.h        |   54 +
 include/standard-headers/linux/virtio_config.h     |    3 +
 include/standard-headers/linux/virtio_gpu.h        |   18 +
 include/standard-headers/linux/virtio_ring.h       |   52 +
 linux-headers/asm-arm/unistd-common.h              |    1 +
 linux-headers/asm-arm64/unistd.h                   |    1 +
 linux-headers/asm-generic/unistd.h                 |   10 +-
 linux-headers/asm-mips/sgidefs.h                   |    8 -
 linux-headers/asm-mips/unistd.h                    | 1074 +-------------------
 linux-headers/asm-mips/unistd_n32.h                |  338 ++++++
 linux-headers/asm-mips/unistd_n64.h                |  334 ++++++
 linux-headers/asm-mips/unistd_o32.h                |  374 +++++++
 linux-headers/asm-powerpc/unistd.h                 |  389 +------
 linux-headers/asm-powerpc/unistd_32.h              |  381 +++++++
 linux-headers/asm-powerpc/unistd_64.h              |  372 +++++++
 linux-headers/linux/kvm.h                          |   29 +
 linux-headers/linux/vfio.h                         |   92 ++
 linux-headers/linux/vhost.h                        |  113 +-
 linux-headers/linux/vhost_types.h                  |    1 +
 monitor.c                                          |    5 +-
 net/Makefile.objs                                  |    4 +-
 net/net.c                                          |    2 +-
 net/vhost-user-stub.c                              |   23 +
 net/vhost-user.c                                   |   13 +
 pc-bios/optionrom/Makefile                         |    5 +-
 pc-bios/optionrom/linuxboot_dma.c                  |  114 +--
 pc-bios/optionrom/optrom.h                         |  110 ++
 pc-bios/optionrom/optrom_fw_cfg.h                  |   92 ++
 pc-bios/optionrom/pvh.S                            |  200 ++++
 pc-bios/optionrom/pvh_main.c                       |  133 +++
 pc-bios/pvh.bin                                    |  Bin 0 -> 1536 bytes
 scripts/tap-driver.pl                              |    1 +
 scripts/tap-merge.pl                               |    1 +
 scripts/update-linux-headers.sh                    |   17 +
 target/i386/cpu.c                                  |   13 +-
 target/i386/cpu.h                                  |    1 -
 target/i386/hvf/x86_cpuid.c                        |   18 +-
 tests/Makefile.include                             |    9 +-
 tests/docker/dockerfiles/centos7.docker            |    5 +-
 tests/hexloader-test.c                             |    2 +-
 tests/vhost-user-test.c                            |  248 +++--
 ui/vnc-enc-hextile-template.h                      |  268 ++---
 ui/vnc-enc-zywrle.h                                |  394 +++----
 125 files changed, 4781 insertions(+), 3002 deletions(-)
 create mode 100644 hw/net/vhost_net-stub.c
 create mode 100644 include/hw/xen/start_info.h
 create mode 100644 include/standard-headers/asm-x86/bootparam.h
 create mode 100644 include/standard-headers/linux/vhost_types.h
 create mode 100644 linux-headers/asm-mips/unistd_n32.h
 create mode 100644 linux-headers/asm-mips/unistd_n64.h
 create mode 100644 linux-headers/asm-mips/unistd_o32.h
 create mode 100644 linux-headers/asm-powerpc/unistd_32.h
 create mode 100644 linux-headers/asm-powerpc/unistd_64.h
 create mode 100644 linux-headers/linux/vhost_types.h
 create mode 100644 net/vhost-user-stub.c
 create mode 100644 pc-bios/optionrom/optrom.h
 create mode 100644 pc-bios/optionrom/optrom_fw_cfg.h
 create mode 100644 pc-bios/optionrom/pvh.S
 create mode 100644 pc-bios/optionrom/pvh_main.c
 create mode 100644 pc-bios/pvh.bin
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PULL 29/51] linuxboot_dma: move common functions in a new header
  2019-01-23  1:01 [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Paolo Bonzini
@ 2019-01-23  1:02 ` Paolo Bonzini
  2019-01-23  1:02 ` [Qemu-devel] [PULL 30/51] optionrom: add new PVH option rom Paolo Bonzini
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2019-01-23  1:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefano Garzarella

From: Stefano Garzarella <sgarzare@redhat.com>

In order to allow other option roms to use these common
useful functions and definitions, this patch put them
in two new C header files called optrom.h and
optrom_fw_cfg.h. We also add useful out*() in*()
functions for different size, and new fw_cfg functions
to use when DMA feature is not available.

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
---
 pc-bios/optionrom/linuxboot_dma.c | 102 +++++++----------------------------
 pc-bios/optionrom/optrom.h        | 110 ++++++++++++++++++++++++++++++++++++++
 pc-bios/optionrom/optrom_fw_cfg.h |  92 +++++++++++++++++++++++++++++++
 3 files changed, 221 insertions(+), 83 deletions(-)
 create mode 100644 pc-bios/optionrom/optrom.h
 create mode 100644 pc-bios/optionrom/optrom_fw_cfg.h

diff --git a/pc-bios/optionrom/linuxboot_dma.c b/pc-bios/optionrom/linuxboot_dma.c
index f728dc8..cbcf667 100644
--- a/pc-bios/optionrom/linuxboot_dma.c
+++ b/pc-bios/optionrom/linuxboot_dma.c
@@ -58,21 +58,13 @@ asm(
 "   jmp load_kernel\n"
 );
 
-#define BIOS_CFG_DMA_ADDR_HIGH 0x514
-#define BIOS_CFG_DMA_ADDR_LOW  0x518
-
-#define uint64_t unsigned long long
-#define uint32_t unsigned int
-#define uint16_t unsigned short
-
-#include "../../include/standard-headers/linux/qemu_fw_cfg.h"
-
-#define barrier() asm("" : : : "memory")
-
-static inline void outl(uint32_t value, uint16_t port)
-{
-    asm("outl %0, %w1" : : "a"(value), "Nd"(port));
-}
+/*
+ * The includes of C headers must be after the asm block to avoid compiler
+ * errors.
+ */
+#include <stdint.h>
+#include "optrom.h"
+#include "optrom_fw_cfg.h"
 
 static inline void set_es(void *addr)
 {
@@ -80,12 +72,6 @@ static inline void set_es(void *addr)
     asm("movl %0, %%es" : : "r"(seg));
 }
 
-#ifdef __clang__
-#define ADDR32
-#else
-#define ADDR32 "addr32 "
-#endif
-
 static inline uint16_t readw_es(uint16_t offset)
 {
     uint16_t val;
@@ -108,56 +94,6 @@ static inline void writel_es(uint16_t offset, uint32_t val)
     asm(ADDR32 "movl %0, %%es:(%1)" : : "r"(val), "r"((uint32_t)offset));
 }
 
-static inline uint32_t bswap32(uint32_t x)
-{
-    asm("bswapl %0" : "=r" (x) : "0" (x));
-    return x;
-}
-
-static inline uint64_t bswap64(uint64_t x)
-{
-    asm("bswapl %%eax; bswapl %%edx; xchg %%eax, %%edx" : "=A" (x) : "0" (x));
-    return x;
-}
-
-static inline uint64_t cpu_to_be64(uint64_t x)
-{
-    return bswap64(x);
-}
-
-static inline uint32_t cpu_to_be32(uint32_t x)
-{
-    return bswap32(x);
-}
-
-static inline uint32_t be32_to_cpu(uint32_t x)
-{
-    return bswap32(x);
-}
-
-/* clang is happy to inline this function, and bloats the
- * ROM.
- */
-static __attribute__((__noinline__))
-void bios_cfg_read_entry(void *buf, uint16_t entry, uint32_t len)
-{
-    struct fw_cfg_dma_access access;
-    uint32_t control = (entry << 16) | FW_CFG_DMA_CTL_SELECT
-                        | FW_CFG_DMA_CTL_READ;
-
-    access.address = cpu_to_be64((uint64_t)(uint32_t)buf);
-    access.length = cpu_to_be32(len);
-    access.control = cpu_to_be32(control);
-
-    barrier();
-
-    outl(cpu_to_be32((uint32_t)&access), BIOS_CFG_DMA_ADDR_LOW);
-
-    while (be32_to_cpu(access.control) & ~FW_CFG_DMA_CTL_ERROR) {
-        barrier();
-    }
-}
-
 /* Return top of memory using BIOS function E801. */
 static uint32_t get_e801_addr(void)
 {
@@ -211,9 +147,9 @@ void load_kernel(void)
     uint32_t initrd_end_page, max_allowed_page;
     uint32_t segment_addr, stack_addr;
 
-    bios_cfg_read_entry(&setup_addr, FW_CFG_SETUP_ADDR, 4);
-    bios_cfg_read_entry(&setup_size, FW_CFG_SETUP_SIZE, 4);
-    bios_cfg_read_entry(setup_addr, FW_CFG_SETUP_DATA, setup_size);
+    bios_cfg_read_entry_dma(&setup_addr, FW_CFG_SETUP_ADDR, 4);
+    bios_cfg_read_entry_dma(&setup_size, FW_CFG_SETUP_SIZE, 4);
+    bios_cfg_read_entry_dma(setup_addr, FW_CFG_SETUP_DATA, setup_size);
 
     set_es(setup_addr);
 
@@ -223,8 +159,8 @@ void load_kernel(void)
         writel_es(0x22c, 0x37ffffff);
     }
 
-    bios_cfg_read_entry(&initrd_addr, FW_CFG_INITRD_ADDR, 4);
-    bios_cfg_read_entry(&initrd_size, FW_CFG_INITRD_SIZE, 4);
+    bios_cfg_read_entry_dma(&initrd_addr, FW_CFG_INITRD_ADDR, 4);
+    bios_cfg_read_entry_dma(&initrd_size, FW_CFG_INITRD_SIZE, 4);
 
     initrd_end_page = ((uint32_t)(initrd_addr + initrd_size) & -4096);
     max_allowed_page = (readl_es(0x22c) & -4096);
@@ -239,15 +175,15 @@ void load_kernel(void)
 
     }
 
-    bios_cfg_read_entry(initrd_addr, FW_CFG_INITRD_DATA, initrd_size);
+    bios_cfg_read_entry_dma(initrd_addr, FW_CFG_INITRD_DATA, initrd_size);
 
-    bios_cfg_read_entry(&kernel_addr, FW_CFG_KERNEL_ADDR, 4);
-    bios_cfg_read_entry(&kernel_size, FW_CFG_KERNEL_SIZE, 4);
-    bios_cfg_read_entry(kernel_addr, FW_CFG_KERNEL_DATA, kernel_size);
+    bios_cfg_read_entry_dma(&kernel_addr, FW_CFG_KERNEL_ADDR, 4);
+    bios_cfg_read_entry_dma(&kernel_size, FW_CFG_KERNEL_SIZE, 4);
+    bios_cfg_read_entry_dma(kernel_addr, FW_CFG_KERNEL_DATA, kernel_size);
 
-    bios_cfg_read_entry(&cmdline_addr, FW_CFG_CMDLINE_ADDR, 4);
-    bios_cfg_read_entry(&cmdline_size, FW_CFG_CMDLINE_SIZE, 4);
-    bios_cfg_read_entry(cmdline_addr, FW_CFG_CMDLINE_DATA, cmdline_size);
+    bios_cfg_read_entry_dma(&cmdline_addr, FW_CFG_CMDLINE_ADDR, 4);
+    bios_cfg_read_entry_dma(&cmdline_size, FW_CFG_CMDLINE_SIZE, 4);
+    bios_cfg_read_entry_dma(cmdline_addr, FW_CFG_CMDLINE_DATA, cmdline_size);
 
     /* Boot linux */
     segment_addr = ((uint32_t)setup_addr >> 4);
diff --git a/pc-bios/optionrom/optrom.h b/pc-bios/optionrom/optrom.h
new file mode 100644
index 0000000..3578192
--- /dev/null
+++ b/pc-bios/optionrom/optrom.h
@@ -0,0 +1,110 @@
+/*
+ * Common Option ROM Functions for C code
+ *
+ * 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) 2015-2019 Red Hat Inc.
+ *   Authors:
+ *     Marc Marí <marc.mari.barcelo@gmail.com>
+ *     Richard W.M. Jones <rjones@redhat.com>
+ *     Stefano Garzarella <sgarzare@redhat.com>
+ */
+
+#ifndef OPTROM_H
+#define OPTROM_H
+
+#include <stdint.h>
+#include "../../include/standard-headers/linux/qemu_fw_cfg.h"
+
+#define barrier() asm("" : : : "memory")
+
+#ifdef __clang__
+#define ADDR32
+#else
+#define ADDR32 "addr32 "
+#endif
+
+static inline void outb(uint8_t value, uint16_t port)
+{
+    asm volatile("outb %0, %w1" : : "a"(value), "Nd"(port));
+}
+
+static inline void outw(uint16_t value, uint16_t port)
+{
+    asm volatile("outw %0, %w1" : : "a"(value), "Nd"(port));
+}
+
+static inline void outl(uint32_t value, uint16_t port)
+{
+    asm volatile("outl %0, %w1" : : "a"(value), "Nd"(port));
+}
+
+static inline uint8_t inb(uint16_t port)
+{
+    uint8_t value;
+
+    asm volatile("inb %w1, %0" : "=a"(value) : "Nd"(port));
+    return value;
+}
+
+static inline uint16_t inw(uint16_t port)
+{
+    uint16_t value;
+
+    asm volatile("inw %w1, %0" : "=a"(value) : "Nd"(port));
+    return value;
+}
+
+static inline uint32_t inl(uint16_t port)
+{
+    uint32_t value;
+
+    asm volatile("inl %w1, %0" : "=a"(value) : "Nd"(port));
+    return value;
+}
+
+static inline void insb(uint16_t port, uint8_t *buf, uint32_t len)
+{
+    asm volatile("rep insb %%dx, %%es:(%%edi)"
+                 : "+c"(len), "+D"(buf) : "d"(port) : "memory");
+}
+
+static inline uint32_t bswap32(uint32_t x)
+{
+    asm("bswapl %0" : "=r" (x) : "0" (x));
+    return x;
+}
+
+static inline uint64_t bswap64(uint64_t x)
+{
+    asm("bswapl %%eax; bswapl %%edx; xchg %%eax, %%edx" : "=A" (x) : "0" (x));
+    return x;
+}
+
+static inline uint64_t cpu_to_be64(uint64_t x)
+{
+    return bswap64(x);
+}
+
+static inline uint32_t cpu_to_be32(uint32_t x)
+{
+    return bswap32(x);
+}
+
+static inline uint32_t be32_to_cpu(uint32_t x)
+{
+    return bswap32(x);
+}
+
+#endif /* OPTROM_H */
diff --git a/pc-bios/optionrom/optrom_fw_cfg.h b/pc-bios/optionrom/optrom_fw_cfg.h
new file mode 100644
index 0000000..a3660a5
--- /dev/null
+++ b/pc-bios/optionrom/optrom_fw_cfg.h
@@ -0,0 +1,92 @@
+/*
+ * Common Option ROM Functions for fw_cfg
+ *
+ * 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) 2015-2019 Red Hat Inc.
+ *   Authors:
+ *     Marc Marí <marc.mari.barcelo@gmail.com>
+ *     Richard W.M. Jones <rjones@redhat.com>
+ *     Stefano Garzarella <sgarzare@redhat.com>
+ */
+
+#ifndef OPTROM_FW_CFG_H
+#define OPTROM_FW_CFG_H
+
+#include "../../include/standard-headers/linux/qemu_fw_cfg.h"
+
+#define BIOS_CFG_IOPORT_CFG     0x510
+#define BIOS_CFG_IOPORT_DATA    0x511
+#define BIOS_CFG_DMA_ADDR_HIGH  0x514
+#define BIOS_CFG_DMA_ADDR_LOW   0x518
+
+static __attribute__((unused))
+void bios_cfg_select(uint16_t key)
+{
+    outw(key, BIOS_CFG_IOPORT_CFG);
+}
+
+static __attribute__((unused))
+void bios_cfg_read_entry_io(void *buf, uint16_t entry, uint32_t len)
+{
+    bios_cfg_select(entry);
+    insb(BIOS_CFG_IOPORT_DATA, buf, len);
+}
+
+/*
+ * clang is happy to inline this function, and bloats the
+ * ROM.
+ */
+static __attribute__((__noinline__)) __attribute__((unused))
+void bios_cfg_read_entry_dma(void *buf, uint16_t entry, uint32_t len)
+{
+    struct fw_cfg_dma_access access;
+    uint32_t control = (entry << 16) | FW_CFG_DMA_CTL_SELECT
+                        | FW_CFG_DMA_CTL_READ;
+
+    access.address = cpu_to_be64((uint64_t)(uint32_t)buf);
+    access.length = cpu_to_be32(len);
+    access.control = cpu_to_be32(control);
+
+    barrier();
+
+    outl(cpu_to_be32((uint32_t)&access), BIOS_CFG_DMA_ADDR_LOW);
+
+    while (be32_to_cpu(access.control) & ~FW_CFG_DMA_CTL_ERROR) {
+        barrier();
+    }
+}
+
+static __attribute__((unused))
+void bios_cfg_read_entry(void *buf, uint16_t entry, uint32_t len,
+                         uint32_t version)
+{
+    if (version & FW_CFG_VERSION_DMA) {
+        bios_cfg_read_entry_dma(buf, entry, len);
+    } else {
+        bios_cfg_read_entry_io(buf, entry, len);
+    }
+}
+
+static __attribute__((unused))
+uint32_t bios_cfg_version(void)
+{
+    uint32_t version;
+
+    bios_cfg_read_entry_io(&version, FW_CFG_ID, sizeof(version));
+
+    return version;
+}
+
+#endif /* OPTROM_FW_CFG_H */
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PULL 30/51] optionrom: add new PVH option rom
  2019-01-23  1:01 [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Paolo Bonzini
  2019-01-23  1:02 ` [Qemu-devel] [PULL 29/51] linuxboot_dma: move common functions in a new header Paolo Bonzini
@ 2019-01-23  1:02 ` Paolo Bonzini
  2019-01-23  1:02 ` [Qemu-devel] [PULL 33/51] hw/i386/pc: enable PVH only for machine type >= 4.0 Paolo Bonzini
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2019-01-23  1:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefano Garzarella

From: Stefano Garzarella <sgarzare@redhat.com>

The new pvh.bin option rom can be used with SeaBIOS to boot
uncompressed kernel using the x86/HVM direct boot ABI.

pvh.S contains the entry point of the option rom. It runs
in real mode, loads the e820 table querying the BIOS, and
then it switches to 32bit protected mode and jumps to the
pvh_load_kernel() written in pvh_main.c.
pvh_load_kernel() loads the cmdline and kernel entry_point
using fw_cfg, then it looks for RSDP, fills the
hvm_start_info required by x86/HVM ABI, and finally jumps
to the kernel entry_point.

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
---
 .gitignore                   |   4 +
 Makefile                     |   2 +-
 pc-bios/optionrom/Makefile   |   5 +-
 pc-bios/optionrom/pvh.S      | 200 +++++++++++++++++++++++++++++++++++++++++++
 pc-bios/optionrom/pvh_main.c | 116 +++++++++++++++++++++++++
 pc-bios/pvh.bin              | Bin 0 -> 1536 bytes
 6 files changed, 325 insertions(+), 2 deletions(-)
 create mode 100644 pc-bios/optionrom/pvh.S
 create mode 100644 pc-bios/optionrom/pvh_main.c
 create mode 100644 pc-bios/pvh.bin

diff --git a/.gitignore b/.gitignore
index 0430257..321095b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -103,6 +103,10 @@
 /pc-bios/optionrom/linuxboot_dma.bin
 /pc-bios/optionrom/linuxboot_dma.raw
 /pc-bios/optionrom/linuxboot_dma.img
+/pc-bios/optionrom/pvh.asm
+/pc-bios/optionrom/pvh.bin
+/pc-bios/optionrom/pvh.raw
+/pc-bios/optionrom/pvh.img
 /pc-bios/optionrom/multiboot.asm
 /pc-bios/optionrom/multiboot.bin
 /pc-bios/optionrom/multiboot.raw
diff --git a/Makefile b/Makefile
index dccba1d..6de3a38 100644
--- a/Makefile
+++ b/Makefile
@@ -669,7 +669,7 @@ efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \
 efi-e1000e.rom efi-vmxnet3.rom \
 qemu-icon.bmp qemu_logo_no_text.svg \
 bamboo.dtb canyonlands.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
-multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
+multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin pvh.bin \
 s390-ccw.img s390-netboot.img \
 spapr-rtas.bin slof.bin skiboot.lid \
 palcode-clipper \
diff --git a/pc-bios/optionrom/Makefile b/pc-bios/optionrom/Makefile
index a9a9e5e..e33a24d 100644
--- a/pc-bios/optionrom/Makefile
+++ b/pc-bios/optionrom/Makefile
@@ -37,7 +37,7 @@ Wa = -Wa,
 ASFLAGS += -32
 QEMU_CFLAGS += $(call cc-c-option, $(QEMU_CFLAGS), $(Wa)-32)
 
-build-all: multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin
+build-all: multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin pvh.bin
 
 # suppress auto-removal of intermediate files
 .SECONDARY:
@@ -46,6 +46,9 @@ build-all: multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin
 %.o: %.S
 	$(call quiet-command,$(CPP) $(QEMU_INCLUDES) $(QEMU_DGFLAGS) -c -o - $< | $(AS) $(ASFLAGS) -o $@,"AS","$(TARGET_DIR)$@")
 
+pvh.img: pvh.o pvh_main.o
+	$(call quiet-command,$(LD) $(LDFLAGS_NOPIE) -m $(LD_I386_EMULATION) -T $(SRC_PATH)/pc-bios/optionrom/flat.lds -s -o $@ $^,"BUILD","$(TARGET_DIR)$@")
+
 %.img: %.o
 	$(call quiet-command,$(LD) $(LDFLAGS_NOPIE) -m $(LD_I386_EMULATION) -T $(SRC_PATH)/pc-bios/optionrom/flat.lds -s -o $@ $<,"BUILD","$(TARGET_DIR)$@")
 
diff --git a/pc-bios/optionrom/pvh.S b/pc-bios/optionrom/pvh.S
new file mode 100644
index 0000000..e1d7f4a
--- /dev/null
+++ b/pc-bios/optionrom/pvh.S
@@ -0,0 +1,200 @@
+/*
+ * PVH Option ROM
+ *
+ * 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 Novell Inc, 2009
+ *   Authors: Alexander Graf <agraf@suse.de>
+ *
+ * Copyright (c) 2019 Red Hat Inc.
+ *   Authors: Stefano Garzarella <sgarzare@redhat.com>
+ */
+
+#include "optionrom.h"
+
+#define BOOT_ROM_PRODUCT "PVH loader"
+
+#define GS_PROT_JUMP		0
+#define GS_GDT_DESC		6
+
+#ifdef OPTION_ROM_START
+#undef OPTION_ROM_START
+#endif
+#ifdef OPTION_ROM_END
+#undef OPTION_ROM_END
+#endif
+
+/*
+ * Redefine OPTION_ROM_START and OPTION_ROM_END, because this rom is produced
+ * linking multiple objects.
+ * signrom.py will add padding.
+ */
+#define OPTION_ROM_START                                \
+    .code16;						\
+    .text;						\
+	.global 	_start;				\
+    _start:;						\
+	.short		0xaa55;				\
+	.byte		3; /* desired size in 512 units */
+
+#define OPTION_ROM_END					\
+    _end:
+
+BOOT_ROM_START
+
+run_pvhboot:
+
+	cli
+	cld
+
+	mov		%cs, %eax
+	shl		$0x4, %eax
+
+	/* set up a long jump descriptor that is PC relative */
+
+	/* move stack memory to %gs */
+	mov		%ss, %ecx
+	shl		$0x4, %ecx
+	mov		%esp, %ebx
+	add		%ebx, %ecx
+	sub		$0x20, %ecx
+	sub		$0x30, %esp
+	shr		$0x4, %ecx
+	mov		%cx, %gs
+
+	/* now push the indirect jump descriptor there */
+	mov		(prot_jump), %ebx
+	add		%eax, %ebx
+	movl		%ebx, %gs:GS_PROT_JUMP
+	mov		$8, %bx
+	movw		%bx, %gs:GS_PROT_JUMP + 4
+
+	/* fix the gdt descriptor to be PC relative */
+	movw		(gdt_desc), %bx
+	movw		%bx, %gs:GS_GDT_DESC
+	movl		(gdt_desc+2), %ebx
+	add		%eax, %ebx
+	movl		%ebx, %gs:GS_GDT_DESC + 2
+
+	/* initialize HVM memmap table using int 0x15(e820) */
+
+	/* ES = pvh_e820 struct */
+	mov 		$pvh_e820, %eax
+	shr		$4, %eax
+	mov		%ax, %es
+
+	/* start storing memmap table at %es:8 (pvh_e820.table) */
+	mov 		$8,%edi
+	xor		%ebx, %ebx
+	jmp 		memmap_loop
+
+memmap_loop_check:
+	/* pvh_e820 can contains up to 128 entries */
+	cmp 		$128, %ebx
+	je 		memmap_done
+
+memmap_loop:
+	/* entry size (hvm_memmap_table_entry) & max buffer size (int15) */
+	movl		$24, %ecx
+	/* e820 */
+	movl		$0x0000e820, %eax
+	/* 'SMAP' magic */
+	movl		$0x534d4150, %edx
+	/* store counter value at %es:0 (pvh_e820.entries) */
+	movl 		%ebx, %es:0
+
+	int		$0x15
+	/* error or last entry already done? */
+	jb		memmap_err
+
+	/* %edi += entry size (hvm_memmap_table_entry) */
+	add		$24, %edi
+
+	/* continuation value 0 means last entry */
+	test		%ebx, %ebx
+	jnz		memmap_loop_check
+
+	/* increase pvh_e820.entries to save the last entry */
+	movl 		%es:0, %ebx
+	inc 		%ebx
+
+memmap_done:
+	movl 		%ebx, %es:0
+
+memmap_err:
+
+	/* load the GDT before going into protected mode */
+lgdt:
+	data32 lgdt	%gs:GS_GDT_DESC
+
+	/* get us to protected mode now */
+	movl		$1, %eax
+	movl		%eax, %cr0
+
+	/* the LJMP sets CS for us and gets us to 32-bit */
+ljmp:
+	data32 ljmp	*%gs:GS_PROT_JUMP
+
+prot_mode:
+.code32
+
+	/* initialize all other segments */
+	movl		$0x10, %eax
+	movl		%eax, %ss
+	movl		%eax, %ds
+	movl		%eax, %es
+	movl		%eax, %fs
+	movl		%eax, %gs
+
+	jmp pvh_load_kernel
+
+/* Variables */
+.align 4, 0
+prot_jump:	.long prot_mode
+		.short 8
+
+.align 4, 0
+gdt:
+	/* 0x00 */
+.byte	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+	/*
+	 * 0x08: code segment
+	 * (base=0, limit=0xfffff, type=32bit code exec/read, DPL=0, 4k)
+	 */
+.byte	0xff, 0xff, 0x00, 0x00, 0x00, 0x9a, 0xcf, 0x00
+
+	/*
+	 * 0x10: data segment
+	 * (base=0, limit=0xfffff, type=32bit data read/write, DPL=0, 4k)
+	 */
+.byte	0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0xcf, 0x00
+
+	/*
+	 * 0x18: code segment
+	 * (base=0, limit=0x0ffff, type=16bit code exec/read/conf, DPL=0, 1b)
+	 */
+.byte	0xff, 0xff, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00
+
+	/*
+	 * 0x20: data segment
+	 * (base=0, limit=0x0ffff, type=16bit data read/write, DPL=0, 1b)
+	 */
+.byte	0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00
+
+gdt_desc:
+.short	(5 * 8) - 1
+.long	gdt
+
+BOOT_ROM_END
diff --git a/pc-bios/optionrom/pvh_main.c b/pc-bios/optionrom/pvh_main.c
new file mode 100644
index 0000000..1dcc5c9
--- /dev/null
+++ b/pc-bios/optionrom/pvh_main.c
@@ -0,0 +1,116 @@
+/*
+ * PVH Option ROM for fw_cfg DMA
+ *
+ * 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) 2019 Red Hat Inc.
+ *   Authors:
+ *     Stefano Garzarella <sgarzare@redhat.com>
+ */
+
+asm (".code32"); /* this code will be executed in protected mode */
+
+#include <stddef.h>
+#include <stdint.h>
+#include "optrom.h"
+#include "optrom_fw_cfg.h"
+#include "../../include/hw/xen/start_info.h"
+
+#define RSDP_SIGNATURE          0x2052545020445352LL /* "RSD PTR " */
+#define RSDP_AREA_ADDR          0x000E0000
+#define RSDP_AREA_SIZE          2048
+#define EBDA_BASE_ADDR          0x0000040E
+#define EBDA_SIZE               1024
+
+#define E820_MAXENTRIES         128
+#define CMDLINE_BUFSIZE         4096
+
+/* e820 table filled in pvh.S using int 0x15 */
+struct pvh_e820_table {
+    uint32_t entries;
+    uint32_t reserved;
+    struct hvm_memmap_table_entry table[E820_MAXENTRIES];
+};
+
+struct pvh_e820_table pvh_e820 asm("pvh_e820") __attribute__ ((aligned));
+
+static struct hvm_start_info start_info;
+static uint8_t cmdline_buffer[CMDLINE_BUFSIZE];
+
+
+/* Search RSDP signature. */
+static uintptr_t search_rsdp(uint32_t start_addr, uint32_t end_addr)
+{
+    uint64_t *rsdp_p;
+
+    /* RSDP signature is always on a 16 byte boundary */
+    for (rsdp_p = (uint64_t *)start_addr; rsdp_p < (uint64_t *)end_addr;
+         rsdp_p += 2) {
+        if (*rsdp_p == RSDP_SIGNATURE) {
+            return (uintptr_t)rsdp_p;
+        }
+    }
+
+    return 0;
+}
+
+/* Force the asm name without leading underscore, even on Win32. */
+extern void pvh_load_kernel(void) asm("pvh_load_kernel");
+
+void pvh_load_kernel(void)
+{
+    void *cmdline_addr = &cmdline_buffer;
+    void *kernel_entry;
+    uint32_t cmdline_size, fw_cfg_version = bios_cfg_version();
+
+    start_info.magic = XEN_HVM_START_MAGIC_VALUE;
+    start_info.version = 1;
+
+    /*
+     * pvh_e820 is filled in the pvh.S before to switch in protected mode,
+     * because we can use int 0x15 only in real mode.
+     */
+    start_info.memmap_entries = pvh_e820.entries;
+    start_info.memmap_paddr = (uintptr_t)pvh_e820.table;
+
+    /*
+     * Search RSDP in the main BIOS area below 1 MB.
+     * SeaBIOS store the RSDP in this area, so we try it first.
+     */
+    start_info.rsdp_paddr = search_rsdp(RSDP_AREA_ADDR,
+                                        RSDP_AREA_ADDR + RSDP_AREA_SIZE);
+
+    /* Search RSDP in the EBDA if it is not found */
+    if (!start_info.rsdp_paddr) {
+        /*
+         * Th EBDA address is stored at EBDA_BASE_ADDR. It contains 2 bytes
+         * segment pointer to EBDA, so we must convert it to a linear address.
+         */
+        uint32_t ebda_paddr = ((uint32_t)*((uint16_t *)EBDA_BASE_ADDR)) << 4;
+        if (ebda_paddr > 0x400) {
+            uint32_t *ebda = (uint32_t *)ebda_paddr;
+
+            start_info.rsdp_paddr = search_rsdp(*ebda, *ebda + EBDA_SIZE);
+        }
+    }
+
+    bios_cfg_read_entry(&cmdline_size, FW_CFG_CMDLINE_SIZE, 4, fw_cfg_version);
+    bios_cfg_read_entry(cmdline_addr, FW_CFG_CMDLINE_DATA, cmdline_size,
+                        fw_cfg_version);
+    start_info.cmdline_paddr = (uintptr_t)cmdline_addr;
+
+    bios_cfg_read_entry(&kernel_entry, FW_CFG_KERNEL_ENTRY, 4, fw_cfg_version);
+
+    asm volatile("jmp *%1" : : "b"(&start_info), "c"(kernel_entry));
+}
diff --git a/pc-bios/pvh.bin b/pc-bios/pvh.bin
new file mode 100644
index 0000000000000000000000000000000000000000..38a41761014957d50eb55d790b6957888cbeee0a
GIT binary patch
literal 1536
zcmeHFO=uHA6n<Mbnu=ssNNWxu1R3K=F$hAzLe;1RTZsKrX#Im`@DQq$r1jvTWvz7B
z?oxVDJP5Tn&m!9tH6fLa717p9wTLMN$!ew8f`@9mzS(9Ku{W=skT>6(H}8AjdpoTU
zx4nc-R}e_ND=t*H!BfH+!No@%FjUZISAWu>0?idgIy6ml^CD#nRCq@fD@>KeLo{cJ
zx<%EHEKnhzpezJ1;e`YXiJ*q+1O(dw!^hpQ7pT$a2cWr<sAuUjFBYQFxi6Kp|3@F<
z)B!pk;Acj-gf<gD*4P|zXkS%z@1cqrpaXO1nFw-X_{2siK_#IY>lj?Wv^Sfe_CWwc
zMo)jE&+1vdsF$n<=mM<bpBHtPZ6mt(8k~Kkyx)hi53nBs$a?l<V=Khl>ch!vS2`2j
zK!@F5v$80&x6v7?AWe<181b?evP*iw8i<%%klA}>YNs^C{Dc*yLMGq=SW-nI6_nz7
z%BQ6w;Ckur%B0+$A8tL@hLl04m5hw{>C(7}61AJepV^K6N>WV`zv-#NDc*SAb=dU8
z5b@4O`C!McqcH|Kx{Aj1B+>F^0QgY1D)%opHOIngz1aUP-qIAVoR)6wz;q=m*Mipv
z=?|voayiHJbe2&xOGkaE10O;y;NEju1??_JHTm9Z>j)BPk9irSsmV*X_u;`NrP9Ud
z%ot~9Rh(Jtfr&cgU_oNW2m;LiR3Q!ALGXk(Z}9T$GhKShTmL->w!D%ws>&g?f%w@+
zeuT4BTZlMz-YL+5)_DUw-%XYIy$L=$Oq1<-Wir@)@zRC7_9%jMI3GvdpT4aQ+qTO=
z{<(%7q70X%#fZPOwr1O0K*musTl&iVe`IVV@%M;Ha;boqtX@vs1JUeX6R{T8otMbP
NY^|*c{O<$?e*uLwDi8nw

literal 0
HcmV?d00001

-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PULL 33/51] hw/i386/pc: enable PVH only for machine type >= 4.0
  2019-01-23  1:01 [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Paolo Bonzini
  2019-01-23  1:02 ` [Qemu-devel] [PULL 29/51] linuxboot_dma: move common functions in a new header Paolo Bonzini
  2019-01-23  1:02 ` [Qemu-devel] [PULL 30/51] optionrom: add new PVH option rom Paolo Bonzini
@ 2019-01-23  1:02 ` Paolo Bonzini
  2019-01-24 11:55 ` [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Peter Maydell
  2019-01-24 11:57 ` Peter Maydell
  4 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2019-01-23  1:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefano Garzarella

From: Stefano Garzarella <sgarzare@redhat.com>

In order to avoid migration issues, we enable PVH only for
machine type >= 4.0

Suggested-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 hw/i386/pc.c         | 4 +++-
 hw/i386/pc_piix.c    | 3 +++
 hw/i386/pc_q35.c     | 3 +++
 include/hw/i386/pc.h | 3 +++
 4 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 2833b13..3be4a06 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1211,7 +1211,8 @@ static void load_linux(PCMachineState *pcms,
          * saving the PVH entry point used by the x86/HVM direct boot ABI.
          * If load_elfboot() is successful, populate the fw_cfg info.
          */
-        if (load_elfboot(kernel_filename, kernel_size,
+        if (pcmc->pvh_enabled &&
+            load_elfboot(kernel_filename, kernel_size,
                          header, pvh_start_addr, fw_cfg)) {
             fclose(f);
 
@@ -2774,6 +2775,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
     pcmc->acpi_data_size = 0x20000 + 0x8000;
     pcmc->save_tsc_khz = true;
     pcmc->linuxboot_dma_enabled = true;
+    pcmc->pvh_enabled = true;
     assert(!mc->get_hotplug_handler);
     mc->get_hotplug_handler = pc_get_hotpug_handler;
     mc->cpu_index_to_instance_props = pc_cpu_index_to_props;
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 63c84e3..fd0f2c2 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -440,9 +440,12 @@ DEFINE_I440FX_MACHINE(v4_0, "pc-i440fx-4.0", NULL,
 
 static void pc_i440fx_3_1_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+
     pc_i440fx_4_0_machine_options(m);
     m->is_default = 0;
     m->alias = NULL;
+    pcmc->pvh_enabled = false;
     compat_props_add(m->compat_props, hw_compat_3_1, hw_compat_3_1_len);
     compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len);
 }
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index b7b7959..4a175ea 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -376,9 +376,12 @@ DEFINE_Q35_MACHINE(v4_0, "pc-q35-4.0", NULL,
 
 static void pc_q35_3_1_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+
     pc_q35_4_0_machine_options(m);
     m->default_kernel_irqchip_split = false;
     m->alias = NULL;
+    pcmc->pvh_enabled = false;
     compat_props_add(m->compat_props, hw_compat_3_1, hw_compat_3_1_len);
     compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len);
 }
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 0abbe45..e4e2c13 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -133,6 +133,9 @@ struct PCMachineClass {
 
     /* use DMA capable linuxboot option rom */
     bool linuxboot_dma_enabled;
+
+    /* use PVH to load kernels that support this feature */
+    bool pvh_enabled;
 };
 
 #define TYPE_PC_MACHINE "generic-pc-machine"
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23
  2019-01-23  1:01 [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Paolo Bonzini
                   ` (2 preceding siblings ...)
  2019-01-23  1:02 ` [Qemu-devel] [PULL 33/51] hw/i386/pc: enable PVH only for machine type >= 4.0 Paolo Bonzini
@ 2019-01-24 11:55 ` Peter Maydell
  2019-01-24 11:57 ` Peter Maydell
  4 siblings, 0 replies; 6+ messages in thread
From: Peter Maydell @ 2019-01-24 11:55 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: QEMU Developers

On Wed, 23 Jan 2019 at 01:04, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> The following changes since commit cce871c504694cf1034adf525556e3ca3c7eebb6:
>
>   hw/block/xen: use proper format string for printing sectors (2019-01-21 14:45:49 +0000)
>
> are available in the git repository at:
>
>   git://github.com/bonzini/qemu.git tags/for-upstream
>
> for you to fetch changes up to 3cf01054d896fa88ea0dd31c5abb605c2e68bb29:
>
>   docker: disable Xen on CentOS 7 (2019-01-23 01:40:47 +0100)
>
> ----------------------------------------------------------------
> * cpu-exec fixes (Emilio, Laurent)
> * high address load for linuxboot (Zhijian)
> * PVH support (Liam, Stefano)
> * Linux header update (Paolo)
> * enable vhost-net for all targets that have virtio-net (Paolo)
> * vhost-user-test cleanups (Paolo)
> * misc i386 changes (Paolo, Robert)
> * hexloader-test change to avoid O_NONBLOCK on stdin (Peter)
> * configure tweak for openpty (Thomas)
> * elf2dmp port to Windows (Viktor)
>
> ----------------------------------------------------------------
> v1->v2: clang fixes, new patch to tie PVH support to the machine type
>
> Emilio G. Cota (2):
>       cpu-exec: add assert_no_pages_locked() after longjmp
>       cpu-exec: reset BQL after longjmp in cpu_exec_step_atomic
>
> Laurent Vivier (1):
>       cpus: ignore ESRCH in qemu_cpu_kick_thread()
>
> Li Zhijian (4):
>       unify len and addr type for memory/address APIs
>       hw/core/loader.c: Read as long as possible in load_image_size()
>       i386: import & use bootparam.h
>       i386: allow to load initrd below 4 GB for recent linux
>
> Liam Merwick (4):
>       elf: Add optional function ptr to load_elf() to parse ELF notes
>       elf-ops.h: Add get_elf_note_type()
>       pvh: Add x86/HVM direct boot ABI header file
>       pvh: Boot uncompressed kernel using direct boot ABI
>
> Paolo Bonzini (23):
>       scripts/update-linux-headers.sh: adjust for Linux 4.21-rc1 (or 5.0-rc1)
>       include: update Linux headers to 4.21-rc1/5.0-rc1
>       vhost-net: move stubs to a separate file
>       vhost-net-user: add stubs for when no virtio-net device is present
>       vhost: restrict Linux dependency to kernel vhost
>       vhost-net: compile it on all targets that have virtio-net.
>       vhost-net: revamp configure logic
>       vhost-user-test: use g_cond_broadcast
>       vhost-user-test: signal data_cond when s->rings changes
>       vhost-user: support cross-endian vnet headers
>       vhost-user-test: support VHOST_USER_PROTOCOL_F_CROSS_ENDIAN
>       vhost-user-test: skip if there is no memory at address 0
>       vhost-user-test: reduce usage of global_qtest
>       vhost-user-test: create a main loop per TestServer
>       vhost-user-test: small changes to init_hugepagefs
>       vhost-user-test: create a temporary directory per TestServer
>       tap: flush STDOUT on newline
>       i386: remove the 'INTEL_PT' CPUID bit from named CPU models
>       target-i386: hvf: remove MPX support
>       monitor: do not use QTAILQ_FOREACH_SAFE across critical sections
>       crypto: finish removing TABs
>       ui: vnc: finish removing TABs
>       docker: disable Xen on CentOS 7
>
> Peter Maydell (1):
>       tests/hexloader-test: Don't pass -nographic to the QEMU under test
>
> Robert Hoo (2):
>       i386: remove the new CPUID 'PCONFIG' from Icelake-Server CPU model
>       Revert "i386: Add CPUID bit for PCONFIG"
>
> Stefano Garzarella (7):
>       pvh: load initrd and expose it through fw_cfg
>       linuxboot_dma: remove duplicate definitions of FW_CFG
>       linuxboot_dma: move common functions in a new header
>       optionrom: add new PVH option rom
>       hw/i386/pc: use PVH option rom
>       optionrom/pvh: load initrd from fw_cfg
>       hw/i386/pc: enable PVH only for machine type >= 4.0
>
> Thomas Huth (1):
>       configure: Add a proper check for openpty() in libutil
>
> Viktor Prutyanov (6):
>       contrib/elf2dmp: fix elf.h including
>       contrib/elf2dmp: use GLib in ELF processing
>       contrib/elf2dmp: use GLib in PDB processing
>       contrib/elf2dmp: fix structures definitions
>       contrib/elf2dmp: fix printf format
>       configure: enable elf2dmp build for Windows hosts
>
>  .gitignore                                         |    4 +
>  Makefile                                           |    6 +-
>  accel/tcg/cpu-exec.c                               |    4 +
>  backends/Makefile.objs                             |    5 +-
>  configure                                          |  118 ++-
>  contrib/elf2dmp/kdbg.h                             |   12 +-
>  contrib/elf2dmp/main.c                             |   27 +-
>  contrib/elf2dmp/pdb.c                              |   33 +-
>  contrib/elf2dmp/pdb.h                              |    4 +-
>  contrib/elf2dmp/pe.h                               |    6 +-
>  contrib/elf2dmp/qemu_elf.c                         |   27 +-
>  contrib/elf2dmp/qemu_elf.h                         |   10 +-
>  cpus.c                                             |    2 +-
>  crypto/aes.c                                       |  414 ++++----
>  crypto/desrfb.c                                    |  594 +++++------
>  default-configs/virtio.mak                         |    4 +-
>  exec.c                                             |   47 +-
>  hw/alpha/dp264.c                                   |    4 +-
>  hw/arm/armv7m.c                                    |    3 +-
>  hw/arm/boot.c                                      |    2 +-
>  hw/core/generic-loader.c                           |    2 +-
>  hw/core/loader.c                                   |   35 +-
>  hw/cris/boot.c                                     |    3 +-
>  hw/hppa/machine.c                                  |    6 +-
>  hw/i386/multiboot.c                                |    2 +-
>  hw/i386/pc.c                                       |  191 +++-
>  hw/i386/pc_piix.c                                  |    3 +
>  hw/i386/pc_q35.c                                   |    3 +
>  hw/lm32/lm32_boards.c                              |    6 +-
>  hw/lm32/milkymist.c                                |    3 +-
>  hw/m68k/an5206.c                                   |    2 +-
>  hw/m68k/mcf5208.c                                  |    2 +-
>  hw/microblaze/boot.c                               |    7 +-
>  hw/mips/mips_fulong2e.c                            |    5 +-
>  hw/mips/mips_malta.c                               |    5 +-
>  hw/mips/mips_mipssim.c                             |    5 +-
>  hw/mips/mips_r4k.c                                 |    5 +-
>  hw/moxie/moxiesim.c                                |    2 +-
>  hw/net/Makefile.objs                               |    4 +-
>  hw/net/vhost_net-stub.c                            |   92 ++
>  hw/net/vhost_net.c                                 |   85 +-
>  hw/nios2/boot.c                                    |    7 +-
>  hw/openrisc/openrisc_sim.c                         |    2 +-
>  hw/pci-host/prep.c                                 |    2 +-
>  hw/ppc/e500.c                                      |    3 +-
>  hw/ppc/mac_newworld.c                              |    5 +-
>  hw/ppc/mac_oldworld.c                              |    5 +-
>  hw/ppc/ppc440_bamboo.c                             |    2 +-
>  hw/ppc/sam460ex.c                                  |    3 +-
>  hw/ppc/spapr.c                                     |    7 +-
>  hw/ppc/virtex_ml507.c                              |    2 +-
>  hw/riscv/sifive_e.c                                |    2 +-
>  hw/riscv/sifive_u.c                                |    2 +-
>  hw/riscv/spike.c                                   |    2 +-
>  hw/riscv/virt.c                                    |    2 +-
>  hw/s390x/ipl.c                                     |    9 +-
>  hw/sparc/leon3.c                                   |    3 +-
>  hw/sparc/sun4m.c                                   |    6 +-
>  hw/sparc64/sun4u.c                                 |    4 +-
>  hw/tricore/tricore_testboard.c                     |    2 +-
>  hw/virtio/Makefile.objs                            |    8 +-
>  hw/virtio/vhost-backend.c                          |   12 +-
>  hw/virtio/vhost-user.c                             |   13 +-
>  hw/virtio/vhost.c                                  |    2 +-
>  hw/xtensa/sim.c                                    |   12 +-
>  hw/xtensa/xtfpga.c                                 |    2 +-
>  include/elf.h                                      |   10 +
>  include/exec/cpu-all.h                             |    2 +-
>  include/exec/cpu-common.h                          |    8 +-
>  include/exec/memory.h                              |   22 +-
>  include/exec/poison.h                              |    1 -
>  include/hw/elf_ops.h                               |   77 ++
>  include/hw/i386/pc.h                               |    3 +
>  include/hw/loader.h                                |    9 +-
>  include/hw/xen/start_info.h                        |  146 +++
>  include/standard-headers/asm-x86/bootparam.h       |   34 +
>  include/standard-headers/drm/drm_fourcc.h          |   63 ++
>  include/standard-headers/linux/ethtool.h           |   19 +-
>  include/standard-headers/linux/input-event-codes.h |   17 +
>  include/standard-headers/linux/pci_regs.h          |    1 +
>  include/standard-headers/linux/vhost_types.h       |  128 +++
>  include/standard-headers/linux/virtio_balloon.h    |    8 +
>  include/standard-headers/linux/virtio_blk.h        |   54 +
>  include/standard-headers/linux/virtio_config.h     |    3 +
>  include/standard-headers/linux/virtio_gpu.h        |   18 +
>  include/standard-headers/linux/virtio_ring.h       |   52 +
>  linux-headers/asm-arm/unistd-common.h              |    1 +
>  linux-headers/asm-arm64/unistd.h                   |    1 +
>  linux-headers/asm-generic/unistd.h                 |   10 +-
>  linux-headers/asm-mips/sgidefs.h                   |    8 -
>  linux-headers/asm-mips/unistd.h                    | 1074 +-------------------
>  linux-headers/asm-mips/unistd_n32.h                |  338 ++++++
>  linux-headers/asm-mips/unistd_n64.h                |  334 ++++++
>  linux-headers/asm-mips/unistd_o32.h                |  374 +++++++
>  linux-headers/asm-powerpc/unistd.h                 |  389 +------
>  linux-headers/asm-powerpc/unistd_32.h              |  381 +++++++
>  linux-headers/asm-powerpc/unistd_64.h              |  372 +++++++
>  linux-headers/linux/kvm.h                          |   29 +
>  linux-headers/linux/vfio.h                         |   92 ++
>  linux-headers/linux/vhost.h                        |  113 +-
>  linux-headers/linux/vhost_types.h                  |    1 +
>  monitor.c                                          |    5 +-
>  net/Makefile.objs                                  |    4 +-
>  net/net.c                                          |    2 +-
>  net/vhost-user-stub.c                              |   23 +
>  net/vhost-user.c                                   |   13 +
>  pc-bios/optionrom/Makefile                         |    5 +-
>  pc-bios/optionrom/linuxboot_dma.c                  |  114 +--
>  pc-bios/optionrom/optrom.h                         |  110 ++
>  pc-bios/optionrom/optrom_fw_cfg.h                  |   92 ++
>  pc-bios/optionrom/pvh.S                            |  200 ++++
>  pc-bios/optionrom/pvh_main.c                       |  133 +++
>  pc-bios/pvh.bin                                    |  Bin 0 -> 1536 bytes
>  scripts/tap-driver.pl                              |    1 +
>  scripts/tap-merge.pl                               |    1 +
>  scripts/update-linux-headers.sh                    |   17 +
>  target/i386/cpu.c                                  |   13 +-
>  target/i386/cpu.h                                  |    1 -
>  target/i386/hvf/x86_cpuid.c                        |   18 +-
>  tests/Makefile.include                             |    9 +-
>  tests/docker/dockerfiles/centos7.docker            |    5 +-
>  tests/hexloader-test.c                             |    2 +-
>  tests/vhost-user-test.c                            |  248 +++--
>  ui/vnc-enc-hextile-template.h                      |  268 ++---
>  ui/vnc-enc-zywrle.h                                |  394 +++----
>  125 files changed, 4781 insertions(+), 3002 deletions(-)
>  create mode 100644 hw/net/vhost_net-stub.c
>  create mode 100644 include/hw/xen/start_info.h
>  create mode 100644 include/standard-headers/asm-x86/bootparam.h
>  create mode 100644 include/standard-headers/linux/vhost_types.h
>  create mode 100644 linux-headers/asm-mips/unistd_n32.h
>  create mode 100644 linux-headers/asm-mips/unistd_n64.h
>  create mode 100644 linux-headers/asm-mips/unistd_o32.h
>  create mode 100644 linux-headers/asm-powerpc/unistd_32.h
>  create mode 100644 linux-headers/asm-powerpc/unistd_64.h
>  create mode 100644 linux-headers/linux/vhost_types.h
>  create mode 100644 net/vhost-user-stub.c
>  create mode 100644 pc-bios/optionrom/optrom.h
>  create mode 100644 pc-bios/optionrom/optrom_fw_cfg.h
>  create mode 100644 pc-bios/optionrom/pvh.S
>  create mode 100644 pc-bios/optionrom/pvh_main.c
>  create mode 100644 pc-bios/pvh.bin
> --
> 1.8.3.1
>
>


-- 
12345678901234567890123456789012345678901234567890123456789012345678901234567890
         1         2         3         4         5         6         7         8

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23
  2019-01-23  1:01 [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Paolo Bonzini
                   ` (3 preceding siblings ...)
  2019-01-24 11:55 ` [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Peter Maydell
@ 2019-01-24 11:57 ` Peter Maydell
  4 siblings, 0 replies; 6+ messages in thread
From: Peter Maydell @ 2019-01-24 11:57 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: QEMU Developers

On Wed, 23 Jan 2019 at 01:04, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> The following changes since commit cce871c504694cf1034adf525556e3ca3c7eebb6:
>
>   hw/block/xen: use proper format string for printing sectors (2019-01-21 14:45:49 +0000)
>
> are available in the git repository at:
>
>   git://github.com/bonzini/qemu.git tags/for-upstream
>
> for you to fetch changes up to 3cf01054d896fa88ea0dd31c5abb605c2e68bb29:
>
>   docker: disable Xen on CentOS 7 (2019-01-23 01:40:47 +0100)
>
> ----------------------------------------------------------------
> * cpu-exec fixes (Emilio, Laurent)
> * high address load for linuxboot (Zhijian)
> * PVH support (Liam, Stefano)
> * Linux header update (Paolo)
> * enable vhost-net for all targets that have virtio-net (Paolo)
> * vhost-user-test cleanups (Paolo)
> * misc i386 changes (Paolo, Robert)
> * hexloader-test change to avoid O_NONBLOCK on stdin (Peter)
> * configure tweak for openpty (Thomas)
> * elf2dmp port to Windows (Viktor)

I get this intermittent failure in vhost-user-test on osx host:

manooth$ QTEST_QEMU_BINARY=i386-softmmu/qemu-system-i386 ./tests/vhost-user-test
/i386/vhost-user/migrate:
(./tests/vhost-user-test:11590): GLib-WARNING **: 11:54:26.837:
poll(2) failed due to: Bad file descriptor.
Trace/BPT trap: 5

Happens about one time in five when running the test manually.

thanks
-- PMM

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-01-24 12:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-23  1:01 [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Paolo Bonzini
2019-01-23  1:02 ` [Qemu-devel] [PULL 29/51] linuxboot_dma: move common functions in a new header Paolo Bonzini
2019-01-23  1:02 ` [Qemu-devel] [PULL 30/51] optionrom: add new PVH option rom Paolo Bonzini
2019-01-23  1:02 ` [Qemu-devel] [PULL 33/51] hw/i386/pc: enable PVH only for machine type >= 4.0 Paolo Bonzini
2019-01-24 11:55 ` [Qemu-devel] [PULL v2 00/51] Misc patches for 2019-01-23 Peter Maydell
2019-01-24 11:57 ` Peter Maydell

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.