qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: deller@kernel.org, qemu-devel@nongnu.org
Cc: Helge Deller <deller@gmx.de>,
	Richard Henderson <richard.henderson@linaro.org>
Subject: Re: [PATCH 2/2] hw/hppa: Fix booting Linux kernel with initrd
Date: Wed, 8 Oct 2025 15:43:02 +0200	[thread overview]
Message-ID: <8eb571a6-f48c-4083-85ef-3e92603c84d1@linaro.org> (raw)
In-Reply-To: <20250122180913.18667-3-deller@kernel.org>

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;
>   
>   /**



  parent reply	other threads:[~2025-10-08 13:44 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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é [this message]
2025-10-08 13:49     ` Helge Deller
2025-10-08 14:33       ` Philippe Mathieu-Daudé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8eb571a6-f48c-4083-85ef-3e92603c84d1@linaro.org \
    --to=philmd@linaro.org \
    --cc=deller@gmx.de \
    --cc=deller@kernel.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).