From nobody Thu Nov 13 14:54:33 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580700916707988.3619880315327; Sun, 2 Feb 2020 19:35:16 -0800 (PST) Received: from localhost ([::1]:33810 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iySW3-0000bQ-No for importer@patchew.org; Sun, 02 Feb 2020 22:35:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:50064) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iySRP-0002jB-6Q for qemu-devel@nongnu.org; Sun, 02 Feb 2020 22:30:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iySRN-0006nH-A4 for qemu-devel@nongnu.org; Sun, 02 Feb 2020 22:30:27 -0500 Received: from [107.174.27.60] (port=38980 helo=ozlabs.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1iySRL-0006kb-FN; Sun, 02 Feb 2020 22:30:24 -0500 Received: from fstn1-p1.ozlabs.ibm.com (localhost [IPv6:::1]) by ozlabs.ru (Postfix) with ESMTP id 2CC23AE807DE; Sun, 2 Feb 2020 22:28:30 -0500 (EST) From: Alexey Kardashevskiy To: qemu-devel@nongnu.org Subject: [PATCH qemu v6 5/6] spapr: Allow changing offset for -kernel image Date: Mon, 3 Feb 2020 14:29:42 +1100 Message-Id: <20200203032943.121178-6-aik@ozlabs.ru> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200203032943.121178-1-aik@ozlabs.ru> References: <20200203032943.121178-1-aik@ozlabs.ru> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 107.174.27.60 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Paolo Bonzini , qemu-ppc@nongnu.org, Alexey Kardashevskiy , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This allows moving the kernel in the guest memory. The option is useful for step debugging (as Linux is linked at 0x0); it also allows loading grub which is normally linked to run at 0x20000. This uses the existing kernel address by default. Signed-off-by: Alexey Kardashevskiy Reviewed-by: Fabiano Rosas --- include/hw/ppc/spapr.h | 1 + hw/ppc/spapr.c | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 3b50f36c338a..32e831a395ae 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -164,6 +164,7 @@ struct SpaprMachineState { void *fdt_blob; long kernel_size; bool kernel_le; + uint64_t kernel_addr; uint32_t initrd_base; long initrd_size; uint64_t rtc_offset; /* Now used only during incoming migration */ diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 60153bf0b771..b59e9dc360fe 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1054,7 +1054,7 @@ static void spapr_dt_chosen(SpaprMachineState *spapr,= void *fdt) } =20 if (spapr->kernel_size) { - uint64_t kprop[2] =3D { cpu_to_be64(KERNEL_LOAD_ADDR), + uint64_t kprop[2] =3D { cpu_to_be64(spapr->kernel_addr), cpu_to_be64(spapr->kernel_size) }; =20 _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel", @@ -1242,7 +1242,8 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool = reset, size_t space) /* Build memory reserve map */ if (reset) { if (spapr->kernel_size) { - _FDT((fdt_add_mem_rsv(fdt, KERNEL_LOAD_ADDR, spapr->kernel_siz= e))); + _FDT((fdt_add_mem_rsv(fdt, spapr->kernel_addr, + spapr->kernel_size))); } if (spapr->initrd_size) { _FDT((fdt_add_mem_rsv(fdt, spapr->initrd_base, @@ -1270,7 +1271,9 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool = reset, size_t space) =20 static uint64_t translate_kernel_address(void *opaque, uint64_t addr) { - return (addr & 0x0fffffff) + KERNEL_LOAD_ADDR; + SpaprMachineState *spapr =3D opaque; + + return (addr & 0x0fffffff) + spapr->kernel_addr; } =20 static void emulate_spapr_hypercall(PPCVirtualHypervisor *vhyp, @@ -2947,14 +2950,15 @@ static void spapr_machine_init(MachineState *machin= e) uint64_t lowaddr =3D 0; =20 spapr->kernel_size =3D load_elf(kernel_filename, NULL, - translate_kernel_address, NULL, + translate_kernel_address, spapr, NULL, &lowaddr, NULL, NULL, 1, PPC_ELF_MACHINE, 0, 0); if (spapr->kernel_size =3D=3D ELF_LOAD_WRONG_ENDIAN) { spapr->kernel_size =3D load_elf(kernel_filename, NULL, - translate_kernel_address, NULL, = NULL, + translate_kernel_address, spapr,= NULL, &lowaddr, NULL, NULL, 0, - PPC_ELF_MACHINE, 0, 0); + PPC_ELF_MACHINE, + 0, 0); spapr->kernel_le =3D spapr->kernel_size > 0; } if (spapr->kernel_size < 0) { @@ -2968,7 +2972,7 @@ static void spapr_machine_init(MachineState *machine) /* Try to locate the initrd in the gap between the kernel * and the firmware. Add a bit of space just in case */ - spapr->initrd_base =3D (KERNEL_LOAD_ADDR + spapr->kernel_size + spapr->initrd_base =3D (spapr->kernel_addr + spapr->kernel_size + 0x1ffff) & ~0xffff; spapr->initrd_size =3D load_image_targphys(initrd_filename, spapr->initrd_base, @@ -3214,6 +3218,18 @@ static void spapr_set_vsmt(Object *obj, Visitor *v, = const char *name, visit_type_uint32(v, name, (uint32_t *)opaque, errp); } =20 +static void spapr_get_kernel_addr(Object *obj, Visitor *v, const char *nam= e, + void *opaque, Error **errp) +{ + visit_type_uint64(v, name, (uint64_t *)opaque, errp); +} + +static void spapr_set_kernel_addr(Object *obj, Visitor *v, const char *nam= e, + void *opaque, Error **errp) +{ + visit_type_uint64(v, name, (uint64_t *)opaque, errp); +} + static char *spapr_get_ic_mode(Object *obj, Error **errp) { SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); @@ -3319,6 +3335,14 @@ static void spapr_instance_init(Object *obj) object_property_add_bool(obj, "vfio-no-msix-emulation", spapr_get_msix_emulation, NULL, NULL); =20 + object_property_add(obj, "kernel-addr", "uint64", spapr_get_kernel_add= r, + spapr_set_kernel_addr, NULL, &spapr->kernel_addr, + &error_abort); + object_property_set_description(obj, "kernel-addr", + stringify(KERNEL_LOAD_ADDR) + " for -kernel is the default", + NULL); + spapr->kernel_addr =3D KERNEL_LOAD_ADDR; /* The machine class defines the default interrupt controller mode */ spapr->irq =3D smc->irq; object_property_add_str(obj, "ic-mode", spapr_get_ic_mode, --=20 2.17.1