* [PATCH 0/2] hppa updates
@ 2025-01-22 18:09 deller
2025-01-22 18:09 ` [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines deller
2025-01-22 18:09 ` [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd deller
0 siblings, 2 replies; 10+ messages in thread
From: deller @ 2025-01-22 18:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Helge Deller, Richard Henderson
From: Helge Deller <deller@gmx.de>
Two patches: The first fixes booting a Linux kernel which
is provided on the command line.
The second patch adds support for more than 4GB RAM on 64-bit boxes
(requires additional patch for SeaBIOS-hppa which will be pushed
before qemu v10).
Helge Deller (2):
hw/hppa: Support up to 256 GiB RAM on 64-bit machines
hw/hppa: Fix booting Linux kernel with initrd
hw/hppa/hppa_hardware.h | 2 ++
hw/hppa/machine.c | 74 +++++++++++++++++++++--------------------
target/hppa/cpu.h | 4 +++
3 files changed, 44 insertions(+), 36 deletions(-)
--
2.47.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines
2025-01-22 18:09 [PATCH 0/2] hppa updates deller
@ 2025-01-22 18:09 ` deller
2025-01-24 17:49 ` Richard Henderson
2025-01-24 17:52 ` Philippe Mathieu-Daudé
2025-01-22 18:09 ` [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd deller
1 sibling, 2 replies; 10+ messages in thread
From: deller @ 2025-01-22 18:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Helge Deller, Richard Henderson
From: Helge Deller <deller@gmx.de>
Allow up to 256 GB RAM, which is the maximum a rp8440 machine (the very
last 64-bit PA-RISC machine) physically supports.
Signed-off-by: Helge Deller <deller@gmx.de>
---
hw/hppa/hppa_hardware.h | 2 ++
hw/hppa/machine.c | 26 +++++++++++++++++++-------
2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/hw/hppa/hppa_hardware.h b/hw/hppa/hppa_hardware.h
index a9be7bb851..a276240967 100644
--- a/hw/hppa/hppa_hardware.h
+++ b/hw/hppa/hppa_hardware.h
@@ -49,4 +49,6 @@
#define CPU_HPA_CR_REG 7 /* store CPU HPA in cr7 (SeaBIOS internal) */
#define PIM_STORAGE_SIZE 600 /* storage size of pdc_pim_toc_struct (64bit) */
+#define RAM_MAP_HIGH 0x0100000000 /* memory above 3.75 GB is mapped here */
+
#endif
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 8230f43e41..4bcc66cd6f 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -283,16 +283,13 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
cpu[i] = HPPA_CPU(cpu_create(machine->cpu_type));
}
- /*
- * For now, treat address layout as if PSW_W is clear.
- * TODO: create a proper hppa64 board model and load elf64 firmware.
- */
+ /* Initialize memory */
if (hppa_is_pa20(&cpu[0]->env)) {
translate = translate_pa20;
- ram_max = 0xf0000000; /* 3.75 GB (limited by 32-bit firmware) */
+ ram_max = 256 * GiB; /* like HP rp8440 */
} else {
translate = translate_pa10;
- ram_max = 0xf0000000; /* 3.75 GB (32-bit CPU) */
+ ram_max = FIRMWARE_START; /* 3.75 GB (32-bit CPU) */
}
soft_power_reg = translate(NULL, HPA_POWER_BUTTON);
@@ -320,7 +317,22 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
info_report("Max RAM size limited to %" PRIu64 " MB", ram_max / MiB);
machine->ram_size = ram_max;
}
- memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
+ if (machine->ram_size <= FIRMWARE_START) {
+ /* contiguous memory up to 3.75 GB RAM */
+ memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
+ } else {
+ /* non-contiguous: Memory above 3.75 GB is mapped at RAM_MAP_HIGH */
+ MemoryRegion *mem_region;
+ mem_region = g_new(MemoryRegion, 2);
+ memory_region_init_alias(&mem_region[0], &addr_space->parent_obj,
+ "LowMem", machine->ram, 0, FIRMWARE_START);
+ memory_region_init_alias(&mem_region[1], &addr_space->parent_obj,
+ "HighMem", machine->ram, FIRMWARE_START,
+ machine->ram_size - FIRMWARE_START);
+ memory_region_add_subregion_overlap(addr_space, 0, &mem_region[0], -1);
+ memory_region_add_subregion_overlap(addr_space, RAM_MAP_HIGH,
+ &mem_region[1], -1);
+ }
return translate;
}
--
2.47.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd
2025-01-22 18:09 [PATCH 0/2] hppa updates deller
2025-01-22 18:09 ` [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines deller
@ 2025-01-22 18:09 ` deller
2025-01-24 17:49 ` Richard Henderson
2025-10-08 13:43 ` Philippe Mathieu-Daudé
1 sibling, 2 replies; 10+ messages in thread
From: deller @ 2025-01-22 18:09 UTC (permalink / raw)
To: qemu-devel; +Cc: Helge Deller, Richard Henderson
From: Helge Deller <deller@gmx.de>
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 <deller@gmx.de>
Fixes: 20f7b890173b ("hw/hppa: Reset vCPUs calling resettable_reset()")
Cc: Philippe Mathieu-Daudé <philmd@linaro.org>
---
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);
}
@@ -513,32 +512,22 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
}
load_image_targphys(initrd_filename, initrd_base, initrd_size);
- cpu[0]->env.gr[23] = initrd_base;
- cpu[0]->env.gr[22] = initrd_base + initrd_size;
+ cpu[0]->env.initrd_base = initrd_base;
+ cpu[0]->env.initrd_end = initrd_base + initrd_size;
}
}
if (!kernel_entry) {
/* When booting via firmware, tell firmware if we want interactive
- * mode (kernel_entry=1), and to boot from CD (gr[24]='d')
- * or hard disc * (gr[24]='c').
+ * mode (kernel_entry=1), and to boot from CD (cmdline_or_bootorder='d')
+ * or hard disc (cmdline_or_bootorder='c').
*/
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];
}
- /* We jump to the firmware entry routine and pass the
- * various parameters in registers. After firmware initialization,
- * firmware will start the Linux kernel with ramdisk and cmdline.
- */
- cpu[0]->env.gr[26] = machine->ram_size;
- cpu[0]->env.gr[25] = kernel_entry;
-
- /* tell firmware how many SMP CPUs to present in inventory table */
- cpu[0]->env.gr[21] = smp_cpus;
-
- /* tell firmware fw_cfg port */
- cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
+ /* Keep initial kernel_entry for first boot */
+ cpu[0]->env.kernel_entry = kernel_entry;
}
/*
@@ -675,18 +664,19 @@ static void hppa_machine_reset(MachineState *ms, ResetType type)
cpu[i]->env.gr[5] = CPU_HPA + i * 0x1000;
}
- /* already initialized by machine_hppa_init()? */
- if (cpu[0]->env.gr[26] == ms->ram_size) {
- return;
- }
-
cpu[0]->env.gr[26] = ms->ram_size;
- cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
- cpu[0]->env.gr[24] = 'c';
- /* gr22/gr23 unused, no initrd while reboot. */
+ cpu[0]->env.gr[25] = cpu[0]->env.kernel_entry;
+ cpu[0]->env.gr[24] = cpu[0]->env.cmdline_or_bootorder;
+ cpu[0]->env.gr[23] = cpu[0]->env.initrd_base;
+ cpu[0]->env.gr[22] = cpu[0]->env.initrd_end;
cpu[0]->env.gr[21] = smp_cpus;
- /* tell firmware fw_cfg port */
cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
+
+ /* reset static fields to avoid starting Linux kernel & initrd on reboot */
+ cpu[0]->env.kernel_entry = 0;
+ cpu[0]->env.initrd_base = 0;
+ cpu[0]->env.initrd_end = 0;
+ cpu[0]->env.cmdline_or_bootorder = 'c';
}
static void hppa_nmi(NMIState *n, int cpu_index, Error **errp)
diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
index 083d4f5a56..beea42d105 100644
--- a/target/hppa/cpu.h
+++ b/target/hppa/cpu.h
@@ -268,6 +268,10 @@ typedef struct CPUArchState {
struct {} end_reset_fields;
bool is_pa20;
+
+ target_ulong kernel_entry; /* Linux kernel was loaded here */
+ target_ulong cmdline_or_bootorder;
+ target_ulong initrd_base, initrd_end;
} CPUHPPAState;
/**
--
2.47.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd
2025-01-22 18:09 ` [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd deller
@ 2025-01-24 17:49 ` Richard Henderson
2025-10-08 13:43 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 10+ messages in thread
From: Richard Henderson @ 2025-01-24 17:49 UTC (permalink / raw)
To: deller, qemu-devel; +Cc: Helge Deller
On 1/22/25 10:09, deller@kernel.org wrote:
> From: Helge Deller<deller@gmx.de>
>
> 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<deller@gmx.de>
> Fixes: 20f7b890173b ("hw/hppa: Reset vCPUs calling resettable_reset()")
> Cc: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
> hw/hppa/machine.c | 48 +++++++++++++++++++----------------------------
> target/hppa/cpu.h | 4 ++++
> 2 files changed, 23 insertions(+), 29 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines
2025-01-22 18:09 ` [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines deller
@ 2025-01-24 17:49 ` Richard Henderson
2025-01-24 17:52 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 10+ messages in thread
From: Richard Henderson @ 2025-01-24 17:49 UTC (permalink / raw)
To: deller, qemu-devel; +Cc: Helge Deller
On 1/22/25 10:09, deller@kernel.org wrote:
> From: Helge Deller <deller@gmx.de>
>
> Allow up to 256 GB RAM, which is the maximum a rp8440 machine (the very
> last 64-bit PA-RISC machine) physically supports.
>
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> hw/hppa/hppa_hardware.h | 2 ++
> hw/hppa/machine.c | 26 +++++++++++++++++++-------
> 2 files changed, 21 insertions(+), 7 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines
2025-01-22 18:09 ` [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines deller
2025-01-24 17:49 ` Richard Henderson
@ 2025-01-24 17:52 ` Philippe Mathieu-Daudé
2025-01-24 18:18 ` Helge Deller
1 sibling, 1 reply; 10+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-01-24 17:52 UTC (permalink / raw)
To: deller, qemu-devel; +Cc: Helge Deller, Richard Henderson
On 22/1/25 19:09, deller@kernel.org wrote:
> From: Helge Deller <deller@gmx.de>
>
> Allow up to 256 GB RAM, which is the maximum a rp8440 machine (the very
> last 64-bit PA-RISC machine) physically supports.
>
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> hw/hppa/hppa_hardware.h | 2 ++
> hw/hppa/machine.c | 26 +++++++++++++++++++-------
> 2 files changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/hw/hppa/hppa_hardware.h b/hw/hppa/hppa_hardware.h
> index a9be7bb851..a276240967 100644
> --- a/hw/hppa/hppa_hardware.h
> +++ b/hw/hppa/hppa_hardware.h
> @@ -49,4 +49,6 @@
> #define CPU_HPA_CR_REG 7 /* store CPU HPA in cr7 (SeaBIOS internal) */
> #define PIM_STORAGE_SIZE 600 /* storage size of pdc_pim_toc_struct (64bit) */
>
> +#define RAM_MAP_HIGH 0x0100000000 /* memory above 3.75 GB is mapped here */
Should we use ull suffix?
> +
> #endif
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines
2025-01-24 17:52 ` Philippe Mathieu-Daudé
@ 2025-01-24 18:18 ` Helge Deller
0 siblings, 0 replies; 10+ messages in thread
From: Helge Deller @ 2025-01-24 18:18 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, deller, qemu-devel; +Cc: Richard Henderson
On 1/24/25 18:52, Philippe Mathieu-Daudé wrote:
> On 22/1/25 19:09, deller@kernel.org wrote:
>> From: Helge Deller <deller@gmx.de>
>>
>> Allow up to 256 GB RAM, which is the maximum a rp8440 machine (the very
>> last 64-bit PA-RISC machine) physically supports.
>>
>> Signed-off-by: Helge Deller <deller@gmx.de>
>> ---
>> hw/hppa/hppa_hardware.h | 2 ++
>> hw/hppa/machine.c | 26 +++++++++++++++++++-------
>> 2 files changed, 21 insertions(+), 7 deletions(-)
>>
>> diff --git a/hw/hppa/hppa_hardware.h b/hw/hppa/hppa_hardware.h
>> index a9be7bb851..a276240967 100644
>> --- a/hw/hppa/hppa_hardware.h
>> +++ b/hw/hppa/hppa_hardware.h
>> @@ -49,4 +49,6 @@
>> #define CPU_HPA_CR_REG 7 /* store CPU HPA in cr7 (SeaBIOS internal) */
>> #define PIM_STORAGE_SIZE 600 /* storage size of pdc_pim_toc_struct (64bit) */
>> +#define RAM_MAP_HIGH 0x0100000000 /* memory above 3.75 GB is mapped here */
>
> Should we use ull suffix?
I prefer not to add this suffix, as this file is shared as-is with SeaBIOS-hppa
sources and included by the hppa assembler.
Helge
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd
2025-01-22 18:09 ` [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd deller
2025-01-24 17:49 ` Richard Henderson
@ 2025-10-08 13:43 ` Philippe Mathieu-Daudé
2025-10-08 13:49 ` Helge Deller
1 sibling, 1 reply; 10+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-08 13:43 UTC (permalink / raw)
To: deller, qemu-devel; +Cc: Helge Deller, Richard Henderson
Hi Helge,
On 22/1/25 19:09, deller@kernel.org wrote:
> From: Helge Deller <deller@gmx.de>
>
> 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 <deller@gmx.de>
> Fixes: 20f7b890173b ("hw/hppa: Reset vCPUs calling resettable_reset()")
> Cc: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> 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, ...
> }
>
> @@ -513,32 +512,22 @@ static void machine_HP_common_init_tail(MachineState *machine, PCIBus *pci_bus,
> }
>
> load_image_targphys(initrd_filename, initrd_base, initrd_size);
> - cpu[0]->env.gr[23] = initrd_base;
> - cpu[0]->env.gr[22] = initrd_base + initrd_size;
> + cpu[0]->env.initrd_base = initrd_base;
> + cpu[0]->env.initrd_end = initrd_base + initrd_size;
> }
> }
>
> if (!kernel_entry) {
> /* When booting via firmware, tell firmware if we want interactive
> - * mode (kernel_entry=1), and to boot from CD (gr[24]='d')
> - * or hard disc * (gr[24]='c').
> + * mode (kernel_entry=1), and to boot from CD (cmdline_or_bootorder='d')
> + * or hard disc (cmdline_or_bootorder='c').
> */
> 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?
> }
>
> - /* We jump to the firmware entry routine and pass the
> - * various parameters in registers. After firmware initialization,
> - * firmware will start the Linux kernel with ramdisk and cmdline.
> - */
> - cpu[0]->env.gr[26] = machine->ram_size;
> - cpu[0]->env.gr[25] = kernel_entry;
> -
> - /* tell firmware how many SMP CPUs to present in inventory table */
> - cpu[0]->env.gr[21] = smp_cpus;
> -
> - /* tell firmware fw_cfg port */
> - cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
> + /* Keep initial kernel_entry for first boot */
> + cpu[0]->env.kernel_entry = kernel_entry;
> }
>
> /*
> @@ -675,18 +664,19 @@ static void hppa_machine_reset(MachineState *ms, ResetType type)
> cpu[i]->env.gr[5] = CPU_HPA + i * 0x1000;
> }
>
> - /* already initialized by machine_hppa_init()? */
> - if (cpu[0]->env.gr[26] == ms->ram_size) {
> - return;
> - }
> -
> cpu[0]->env.gr[26] = ms->ram_size;
> - cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
> - cpu[0]->env.gr[24] = 'c';
> - /* gr22/gr23 unused, no initrd while reboot. */
> + cpu[0]->env.gr[25] = cpu[0]->env.kernel_entry;
> + cpu[0]->env.gr[24] = cpu[0]->env.cmdline_or_bootorder;
> + cpu[0]->env.gr[23] = cpu[0]->env.initrd_base;
> + cpu[0]->env.gr[22] = cpu[0]->env.initrd_end;
> cpu[0]->env.gr[21] = smp_cpus;
> - /* tell firmware fw_cfg port */
> cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
> +
> + /* reset static fields to avoid starting Linux kernel & initrd on reboot */
> + cpu[0]->env.kernel_entry = 0;
> + cpu[0]->env.initrd_base = 0;
> + cpu[0]->env.initrd_end = 0;
> + cpu[0]->env.cmdline_or_bootorder = 'c';
> }
>
> static void hppa_nmi(NMIState *n, int cpu_index, Error **errp)
> diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
> index 083d4f5a56..beea42d105 100644
> --- a/target/hppa/cpu.h
> +++ b/target/hppa/cpu.h
> @@ -268,6 +268,10 @@ typedef struct CPUArchState {
> struct {} end_reset_fields;
>
> bool is_pa20;
> +
> + target_ulong kernel_entry; /* Linux kernel was loaded here */
> + target_ulong cmdline_or_bootorder;
> + target_ulong initrd_base, initrd_end;
> } CPUHPPAState;
>
> /**
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd
2025-10-08 13:43 ` Philippe Mathieu-Daudé
@ 2025-10-08 13:49 ` Helge Deller
2025-10-08 14:33 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 10+ messages in thread
From: Helge Deller @ 2025-10-08 13:49 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, deller, qemu-devel; +Cc: Richard Henderson
Hi Philippe,
On 10/8/25 15:43, Philippe Mathieu-Daudé wrote:
> On 22/1/25 19:09, deller@kernel.org wrote:
>> From: Helge Deller <deller@gmx.de>
>>
>> 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 <deller@gmx.de>
>> Fixes: 20f7b890173b ("hw/hppa: Reset vCPUs calling resettable_reset()")
>> Cc: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>> 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
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd
2025-10-08 13:49 ` Helge Deller
@ 2025-10-08 14:33 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 10+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-10-08 14:33 UTC (permalink / raw)
To: Helge Deller, deller, qemu-devel; +Cc: Richard Henderson
On 8/10/25 15:49, Helge Deller wrote:
> Hi Philippe,
>
> On 10/8/25 15:43, Philippe Mathieu-Daudé wrote:
>> On 22/1/25 19:09, deller@kernel.org wrote:
>>> From: Helge Deller <deller@gmx.de>
>>>
>>> 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 <deller@gmx.de>
>>> Fixes: 20f7b890173b ("hw/hppa: Reset vCPUs calling resettable_reset()")
>>> Cc: Philippe Mathieu-Daudé <philmd@linaro.org>
>>> ---
>>> 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).
Ah, now I get the variable name... cmdline is used as hwaddr, and
bootorder as plain char. OK!
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-10-08 14:34 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-22 18:09 [PATCH 0/2] hppa updates deller
2025-01-22 18:09 ` [PATCH 1/2] hw/hppa: Support up to 256 GiB RAM on 64-bit machines deller
2025-01-24 17:49 ` Richard Henderson
2025-01-24 17:52 ` Philippe Mathieu-Daudé
2025-01-24 18:18 ` Helge Deller
2025-01-22 18:09 ` [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd deller
2025-01-24 17:49 ` Richard Henderson
2025-10-08 13:43 ` Philippe Mathieu-Daudé
2025-10-08 13:49 ` Helge Deller
2025-10-08 14:33 ` Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).