From: Eric Auger <eric.auger@linaro.org>
To: "Peter Crosthwaite" <peter.crosthwaite@xilinx.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Shannon Zhao" <shannon.zhao@linaro.org>,
"Alexander Graf" <agraf@suse.de>,
"Alex Bennée" <alex.bennee@linaro.org>
Cc: "qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PULL 20/22] hw/arm/boot: arm_load_kernel implemented as a machine init done notifier
Date: Fri, 12 Jun 2015 10:25:47 +0200 [thread overview]
Message-ID: <557A978B.1090701@linaro.org> (raw)
In-Reply-To: <CAEgOgz6b-bdpXqPDSqDTHdcTeV+QTroHX7nQ_0phP4GTnixixg@mail.gmail.com>
Hi Peter,
On 06/12/2015 04:54 AM, Peter Crosthwaite wrote:
> On Tue, Jun 2, 2015 at 9:33 AM, Peter Maydell <peter.maydell@linaro.org> wrote:
>> From: Eric Auger <eric.auger@linaro.org>
>>
>> Device tree nodes for the platform bus and its children dynamic sysbus
>> devices are added in a machine init done notifier. To load the dtb once,
>> after those latter nodes are built and before ROM freeze, the actual
>> arm_load_kernel existing code is moved into a notifier notify function,
>> arm_load_kernel_notify. arm_load_kernel now only registers the
>> corresponding notifier.
>>
>
> Does this work? I am experiencing a regression on this patch for
> xlnx-ep108 board.
Sorry for the inconvenience. On my side I tested it on virt board.
I am currently looking at the issue ...
Best Regards
Eric
I think it is because this is now delaying
> arm_load_kernel_notify call until after rom_load_all. From vl.c:
>
> if (rom_load_all() != 0) {
> fprintf(stderr, "rom loading failed\n");
> exit(1);
> }
>
> /* TODO: once all bus devices are qdevified, this should be done
> * when bus is created by qdev.c */
> qemu_register_reset(qbus_reset_all_fn, sysbus_get_default());
> qemu_run_machine_init_done_notifiers();
>
> the machine_init_done_notifiers are called after the rom_load_all()
> call which does the image loading. So the image-to-load registration
> is too late.
>
> Straight revert of this patch fixes the issue for me.
>
> Regards,
> Peter
>
>
>> Machine files that do not support platform bus stay unchanged. Machine
>> files willing to support dynamic sysbus devices must call arm_load_kernel
>> before sysbus-fdt arm_register_platform_bus_fdt_creator to make sure
>> dynamic sysbus device nodes are integrated in the dtb.
>>
>> Signed-off-by: Eric Auger <eric.auger@linaro.org>
>> Reviewed-by: Shannon Zhao <zhaoshenglong@huawei.com>
>> Reviewed-by: Alexander Graf <agraf@suse.de>
>> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
>> Message-id: 1433244554-12898-3-git-send-email-eric.auger@linaro.org
>> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
>> ---
>> hw/arm/boot.c | 14 +++++++++++++-
>> include/hw/arm/arm.h | 28 ++++++++++++++++++++++++++++
>> 2 files changed, 41 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
>> index fa69503..d036624 100644
>> --- a/hw/arm/boot.c
>> +++ b/hw/arm/boot.c
>> @@ -557,7 +557,7 @@ static void load_image_to_fw_cfg(FWCfgState *fw_cfg, uint16_t size_key,
>> fw_cfg_add_bytes(fw_cfg, data_key, data, size);
>> }
>>
>> -void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
>> +static void arm_load_kernel_notify(Notifier *notifier, void *data)
>> {
>> CPUState *cs;
>> int kernel_size;
>> @@ -568,6 +568,11 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
>> hwaddr entry, kernel_load_offset;
>> int big_endian;
>> static const ARMInsnFixup *primary_loader;
>> + ArmLoadKernelNotifier *n = DO_UPCAST(ArmLoadKernelNotifier,
>> + notifier, notifier);
>> + ARMCPU *cpu = n->cpu;
>> + struct arm_boot_info *info =
>> + container_of(n, struct arm_boot_info, load_kernel_notifier);
>>
>> /* CPU objects (unlike devices) are not automatically reset on system
>> * reset, so we must always register a handler to do so. If we're
>> @@ -775,3 +780,10 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
>> ARM_CPU(cs)->env.boot_info = info;
>> }
>> }
>> +
>> +void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
>> +{
>> + info->load_kernel_notifier.cpu = cpu;
>> + info->load_kernel_notifier.notifier.notify = arm_load_kernel_notify;
>> + qemu_add_machine_init_done_notifier(&info->load_kernel_notifier.notifier);
>> +}
>> diff --git a/include/hw/arm/arm.h b/include/hw/arm/arm.h
>> index 5c940eb..760804c 100644
>> --- a/include/hw/arm/arm.h
>> +++ b/include/hw/arm/arm.h
>> @@ -13,11 +13,21 @@
>>
>> #include "exec/memory.h"
>> #include "hw/irq.h"
>> +#include "qemu/notify.h"
>>
>> /* armv7m.c */
>> qemu_irq *armv7m_init(MemoryRegion *system_memory, int mem_size, int num_irq,
>> const char *kernel_filename, const char *cpu_model);
>>
>> +/*
>> + * struct used as a parameter of the arm_load_kernel machine init
>> + * done notifier
>> + */
>> +typedef struct {
>> + Notifier notifier; /* actual notifier */
>> + ARMCPU *cpu; /* handle to the first cpu object */
>> +} ArmLoadKernelNotifier;
>> +
>> /* arm_boot.c */
>> struct arm_boot_info {
>> uint64_t ram_size;
>> @@ -64,6 +74,8 @@ struct arm_boot_info {
>> * the user it should implement this hook.
>> */
>> void (*modify_dtb)(const struct arm_boot_info *info, void *fdt);
>> + /* machine init done notifier executing arm_load_dtb */
>> + ArmLoadKernelNotifier load_kernel_notifier;
>> /* Used internally by arm_boot.c */
>> int is_linux;
>> hwaddr initrd_start;
>> @@ -75,6 +87,22 @@ struct arm_boot_info {
>> */
>> bool firmware_loaded;
>> };
>> +
>> +/**
>> + * arm_load_kernel - Loads memory with everything needed to boot
>> + *
>> + * @cpu: handle to the first CPU object
>> + * @info: handle to the boot info struct
>> + * Registers a machine init done notifier that copies to memory
>> + * everything needed to boot, depending on machine and user options:
>> + * kernel image, boot loaders, initrd, dtb. Also registers the CPU
>> + * reset handler.
>> + *
>> + * In case the machine file supports the platform bus device and its
>> + * dynamically instantiable sysbus devices, this function must be called
>> + * before sysbus-fdt arm_register_platform_bus_fdt_creator. Indeed the
>> + * machine init done notifiers are called in registration reverse order.
>> + */
>> void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info);
>>
>> /* Multiplication factor to convert from system clock ticks to qemu timer
>> --
>> 1.9.1
>>
>>
next prev parent reply other threads:[~2015-06-12 8:26 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-02 16:33 [Qemu-devel] [PULL 00/22] target-arm queue Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 01/22] target-arm: Break down TLB_LOCKDOWN Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 02/22] target-arm: Add MAIR_EL2 Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 03/22] target-arm: Add TCR_EL2 Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 04/22] target-arm: Add SCTLR_EL2 Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 05/22] target-arm: Add TPIDR_EL2 Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 06/22] target-arm: Add TTBR0_EL2 Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 07/22] target-arm: Add TLBI_ALLE1{IS} Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 08/22] target-arm: Add TLBI_ALLE2 Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 09/22] target-arm: Add TLBI_VAE2{IS} Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 10/22] Revert "target-arm: Avoid g_hash_table_get_keys()" Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 11/22] target-arm: Add GIC phandle to VirtBoardInfo Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 12/22] arm_gicv2m: Add GICv2m widget to support MSIs Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 13/22] target-arm: Extend the gic node properties Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 14/22] target-arm: Add the GICv2m to the virt board Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 15/22] pl061: fix wrong calculation of GPIOMIS register Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 16/22] kvm: introduce kvm_arch_msi_data_to_gsi Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 17/22] arm_gicv2m: set kvm_gsi_direct_mapping and kvm_msi_via_irqfd_allowed Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 18/22] target-arm: Remove v8_ prefix from names of non-v8-specific cpreg arrays Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 19/22] hw/arm/sysbus-fdt: helpers for platform bus nodes addition Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 20/22] hw/arm/boot: arm_load_kernel implemented as a machine init done notifier Peter Maydell
2015-06-12 2:54 ` Peter Crosthwaite
2015-06-12 8:25 ` Eric Auger [this message]
2015-06-12 8:53 ` Eric Auger
2015-06-12 10:04 ` Peter Maydell
2015-06-12 18:04 ` Peter Crosthwaite
2015-06-12 18:06 ` Peter Maydell
2015-06-15 13:34 ` Eric Auger
2015-06-02 16:33 ` [Qemu-devel] [PULL 21/22] hw/arm/virt: add dynamic sysbus device support Peter Maydell
2015-06-02 16:33 ` [Qemu-devel] [PULL 22/22] hw/arm/virt: change indentation in a15memmap Peter Maydell
2015-06-04 10:44 ` [Qemu-devel] [PULL 00/22] target-arm queue Peter Maydell
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=557A978B.1090701@linaro.org \
--to=eric.auger@linaro.org \
--cc=agraf@suse.de \
--cc=alex.bennee@linaro.org \
--cc=peter.crosthwaite@xilinx.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=shannon.zhao@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.