[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 15/76] pvh: load initrd and expose it through fw_cfg
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 15/76] pvh: load initrd and expose it through fw_cfg |
Date: |
Tue, 5 Feb 2019 19:14:25 +0100 |
From: Stefano Garzarella <address@hidden>
When initrd is specified, load and expose it to the guest firmware
through fw_cfg. The firmware will fill the hvm_start_info for the
kernel.
Signed-off-by: Stefano Garzarella <address@hidden>
Based-on: <address@hidden>
Signed-off-by: Liam Merwick <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/i386/pc.c | 38 +++++++++++++++++++++++++++++---------
1 file changed, 29 insertions(+), 9 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index e39ef5c..5d61557 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1222,25 +1222,45 @@ static void load_linux(PCMachineState *pcms,
*/
if (load_elfboot(kernel_filename, kernel_size,
header, pvh_start_addr, fw_cfg)) {
- struct hvm_modlist_entry ramdisk_mod = { 0 };
-
fclose(f);
fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE,
strlen(kernel_cmdline) + 1);
fw_cfg_add_string(fw_cfg, FW_CFG_CMDLINE_DATA, kernel_cmdline);
- assert(machine->device_memory != NULL);
- ramdisk_mod.paddr = machine->device_memory->base;
- ramdisk_mod.size =
- memory_region_size(&machine->device_memory->mr);
-
- fw_cfg_add_bytes(fw_cfg, FW_CFG_KERNEL_DATA, &ramdisk_mod,
- sizeof(ramdisk_mod));
fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, sizeof(header));
fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA,
header, sizeof(header));
+ /* load initrd */
+ if (initrd_filename) {
+ gsize initrd_size;
+ gchar *initrd_data;
+ GError *gerr = NULL;
+
+ if (!g_file_get_contents(initrd_filename, &initrd_data,
+ &initrd_size, &gerr)) {
+ fprintf(stderr, "qemu: error reading initrd %s: %s\n",
+ initrd_filename, gerr->message);
+ exit(1);
+ }
+
+ initrd_max = pcms->below_4g_mem_size - pcmc->acpi_data_size -
1;
+ if (initrd_size >= initrd_max) {
+ fprintf(stderr, "qemu: initrd is too large, cannot
support."
+ "(max: %"PRIu32", need %"PRId64")\n",
+ initrd_max, (uint64_t)initrd_size);
+ exit(1);
+ }
+
+ initrd_addr = (initrd_max - initrd_size) & ~4095;
+
+ fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr);
+ fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size);
+ fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, initrd_data,
+ initrd_size);
+ }
+
return;
}
/* This looks like a multiboot kernel. If it is, let's stop
--
1.8.3.1
- [Qemu-devel] [PULL 02/76] vhost-user-test: signal data_cond when s->rings changes, (continued)
- [Qemu-devel] [PULL 02/76] vhost-user-test: signal data_cond when s->rings changes, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 07/76] cpu-exec: add assert_no_pages_locked() after longjmp, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 23/76] i386: remove the 'INTEL_PT' CPUID bit from named CPU models, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 10/76] cpus: ignore ESRCH in qemu_cpu_kick_thread(), Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 08/76] cpu-exec: reset BQL after longjmp in cpu_exec_step_atomic, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 03/76] vhost-user-test: support VHOST_USER_PROTOCOL_F_CROSS_ENDIAN, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 22/76] i386: remove the new CPUID 'PCONFIG' from Icelake-Server CPU model, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 20/76] optionrom/pvh: load initrd from fw_cfg, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 13/76] pvh: Add x86/HVM direct boot ABI header file, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 09/76] configure: Add a proper check for openpty() in libutil, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 15/76] pvh: load initrd and expose it through fw_cfg,
Paolo Bonzini <=
- [Qemu-devel] [PULL 24/76] Revert "i386: Add CPUID bit for PCONFIG", Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 19/76] hw/i386/pc: use PVH option rom, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 26/76] contrib/elf2dmp: fix elf.h including, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 12/76] elf-ops.h: Add get_elf_note_type(), Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 21/76] hw/i386/pc: enable PVH only for machine type >= 4.0, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 27/76] contrib/elf2dmp: use GLib in ELF processing, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 29/76] contrib/elf2dmp: fix structures definitions, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 28/76] contrib/elf2dmp: use GLib in PDB processing, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 32/76] monitor: do not use QTAILQ_FOREACH_SAFE across critical sections, Paolo Bonzini, 2019/02/05
- [Qemu-devel] [PULL 38/76] i386: allow to load initrd below 4 GB for recent linux, Paolo Bonzini, 2019/02/05