* [PATCH 1/4] hw/m68k/virt: Add a XHCI controller
2024-05-27 17:15 [PATCH 0/4] hw/m68k/virt: Add some devices Jiaxun Yang
@ 2024-05-27 17:15 ` Jiaxun Yang
2024-05-27 17:15 ` [PATCH 2/4] hw/m68k/virt: Add fw_cfg controller Jiaxun Yang
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Jiaxun Yang @ 2024-05-27 17:15 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Laurent Vivier, Michael S. Tsirkin, Cornelia Huck,
Jiaxun Yang
VirtIO is somewhat limited on the diversity of devices.
We lack proper audio, webcam and so on support on m68k virt machine.
This can be improved by providing a XHCI controller, which enables
provision of many different discoverable devices.
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
hw/m68k/Kconfig | 1 +
hw/m68k/virt.c | 22 +++++++++++++++++++++-
include/standard-headers/asm-m68k/bootinfo-virt.h | 2 ++
3 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/hw/m68k/Kconfig b/hw/m68k/Kconfig
index 0092cda4e9c8..66e63cd60b57 100644
--- a/hw/m68k/Kconfig
+++ b/hw/m68k/Kconfig
@@ -44,4 +44,5 @@ config M68K_VIRT
select GOLDFISH_PIC
select GOLDFISH_TTY
select GOLDFISH_RTC
+ select USB_XHCI_SYSBUS
select VIRTIO_MMIO
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index 09bc9bdfefb2..7b3917dcbd2b 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -33,13 +33,16 @@
#include "hw/char/goldfish_tty.h"
#include "hw/rtc/goldfish_rtc.h"
#include "hw/intc/goldfish_pic.h"
+#include "hw/usb/hcd-xhci-sysbus.h"
#include "hw/virtio/virtio-mmio.h"
#include "hw/virtio/virtio-blk.h"
/*
* 6 goldfish-pic for CPU IRQ #1 to IRQ #6
* CPU IRQ #1 -> PIC #1
- * IRQ #1 to IRQ #31 -> unused
+ * IRQ #1 -> virt-ctrl
+ * IRQ #2 -> xhci
+ * IRQ #3 to IRQ #31 -> unused
* IRQ #32 -> goldfish-tty
* CPU IRQ #2 -> PIC #2
* IRQ #1 to IRQ #32 -> virtio-mmio from 1 to 32
@@ -86,6 +89,9 @@
#define VIRT_VIRTIO_MMIO_BASE 0xff010000 /* MMIO: 0xff010000 - 0xff01ffff */
#define VIRT_VIRTIO_IRQ_BASE PIC_IRQ(2, 1) /* PIC: 2, 3, 4, 5, IRQ: ALL */
+#define VIRT_XHCI_MMIO_BASE 0xff020000 /* MMIO: 0xff020000 - 0xff023fff */
+#define VIRT_XHCI_IRQ_BASE PIC_IRQ(1, 2) /* PIC: #1, IRQ: #2 */
+
typedef struct {
M68kCPU *cpu;
hwaddr initial_pc;
@@ -216,6 +222,16 @@ static void virt_init(MachineState *machine)
io_base += 0x200;
}
+ /* xhci */
+ if (machine_usb(machine)) {
+ dev = qdev_new(TYPE_XHCI_SYSBUS);
+ qdev_prop_set_uint32(dev, "intrs", 1);
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
+ sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, VIRT_XHCI_MMIO_BASE);
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
+ PIC_GPIO(VIRT_XHCI_IRQ_BASE));
+ }
+
if (kernel_filename) {
CPUState *cs = CPU(cpu);
uint64_t high;
@@ -268,6 +284,10 @@ static void virt_init(MachineState *machine)
VIRT_CTRL_MMIO_BASE, VIRT_CTRL_IRQ_BASE);
BOOTINFO2(param_ptr, BI_VIRT_VIRTIO_BASE,
VIRT_VIRTIO_MMIO_BASE, VIRT_VIRTIO_IRQ_BASE);
+ if (machine_usb(machine)) {
+ BOOTINFO2(param_ptr, BI_VIRT_XHCI_BASE,
+ VIRT_XHCI_MMIO_BASE, VIRT_XHCI_IRQ_BASE);
+ }
if (kernel_cmdline) {
BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
diff --git a/include/standard-headers/asm-m68k/bootinfo-virt.h b/include/standard-headers/asm-m68k/bootinfo-virt.h
index 75ac6bbd7d73..1700c3ada765 100644
--- a/include/standard-headers/asm-m68k/bootinfo-virt.h
+++ b/include/standard-headers/asm-m68k/bootinfo-virt.h
@@ -16,6 +16,8 @@
/* No longer used -- replaced with BI_RNG_SEED -- but don't reuse this index:
* #define BI_VIRT_RNG_SEED 0x8006 */
+#define BI_VIRT_XHCI_BASE 0x8007
+
#define VIRT_BOOTI_VERSION MK_BI_VERSION(2, 0)
#endif /* _UAPI_ASM_M68K_BOOTINFO_MAC_H */
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/4] hw/m68k/virt: Add fw_cfg controller
2024-05-27 17:15 [PATCH 0/4] hw/m68k/virt: Add some devices Jiaxun Yang
2024-05-27 17:15 ` [PATCH 1/4] hw/m68k/virt: Add a XHCI controller Jiaxun Yang
@ 2024-05-27 17:15 ` Jiaxun Yang
2024-05-27 17:15 ` [PATCH 3/4] hw/m68k/virt: Add a pflash controller for BIOS firmware Jiaxun Yang
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Jiaxun Yang @ 2024-05-27 17:15 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Laurent Vivier, Michael S. Tsirkin, Cornelia Huck,
Jiaxun Yang
Add a fw_cfg controller to pass essential information
to firmware.
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
hw/m68k/Kconfig | 1 +
hw/m68k/virt.c | 25 ++++++++++++++++++++++-
include/standard-headers/asm-m68k/bootinfo-virt.h | 1 +
3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/hw/m68k/Kconfig b/hw/m68k/Kconfig
index 66e63cd60b57..4501da56ff6d 100644
--- a/hw/m68k/Kconfig
+++ b/hw/m68k/Kconfig
@@ -40,6 +40,7 @@ config M68K_VIRT
default y
depends on M68K
select M68K_IRQC
+ select FW_CFG_DMA
select VIRT_CTRL
select GOLDFISH_PIC
select GOLDFISH_TTY
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index 7b3917dcbd2b..7590e6515ac3 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -42,7 +42,8 @@
* CPU IRQ #1 -> PIC #1
* IRQ #1 -> virt-ctrl
* IRQ #2 -> xhci
- * IRQ #3 to IRQ #31 -> unused
+ * IRQ #3 -> fw_cfg
+ * IRQ #4 to IRQ #31 -> unused
* IRQ #32 -> goldfish-tty
* CPU IRQ #2 -> PIC #2
* IRQ #1 to IRQ #32 -> virtio-mmio from 1 to 32
@@ -80,6 +81,10 @@
#define VIRT_CTRL_MMIO_BASE 0xff009000 /* MMIO: 0xff009000 - 0xff009fff */
#define VIRT_CTRL_IRQ_BASE PIC_IRQ(1, 1) /* PIC: #1, IRQ: #1 */
+/* 1 fw_cfg */
+#define VIRT_FW_CFG_MMIO_BASE 0xff00a000 /* MMIO: 0xff00a000 - 0xff00afff */
+#define VIRT_FW_CFG_IRQ_BASE PIC_IRQ(1, 3) /* PIC: #1, IRQ: #3 */
+
/*
* virtio-mmio size is 0x200 bytes
* we use 4 goldfish-pic to attach them,
@@ -116,6 +121,12 @@ static void rerandomize_rng_seed(void *opaque)
be16_to_cpu(*(uint16_t *)rng_seed->data));
}
+static void fw_cfg_boot_set(void *opaque, const char *boot_device,
+ Error **errp)
+{
+ fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
+}
+
static void virt_init(MachineState *machine)
{
M68kCPU *cpu = NULL;
@@ -134,6 +145,7 @@ static void virt_init(MachineState *machine)
SysBusDevice *sysbus;
hwaddr io_base;
int i;
+ FWCfgState *fw_cfg;
ResetInfo *reset_info;
uint8_t rng_seed[32];
@@ -210,6 +222,15 @@ static void virt_init(MachineState *machine)
dev = sysbus_create_simple(TYPE_VIRT_CTRL, VIRT_CTRL_MMIO_BASE,
PIC_GPIO(VIRT_CTRL_IRQ_BASE));
+ /* fw_cfg */
+ fw_cfg = fw_cfg_init_mem_wide(VIRT_FW_CFG_MMIO_BASE + 8,
+ VIRT_FW_CFG_MMIO_BASE, 8,
+ VIRT_FW_CFG_MMIO_BASE + 16,
+ &address_space_memory);
+ fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
+ qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
+ rom_set_fw(fw_cfg);
+
/* virtio-mmio */
io_base = VIRT_VIRTIO_MMIO_BASE;
for (i = 0; i < 128; i++) {
@@ -288,6 +309,8 @@ static void virt_init(MachineState *machine)
BOOTINFO2(param_ptr, BI_VIRT_XHCI_BASE,
VIRT_XHCI_MMIO_BASE, VIRT_XHCI_IRQ_BASE);
}
+ BOOTINFO2(param_ptr, BI_VIRT_FW_CFG_BASE,
+ VIRT_FW_CFG_MMIO_BASE, VIRT_FW_CFG_IRQ_BASE);
if (kernel_cmdline) {
BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
diff --git a/include/standard-headers/asm-m68k/bootinfo-virt.h b/include/standard-headers/asm-m68k/bootinfo-virt.h
index 1700c3ada765..7f90be1aa7bd 100644
--- a/include/standard-headers/asm-m68k/bootinfo-virt.h
+++ b/include/standard-headers/asm-m68k/bootinfo-virt.h
@@ -17,6 +17,7 @@
* #define BI_VIRT_RNG_SEED 0x8006 */
#define BI_VIRT_XHCI_BASE 0x8007
+#define BI_VIRT_FW_CFG_BASE 0x8008
#define VIRT_BOOTI_VERSION MK_BI_VERSION(2, 0)
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/4] hw/m68k/virt: Add a pflash controller for BIOS firmware
2024-05-27 17:15 [PATCH 0/4] hw/m68k/virt: Add some devices Jiaxun Yang
2024-05-27 17:15 ` [PATCH 1/4] hw/m68k/virt: Add a XHCI controller Jiaxun Yang
2024-05-27 17:15 ` [PATCH 2/4] hw/m68k/virt: Add fw_cfg controller Jiaxun Yang
@ 2024-05-27 17:15 ` Jiaxun Yang
2024-06-18 11:47 ` Philippe Mathieu-Daudé
2024-05-27 17:15 ` [PATCH 4/4] hw/m68k/virt: Supply bootinfo for BIOS Jiaxun Yang
` (2 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Jiaxun Yang @ 2024-05-27 17:15 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Laurent Vivier, Michael S. Tsirkin, Cornelia Huck,
Jiaxun Yang
Add a 8 MiB pflash controller for BIOS firmware, and boot
from it if possible.
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
hw/m68k/Kconfig | 1 +
hw/m68k/virt.c | 44 +++++++++++++++++++++++
include/standard-headers/asm-m68k/bootinfo-virt.h | 1 +
3 files changed, 46 insertions(+)
diff --git a/hw/m68k/Kconfig b/hw/m68k/Kconfig
index 4501da56ff6d..f233a5948f19 100644
--- a/hw/m68k/Kconfig
+++ b/hw/m68k/Kconfig
@@ -42,6 +42,7 @@ config M68K_VIRT
select M68K_IRQC
select FW_CFG_DMA
select VIRT_CTRL
+ select PFLASH_CFI01
select GOLDFISH_PIC
select GOLDFISH_TTY
select GOLDFISH_RTC
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index 7590e6515ac3..a2eebc0f2243 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -8,6 +8,7 @@
*/
#include "qemu/osdep.h"
+#include "qemu/datadir.h"
#include "qemu/units.h"
#include "qemu/guest-random.h"
#include "sysemu/sysemu.h"
@@ -28,6 +29,7 @@
#include "sysemu/runstate.h"
#include "sysemu/reset.h"
+#include "hw/block/flash.h"
#include "hw/intc/m68k_irqc.h"
#include "hw/misc/virt_ctrl.h"
#include "hw/char/goldfish_tty.h"
@@ -97,6 +99,10 @@
#define VIRT_XHCI_MMIO_BASE 0xff020000 /* MMIO: 0xff020000 - 0xff023fff */
#define VIRT_XHCI_IRQ_BASE PIC_IRQ(1, 2) /* PIC: #1, IRQ: #2 */
+#define VIRT_PFLASH_MMIO_BASE 0xff800000 /* MMIO: 0xff800000 - 0xffffffff */
+#define VIRT_PFLASH_SIZE 0x800000 /* 8 MiB */
+#define VIRT_PFLASH_SECTOR_SIZE (128 * KiB) /* 64 KiB */
+
typedef struct {
M68kCPU *cpu;
hwaddr initial_pc;
@@ -139,6 +145,7 @@ static void virt_init(MachineState *machine)
const char *initrd_filename = machine->initrd_filename;
const char *kernel_cmdline = machine->kernel_cmdline;
hwaddr parameters_base;
+ DriveInfo *dinfo;
DeviceState *dev;
DeviceState *irqc_dev;
DeviceState *pic_dev[VIRT_GF_PIC_NB];
@@ -165,6 +172,8 @@ static void virt_init(MachineState *machine)
cpu = M68K_CPU(cpu_create(machine->cpu_type));
reset_info->cpu = cpu;
+ reset_info->initial_pc = VIRT_PFLASH_MMIO_BASE;
+ reset_info->initial_stack = ram_size;
qemu_register_reset(main_cpu_reset, reset_info);
/* RAM */
@@ -253,6 +262,39 @@ static void virt_init(MachineState *machine)
PIC_GPIO(VIRT_XHCI_IRQ_BASE));
}
+ /* pflash */
+ dinfo = drive_get(IF_PFLASH, 0, 0);
+ pflash_cfi01_register(VIRT_PFLASH_MMIO_BASE,
+ "virt.pflash0",
+ VIRT_PFLASH_SIZE,
+ dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
+ VIRT_PFLASH_SECTOR_SIZE, 4,
+ 0x89, 0x18, 0, 0, 1);
+
+ if (machine->firmware) {
+ char *fn;
+ int image_size;
+
+ if (drive_get(IF_PFLASH, 0, 0)) {
+ error_report("The contents of the first flash device may be "
+ "specified with -bios or with -drive if=pflash... "
+ "but you cannot use both options at once");
+ exit(1);
+ }
+ fn = qemu_find_file(QEMU_FILE_TYPE_BIOS, machine->firmware);
+ if (!fn) {
+ error_report("Could not find ROM image '%s'", machine->firmware);
+ exit(1);
+ }
+ image_size = load_image_targphys(fn, VIRT_PFLASH_MMIO_BASE,
+ VIRT_PFLASH_SIZE);
+ g_free(fn);
+ if (image_size < 0) {
+ error_report("Could not load ROM image '%s'", machine->firmware);
+ exit(1);
+ }
+ }
+
if (kernel_filename) {
CPUState *cs = CPU(cpu);
uint64_t high;
@@ -311,6 +353,8 @@ static void virt_init(MachineState *machine)
}
BOOTINFO2(param_ptr, BI_VIRT_FW_CFG_BASE,
VIRT_FW_CFG_MMIO_BASE, VIRT_FW_CFG_IRQ_BASE);
+ BOOTINFO2(param_ptr, BI_VIRT_PFLASH_BASE,
+ VIRT_PFLASH_MMIO_BASE, 0);
if (kernel_cmdline) {
BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
diff --git a/include/standard-headers/asm-m68k/bootinfo-virt.h b/include/standard-headers/asm-m68k/bootinfo-virt.h
index 7f90be1aa7bd..21c9a98d2912 100644
--- a/include/standard-headers/asm-m68k/bootinfo-virt.h
+++ b/include/standard-headers/asm-m68k/bootinfo-virt.h
@@ -18,6 +18,7 @@
#define BI_VIRT_XHCI_BASE 0x8007
#define BI_VIRT_FW_CFG_BASE 0x8008
+#define BI_VIRT_PFLASH_BASE 0x8009
#define VIRT_BOOTI_VERSION MK_BI_VERSION(2, 0)
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/4] hw/m68k/virt: Supply bootinfo for BIOS
2024-05-27 17:15 [PATCH 0/4] hw/m68k/virt: Add some devices Jiaxun Yang
` (2 preceding siblings ...)
2024-05-27 17:15 ` [PATCH 3/4] hw/m68k/virt: Add a pflash controller for BIOS firmware Jiaxun Yang
@ 2024-05-27 17:15 ` Jiaxun Yang
2024-06-18 11:45 ` [PATCH 0/4] hw/m68k/virt: Add some devices Philippe Mathieu-Daudé
2024-06-20 11:32 ` Laurent Vivier
5 siblings, 0 replies; 9+ messages in thread
From: Jiaxun Yang @ 2024-05-27 17:15 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Laurent Vivier, Michael S. Tsirkin, Cornelia Huck,
Jiaxun Yang
We follow common function split between BIOS and QEMU loader,
When BIOS firmware is available QEMU does not load kernel/initrd
binary to memory, instead BIOS retrieve those binaries from fw_cfg.
A stripped version of bootinfo is placed at 1 KiB position of memory.
This allows BIOS to probe board level information. It does not contain
any booting related information (kernel, initrd, cmdline, random).
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
hw/m68k/virt.c | 160 ++++++++++++++++++++++++++++++++-------------------------
1 file changed, 90 insertions(+), 70 deletions(-)
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index a2eebc0f2243..ea7a1bb430fc 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -138,13 +138,16 @@ static void virt_init(MachineState *machine)
M68kCPU *cpu = NULL;
int32_t kernel_size;
uint64_t elf_entry;
- ram_addr_t initrd_base;
- int32_t initrd_size;
+ ram_addr_t initrd_base = 0;
+ int32_t initrd_size = 0;
+ int32_t bootinfo_size;
+ bool bios_loaded = false;
ram_addr_t ram_size = machine->ram_size;
const char *kernel_filename = machine->kernel_filename;
const char *initrd_filename = machine->initrd_filename;
const char *kernel_cmdline = machine->kernel_cmdline;
- hwaddr parameters_base;
+ void *param_blob, *param_ptr, *param_rng_seed = NULL;
+ hwaddr parameters_base = 1 * KiB;
DriveInfo *dinfo;
DeviceState *dev;
DeviceState *irqc_dev;
@@ -264,6 +267,9 @@ static void virt_init(MachineState *machine)
/* pflash */
dinfo = drive_get(IF_PFLASH, 0, 0);
+ if (dinfo) {
+ bios_loaded = true;
+ }
pflash_cfi01_register(VIRT_PFLASH_MMIO_BASE,
"virt.pflash0",
VIRT_PFLASH_SIZE,
@@ -293,18 +299,12 @@ static void virt_init(MachineState *machine)
error_report("Could not load ROM image '%s'", machine->firmware);
exit(1);
}
+
+ bios_loaded = true;
}
- if (kernel_filename) {
- CPUState *cs = CPU(cpu);
+ if (kernel_filename && !bios_loaded) {
uint64_t high;
- void *param_blob, *param_ptr, *param_rng_seed;
-
- if (kernel_cmdline) {
- param_blob = g_malloc(strlen(kernel_cmdline) + 1024);
- } else {
- param_blob = g_malloc(1024);
- }
kernel_size = load_elf(kernel_filename, NULL, NULL, NULL,
&elf_entry, NULL, &high, NULL, 1,
@@ -315,57 +315,6 @@ static void virt_init(MachineState *machine)
}
reset_info->initial_pc = elf_entry;
parameters_base = (high + 1) & ~1;
- param_ptr = param_blob;
-
- BOOTINFO1(param_ptr, BI_MACHTYPE, MACH_VIRT);
- if (m68k_feature(&cpu->env, M68K_FEATURE_M68020)) {
- BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68020);
- } else if (m68k_feature(&cpu->env, M68K_FEATURE_M68030)) {
- BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68030);
- BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68030);
- } else if (m68k_feature(&cpu->env, M68K_FEATURE_M68040)) {
- BOOTINFO1(param_ptr, BI_FPUTYPE, FPU_68040);
- BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68040);
- BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68040);
- } else if (m68k_feature(&cpu->env, M68K_FEATURE_M68060)) {
- BOOTINFO1(param_ptr, BI_FPUTYPE, FPU_68060);
- BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68060);
- BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68060);
- }
- BOOTINFO2(param_ptr, BI_MEMCHUNK, 0, ram_size);
-
- BOOTINFO1(param_ptr, BI_VIRT_QEMU_VERSION,
- ((QEMU_VERSION_MAJOR << 24) | (QEMU_VERSION_MINOR << 16) |
- (QEMU_VERSION_MICRO << 8)));
- BOOTINFO2(param_ptr, BI_VIRT_GF_PIC_BASE,
- VIRT_GF_PIC_MMIO_BASE, VIRT_GF_PIC_IRQ_BASE);
- BOOTINFO2(param_ptr, BI_VIRT_GF_RTC_BASE,
- VIRT_GF_RTC_MMIO_BASE, VIRT_GF_RTC_IRQ_BASE);
- BOOTINFO2(param_ptr, BI_VIRT_GF_TTY_BASE,
- VIRT_GF_TTY_MMIO_BASE, VIRT_GF_TTY_IRQ_BASE);
- BOOTINFO2(param_ptr, BI_VIRT_CTRL_BASE,
- VIRT_CTRL_MMIO_BASE, VIRT_CTRL_IRQ_BASE);
- BOOTINFO2(param_ptr, BI_VIRT_VIRTIO_BASE,
- VIRT_VIRTIO_MMIO_BASE, VIRT_VIRTIO_IRQ_BASE);
- if (machine_usb(machine)) {
- BOOTINFO2(param_ptr, BI_VIRT_XHCI_BASE,
- VIRT_XHCI_MMIO_BASE, VIRT_XHCI_IRQ_BASE);
- }
- BOOTINFO2(param_ptr, BI_VIRT_FW_CFG_BASE,
- VIRT_FW_CFG_MMIO_BASE, VIRT_FW_CFG_IRQ_BASE);
- BOOTINFO2(param_ptr, BI_VIRT_PFLASH_BASE,
- VIRT_PFLASH_MMIO_BASE, 0);
-
- if (kernel_cmdline) {
- BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
- kernel_cmdline);
- }
-
- /* Pass seed to RNG. */
- param_rng_seed = param_ptr;
- qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
- BOOTINFODATA(param_ptr, BI_RNG_SEED,
- rng_seed, sizeof(rng_seed));
/* load initrd */
if (initrd_filename) {
@@ -379,21 +328,92 @@ static void virt_init(MachineState *machine)
initrd_base = (ram_size - initrd_size) & TARGET_PAGE_MASK;
load_image_targphys(initrd_filename, initrd_base,
ram_size - initrd_base);
- BOOTINFO2(param_ptr, BI_RAMDISK, initrd_base,
- initrd_size);
} else {
initrd_base = 0;
initrd_size = 0;
}
- BOOTINFO0(param_ptr, BI_LAST);
- rom_add_blob_fixed_as("bootinfo", param_blob, param_ptr - param_blob,
- parameters_base, cs->as);
+ }
+
+ /* BIOS is going to retrive cmdline from fw_cfg */
+ if (kernel_cmdline && !bios_loaded) {
+ param_blob = g_malloc(strlen(kernel_cmdline) + 1024);
+ } else {
+ param_blob = g_malloc(1024);
+ }
+
+ param_ptr = param_blob;
+ BOOTINFO1(param_ptr, BI_MACHTYPE, MACH_VIRT);
+ if (m68k_feature(&cpu->env, M68K_FEATURE_M68020)) {
+ BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68020);
+ } else if (m68k_feature(&cpu->env, M68K_FEATURE_M68030)) {
+ BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68030);
+ BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68030);
+ } else if (m68k_feature(&cpu->env, M68K_FEATURE_M68040)) {
+ BOOTINFO1(param_ptr, BI_FPUTYPE, FPU_68040);
+ BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68040);
+ BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68040);
+ } else if (m68k_feature(&cpu->env, M68K_FEATURE_M68060)) {
+ BOOTINFO1(param_ptr, BI_FPUTYPE, FPU_68060);
+ BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68060);
+ BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68060);
+ }
+ BOOTINFO2(param_ptr, BI_MEMCHUNK, 0, ram_size);
+
+ BOOTINFO1(param_ptr, BI_VIRT_QEMU_VERSION,
+ ((QEMU_VERSION_MAJOR << 24) | (QEMU_VERSION_MINOR << 16) |
+ (QEMU_VERSION_MICRO << 8)));
+ BOOTINFO2(param_ptr, BI_VIRT_GF_PIC_BASE,
+ VIRT_GF_PIC_MMIO_BASE, VIRT_GF_PIC_IRQ_BASE);
+ BOOTINFO2(param_ptr, BI_VIRT_GF_RTC_BASE,
+ VIRT_GF_RTC_MMIO_BASE, VIRT_GF_RTC_IRQ_BASE);
+ BOOTINFO2(param_ptr, BI_VIRT_GF_TTY_BASE,
+ VIRT_GF_TTY_MMIO_BASE, VIRT_GF_TTY_IRQ_BASE);
+ BOOTINFO2(param_ptr, BI_VIRT_CTRL_BASE,
+ VIRT_CTRL_MMIO_BASE, VIRT_CTRL_IRQ_BASE);
+ BOOTINFO2(param_ptr, BI_VIRT_VIRTIO_BASE,
+ VIRT_VIRTIO_MMIO_BASE, VIRT_VIRTIO_IRQ_BASE);
+ if (machine_usb(machine)) {
+ BOOTINFO2(param_ptr, BI_VIRT_XHCI_BASE,
+ VIRT_XHCI_MMIO_BASE, VIRT_XHCI_IRQ_BASE);
+ }
+ BOOTINFO2(param_ptr, BI_VIRT_FW_CFG_BASE,
+ VIRT_FW_CFG_MMIO_BASE, VIRT_FW_CFG_IRQ_BASE);
+ BOOTINFO2(param_ptr, BI_VIRT_PFLASH_BASE,
+ VIRT_PFLASH_MMIO_BASE, 0);
+
+ /* Boot related */
+ if (!bios_loaded) {
+ if (kernel_cmdline) {
+ BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
+ kernel_cmdline);
+ }
+ if (initrd_size) {
+ BOOTINFO2(param_ptr, BI_RAMDISK, initrd_base,
+ initrd_size);
+ }
+
+ /* Pass seed to RNG. */
+ param_rng_seed = param_ptr;
+ qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
+ BOOTINFODATA(param_ptr, BI_RNG_SEED,
+ rng_seed, sizeof(rng_seed));
+ }
+
+ BOOTINFO0(param_ptr, BI_LAST);
+ bootinfo_size = param_ptr - param_blob;
+ rom_add_blob_fixed_as("bootinfo", param_blob, bootinfo_size,
+ parameters_base, &address_space_memory);
+ if (param_rng_seed) {
qemu_register_reset_nosnapshotload(rerandomize_rng_seed,
- rom_ptr_for_as(cs->as, parameters_base,
+ rom_ptr_for_as(&address_space_memory,
+ parameters_base,
param_ptr - param_blob) +
(param_rng_seed - param_blob));
- g_free(param_blob);
}
+
+ fw_cfg_add_file(fw_cfg, "etc/bootinfo",
+ g_memdup2(param_blob, bootinfo_size), bootinfo_size);
+ g_free(param_blob);
}
static void virt_machine_class_init(ObjectClass *oc, void *data)
--
2.43.0
^ permalink raw reply related [flat|nested] 9+ messages in thread