Hi Philippe,
On 10/8/25 15:43, Philippe Mathieu-Daudé wrote:
On 22/1/25 19:09, [email protected] wrote:
From: Helge Deller <[email protected]>
Commit 20f7b890173b ("hw/hppa: Reset vCPUs calling resettable_reset()")
broke booting the Linux kernel with initrd which may have been provided
on the command line. The problem is, that the mentioned commit zeroes
out initial registers which were preset with addresses for the Linux
kernel and initrd.
Fix it by adding proper variables which are set shortly before starting
the firmware.
Signed-off-by: Helge Deller <[email protected]>
Fixes: 20f7b890173b ("hw/hppa: Reset vCPUs calling resettable_reset()")
Cc: Philippe Mathieu-Daudé <[email protected]>
---
hw/hppa/machine.c | 48 +++++++++++++++++++----------------------------
target/hppa/cpu.h | 4 ++++
2 files changed, 23 insertions(+), 29 deletions(-)
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 4bcc66cd6f..0dd1908214 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -356,7 +356,6 @@ static void machine_HP_common_init_tail(MachineState
*machine, PCIBus *pci_bus,
uint64_t kernel_entry = 0, kernel_low, kernel_high;
MemoryRegion *addr_space = get_system_memory();
MemoryRegion *rom_region;
- unsigned int smp_cpus = machine->smp.cpus;
SysBusDevice *s;
/* SCSI disk setup. */
@@ -482,8 +481,8 @@ static void machine_HP_common_init_tail(MachineState
*machine, PCIBus *pci_bus,
kernel_low, kernel_high, kernel_entry, size / KiB);
if (kernel_cmdline) {
- cpu[0]->env.gr[24] = 0x4000;
- pstrcpy_targphys("cmdline", cpu[0]->env.gr[24],
+ cpu[0]->env.cmdline_or_bootorder = 0x4000;
+ pstrcpy_targphys("cmdline", cpu[0]->env.cmdline_or_bootorder,
TARGET_PAGE_SIZE, kernel_cmdline);
I am a bit confused, here @cmdline_or_bootorder contains the physical
address of the kernel command line, ...
...
kernel_entry = machine->boot_config.has_menu ?
machine->boot_config.menu : 0;
- cpu[0]->env.gr[24] = machine->boot_config.order[0];
+ cpu[0]->env.cmdline_or_bootorder = machine->boot_config.order[0];
... but here a char ('c' or 'd'). Both seems different things.
Is that expected?
Yes. That's why this variable is called "cmdline" or "bootorder".
If kernel and cmdline is given, the bios does not need to follow any bootorder
(which means: boot kernel from C or D).
If no kernel/cmdline, this parameter tells the firmare to load bootloader
from c (harddisc) or d (cdrom).
So, it's ok.
Helge