From nobody Fri May 17 09:18:28 2024 Delivered-To: importer@patchew.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 16438417927956.181005992978157; Wed, 2 Feb 2022 14:43:12 -0800 (PST) Received: from localhost ([::1]:58992 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nFOLI-000653-5Q for importer@patchew.org; Wed, 02 Feb 2022 17:43:12 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39924) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nFOEJ-0008UB-At for qemu-devel@nongnu.org; Wed, 02 Feb 2022 17:35:59 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:50179) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nFOEA-0004QJ-69 for qemu-devel@nongnu.org; Wed, 02 Feb 2022 17:35:59 -0500 Received: from quad ([82.142.10.94]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M3DFj-1nE1BH310X-003adr; Wed, 02 Feb 2022 23:35:30 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Subject: [PATCH 1/3] m68k: bootinfo entry size must be aligned on 4 bytes Date: Wed, 2 Feb 2022 23:35:26 +0100 Message-Id: <20220202223528.1260154-2-laurent@vivier.eu> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220202223528.1260154-1-laurent@vivier.eu> References: <20220202223528.1260154-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:Ad8dPBU+fBCiMPztLBkTpurOfIneJv0+xfA9r3NqTOA+BnXACjJ 61viPx633afRtmadoLODLd0x3cu4uVVExbxiW/CnG7+KmxqdAPfFMuHKQ8ixO7P8PISTdLB 5nEf5Dm6pQSLuv2g5ZkElEsSsRmE/3OHFnUUVCsnZL52JBSr5nw9O3Yemzhb21fUPqGnKiO lH7haWc828KczPkWo7Fbg== X-UI-Out-Filterresults: notjunk:1;V03:K0:1P6g87Jkzj8=:1aCBTEGZfkeB2jpIIWpkWo sYirAi+RoH7W7LWuzZ1iDsxAYkyPhjzo97fJGAf/ku7/tIr6enFrU3UBhEB1bce4usbX45hyR 6JWO2BEeXhWNO5cTmKepFgLF/5HhkxKCZGWRUDz1XAdmktRJr6rrhdSyqv0Ti/uqSiWdjEwkZ m5FDgCM6xfcMF/pea0yORo5k43l2Z3caEoR12Dc6ot43ISnC5h3oFcCmHZ2RzOEQqbKTPZ3xu 1NXDWeU/ZikCliYRVzEJrF/9szHDYjeodtui5XFnrqn89EvyKTBAxcp8KQj7SCWByuNqGfal9 u/eedP5X1hF9QkoUB0/bsShf6q6sAI6wae7zhmJaoph3AT5V8qzOtFSXnWt4ltYnrPPOK8ldX zZmoV2TqMlgHUBCLIgeHl9GZ6wh1hDzP98dXU9d41TZ4Ojrqh3ELZr16Rjd7tSovYnJABxp6f Apwj+ofD97ociiaLN1B1QR9p7dXxTFowl4wlMIIUT+Fz00HNQ/Skzdkr7WGUQfCGqUYg2skk9 XuGN6tn6b8thVQQiw/hvb5kXP1JFKtbQnaXtDVblfOI3vlUtwIogow978pwfZ9Oq0/DAmzvzh APNw0WWDe46qBZOiIDeB67EIOXw19FCTgMlIa8LSPsN35bU/hGAB35VPIIb8FgoiZyOI8mLz3 SRJwkkJQxbNt061E0lOlCkb3JLht4xxKdJPuseS8T5fhD1tCoj0qEe2aP4ny+FwKvGos= 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; Received-SPF: none client-ip=212.227.17.24; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01, T_SPF_HELO_TEMPERROR=0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1643841794616100001 Content-Type: text/plain; charset="utf-8" This is checked by petitboot. Signed-off-by: Laurent Vivier --- hw/m68k/bootinfo.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/m68k/bootinfo.h b/hw/m68k/bootinfo.h index adbf0c5521e5..94c97a71fa07 100644 --- a/hw/m68k/bootinfo.h +++ b/hw/m68k/bootinfo.h @@ -48,12 +48,12 @@ stw_phys(as, base, id); \ base +=3D 2; \ stw_phys(as, base, \ - (sizeof(struct bi_record) + strlen(string) + 2) & ~1); \ + (sizeof(struct bi_record) + strlen(string) + 4) & ~3); \ base +=3D 2; \ for (i =3D 0; string[i]; i++) { \ stb_phys(as, base++, string[i]); \ } \ stb_phys(as, base++, 0); \ - base =3D (parameters_base + 1) & ~1; \ + base =3D (parameters_base + 4) & ~3; \ } while (0) #endif --=20 2.34.1 From nobody Fri May 17 09:18:28 2024 Delivered-To: importer@patchew.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 1643841581372460.25184512129965; Wed, 2 Feb 2022 14:39:41 -0800 (PST) Received: from localhost ([::1]:53656 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nFOHs-0002Nw-E4 for importer@patchew.org; Wed, 02 Feb 2022 17:39:40 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39904) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nFOEG-0008Q6-AE for qemu-devel@nongnu.org; Wed, 02 Feb 2022 17:35:56 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:58309) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nFOEA-0004QV-43 for qemu-devel@nongnu.org; Wed, 02 Feb 2022 17:35:56 -0500 Received: from quad ([82.142.10.94]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MkHIV-1mV66c0gCP-00kehX; Wed, 02 Feb 2022 23:35:31 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Subject: [PATCH 2/3] m68k: virt: add a bootstrap ROM Date: Wed, 2 Feb 2022 23:35:27 +0100 Message-Id: <20220202223528.1260154-3-laurent@vivier.eu> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220202223528.1260154-1-laurent@vivier.eu> References: <20220202223528.1260154-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:O0kJ/8Qxq4rAB0Q884YqrGJd/+wNoqvxnOatJDdJ+pqL7SK+Shb vcoY0ESnGxYszuJT528b3PFSsiDzRsqjcmo3jyhkytyzLLdk7Cf7oja5vKXp0J1RI9eeMFi qVyfvRwxsIB54CGQX1h619A1dyL/8W4Z6YJPR4eb29nhweEgTKsGl52titA1onCGTb4ppdT 8YCkWqrVDbhMU6/V1aOPQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:ZbCPHpKiAog=:cZymHe5qcv0C3t4V7DXvCM aQVvRr0bYUpG6v5iD8autrDRZ8sbHunxhDBbIVLcFfRjhJXQOXMOwNAywqgqYwyf2xiriuCWo qFUyttwdTF/39E0TF/eRhLl7MYgNaSSryi8N77IU4nI3vcJpiXv1flnReHo+fqABn+j7n/Znx 0RWougdMB0E4hIctIyDS2HLg6BZ7nYEX0tREU+g6kiKlDICabbgZSDLK9rdNet0XNUtK8jKLG 7e7b1oB1TTWKAbdcjhQQgzAhESOa7AiVw8xZGSVqgkZDMyh3S5V2KJ9sUJd56SUw8IRagudZr tAJ8Vcl7PjDEdB7aR3mFUfV0y8SGLYphHHwezAXY4w0fjB8WMTtaLBOoq6JZV9XBC6JZccVR8 fxWb8s+SOT0xEtaMntC/CppkMDgGjzv/emtRhaRMRGRhofPf1sFRMVeh83UcqX5phYmFeT98O 4b8KTzrOgVxQ2NOLeiiT/lG+APJYaRFhM1VbniZD8GOySZGsZpoJ08q9lCDvJBAnQsVZXC7Hs G0y8mkOJ48sVMzsMtoxyhkITTxdKuzWZmsqvVSqgj/WtxUG377ibZWvXzJX+miRIJ1WW2BmAy ywXHNm77hxdBMUAAyQdH+7uy296voROpqsdtA1MrXiSbV8l/x6a7RDFDI9E3Cnly8QfVa392Y GKdpRKCQ0/zIUD3z+srLa3Av8PMvw1uKTullKfHDy+pNermhGUZ3IT5AJSzcEBnNcQ0Y= 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; Received-SPF: none client-ip=212.227.17.10; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1643841583400100001 Content-Type: text/plain; charset="utf-8" This ROM will be started by QEMU and will load the firmware. The firware will be based on Petit Boot, the aim of the bootstrap is to ask QEMU to load the kernel and initramfs to the RAM. It also builds the bootinfo structure to pass to the kernel the same way QEMU does when it loads directly the kernel. To build the bootstrap: $ git submodule init roms/m68k-virt $ git submodule updage roms/m68k-virt $ make -C roms m68k-virt-bootrom Signed-off-by: Laurent Vivier --- hw/m68k/virt.c | 32 ++++++++++++++++++++++++++++++++ .gitmodules | 3 +++ pc-bios/meson.build | 1 + roms/Makefile | 7 +++++++ roms/m68k-virt | 1 + 5 files changed, 44 insertions(+) create mode 160000 roms/m68k-virt diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c index bbaf630bbf20..11aff6d93865 100644 --- a/hw/m68k/virt.c +++ b/hw/m68k/virt.c @@ -10,6 +10,7 @@ #include "qemu/osdep.h" #include "qemu/units.h" #include "qemu-common.h" +#include "qemu/datadir.h" #include "sysemu/sysemu.h" #include "cpu.h" #include "hw/boards.h" @@ -85,6 +86,13 @@ #define VIRT_VIRTIO_MMIO_BASE 0xff010000 /* MMIO: 0xff010000 - 0xff01f= fff */ #define VIRT_VIRTIO_IRQ_BASE PIC_IRQ(2, 1) /* PIC: 2, 3, 4, 5, IRQ: ALL = */ =20 +/* + * At the end of the memory address space we have a 1 MB ROM + */ +#define VIRT_ROM_ADDR 0xfff00000 +#define VIRT_ROM_SIZE 0x00100000 +#define VIRT_ROM_NAME "m68k-virt.rom" + typedef struct { M68kCPU *cpu; hwaddr initial_pc; @@ -113,12 +121,16 @@ static void virt_init(MachineState *machine) const char *kernel_filename =3D machine->kernel_filename; const char *initrd_filename =3D machine->initrd_filename; const char *kernel_cmdline =3D machine->kernel_cmdline; + const char *bios_name =3D machine->firmware ?: VIRT_ROM_NAME; hwaddr parameters_base; DeviceState *dev; DeviceState *irqc_dev; DeviceState *pic_dev[VIRT_GF_PIC_NB]; SysBusDevice *sysbus; hwaddr io_base; + MemoryRegion *rom; + int bios_size; + char *filename; int i; ResetInfo *reset_info; =20 @@ -207,6 +219,19 @@ static void virt_init(MachineState *machine) io_base +=3D 0x200; } =20 + /* Load ROM */ + filename =3D qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); + if (filename) { + rom =3D g_malloc(sizeof(*rom)); + memory_region_init_rom(rom, NULL, "m68k-virt.rom", VIRT_ROM_SIZE, + &error_abort); + memory_region_add_subregion(get_system_memory(), VIRT_ROM_ADDR, ro= m); + bios_size =3D load_image_targphys(filename, VIRT_ROM_ADDR, VIRT_RO= M_SIZE); + } else { + bios_size =3D -1; + } + + /* Load kernel if needed */ if (kernel_filename) { CPUState *cs =3D CPU(cpu); uint64_t high; @@ -265,6 +290,13 @@ static void virt_init(MachineState *machine) initrd_size =3D 0; } BOOTINFO0(cs->as, parameters_base, BI_LAST); + } else { + if (bios_size !=3D VIRT_ROM_SIZE) { + error_report("ROM not found (%s) and no kernel provided", + bios_name); + exit(EXIT_FAILURE); + } + reset_info->initial_pc =3D VIRT_ROM_ADDR; } } =20 diff --git a/.gitmodules b/.gitmodules index 84425d87e28a..315d597d057a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -67,3 +67,6 @@ [submodule "tests/lcitool/libvirt-ci"] path =3D tests/lcitool/libvirt-ci url =3D http://gitlab.com/libvirt/libvirt-ci +[submodule "roms/m68k-virt"] + path =3D roms/m68k-virt + url =3D https://github.com/vivier/m68k-virt-bootstrap.git diff --git a/pc-bios/meson.build b/pc-bios/meson.build index 4ac7a5509b69..ffec6decdc4c 100644 --- a/pc-bios/meson.build +++ b/pc-bios/meson.build @@ -81,6 +81,7 @@ blobs =3D files( 'opensbi-riscv32-generic-fw_dynamic.bin', 'opensbi-riscv64-generic-fw_dynamic.bin', 'npcm7xx_bootrom.bin', + 'm68k-virt.rom', ) =20 if get_option('install_blobs') diff --git a/roms/Makefile b/roms/Makefile index 5e44d9789001..f9f84e8efb1b 100644 --- a/roms/Makefile +++ b/roms/Makefile @@ -40,6 +40,7 @@ powerpc_cross_prefix :=3D $(call find-cross-prefix,powerp= c) x86_64_cross_prefix :=3D $(call find-cross-prefix,x86_64) riscv32_cross_prefix :=3D $(call find-cross-prefix,riscv32) riscv64_cross_prefix :=3D $(call find-cross-prefix,riscv64) +m68k_cross_prefix :=3D $(call find-cross-prefix,m68k) =20 # tag our seabios builds SEABIOS_EXTRAVERSION=3D"-prebuilt.qemu.org" @@ -69,6 +70,7 @@ default help: @echo " opensbi32-generic -- update OpenSBI for 32-bit generic machine" @echo " opensbi64-generic -- update OpenSBI for 64-bit generic machine" @echo " qboot -- update qboot" + @echo " m68k-virt-bootrom -- update m68k-virt bootrom" @echo " clean -- delete the files generated by the previous= " \ "build targets" =20 @@ -197,6 +199,10 @@ npcm7xx_bootrom: $(MAKE) -C vbootrom CROSS_COMPILE=3D$(arm_cross_prefix) cp vbootrom/npcm7xx_bootrom.bin ../pc-bios/npcm7xx_bootrom.bin =20 +m68k-virt-bootrom: + $(MAKE) -C m68k-virt CROSS_COMPILE=3D$(m68k_cross_prefix) + cp m68k-virt/rom.bin ../pc-bios/m68k-virt.rom + clean: rm -rf seabios/.config seabios/out seabios/builds $(MAKE) -C sgabios clean @@ -211,3 +217,4 @@ clean: $(MAKE) -C opensbi clean $(MAKE) -C qboot clean $(MAKE) -C vbootrom clean + $(MAKE) -C m68k-virt clean diff --git a/roms/m68k-virt b/roms/m68k-virt new file mode 160000 index 000000000000..f2a4daa7cd11 --- /dev/null +++ b/roms/m68k-virt @@ -0,0 +1 @@ +Subproject commit f2a4daa7cd11d35fa48236653211897b50977144 --=20 2.34.1 From nobody Fri May 17 09:18:28 2024 Delivered-To: importer@patchew.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 1643841580362140.9903403295341; Wed, 2 Feb 2022 14:39:40 -0800 (PST) Received: from localhost ([::1]:53380 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nFOHp-0002Cr-Mp for importer@patchew.org; Wed, 02 Feb 2022 17:39:37 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39882) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nFOEF-0008Pq-5T for qemu-devel@nongnu.org; Wed, 02 Feb 2022 17:35:55 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:44285) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nFOEA-0004RF-20 for qemu-devel@nongnu.org; Wed, 02 Feb 2022 17:35:54 -0500 Received: from quad ([82.142.10.94]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1N1Ok1-1mD11U2J6x-012s4f; Wed, 02 Feb 2022 23:35:31 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Subject: [PATCH 3/3] m68k: virt: add a firmware (petitboot) Date: Wed, 2 Feb 2022 23:35:28 +0100 Message-Id: <20220202223528.1260154-4-laurent@vivier.eu> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220202223528.1260154-1-laurent@vivier.eu> References: <20220202223528.1260154-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:izDziK0JtG0Iu4KPKNkcBa1/EIxK66NSbrtNkI056vkrY5227NL sJX2WpMrEW4gAQ1svr3hK0xkewt0hkA9DLU4+uqOezjnKAopuT/yd9tb0YEgEf1pB5dvilP 7IE5uTze3X4+YyDMfjcxbUv2He/MkD34KXNl09e42zQXzLaCsKiafJtmPpwhW0ZKYuuVs3C 0D0gsOHoiNdfX127V7W6A== X-UI-Out-Filterresults: notjunk:1;V03:K0:RFzXA24dwUw=:d6P58QQPWA6KmA8gL4iLW+ lkIhTLzhKRd9OHet6SyFQ0NrPE14H8p8HqJQZd1Rn5BemNfPBPNjnRCPx7cBDAWCLYZVfxgeq BmH3xYsx4nglF8VoDlL6BlnZlyUQjo5NnVN3s4lHoelu1QAXFvS/kO810NGItDK9vmPowiB7c NLD8IozoTyQpXonO8sr9P6yz1hxoVIPG74wqgvUKAQFj//XDmCE1eUfNBqvGJI7BFHJrTMhGa HlupIl4NSDUQtbqQf3zBW2R/5dlA7sSM2bYbIMyq1YghbSqk1BNcvnZXMsPM6nb7Ha8ZtMdYU kFjsgjId5L3LPeuusVghxFjs3ZT3S88LRcljignqgWQZFa3qdIBHL/rC2XIbxJUbSvL4kHiZG ofrY4Gxbwqqi/t5I6L2Rql+93B7j6ZRBoT4FXHBZ10BHqtvrTB30QNye3KOVi4yAGCIRGX99+ uEIl1PByY+r4IHV2DK6XoGjwmFhg/B8A+myDJdSRHkmkJKFA4nRAhA6rMLYTMsOzXrd0GFLd7 bPl3NMsurHn2M2A5OCNhP4W9ldAZm2P8thiPg+oNM+g17+76Md3AJ59HoZPzBxdGMkMiG/20V YJ6Un6rauNHR+uFw3wtGj3oWaBsy/ex2OiV/Ew59rOXbrimn0CBm+BYOEfIp54Gcf+5tqbUmY yDWdqJqAL3HySaTzeV4aZlNeb7TsXN2xMMhMkGC6wVvMEmujFNGt9SLSuq8K+iJUzfxg= 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; Received-SPF: none client-ip=212.227.17.24; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1643841583438100003 Content-Type: text/plain; charset="utf-8" Add a firmware for the m68k virt machine The firmware is based on petit boot (also used in bare metal POWER systems) Petit boot is embedded in a buildroot filesystem. This patch define the buildroot repository, add make targets to build and install the kernel and filesystem produced by buildroot. To build the firmware: $ git submodule init roms/buildroot $ git submodule update roms/buildroot $ make -C roms m68k-virt-firmware Signed-off-by: Laurent Vivier --- configure | 3 +- include/hw/misc/virt_ctrl.h | 6 ++ hw/m68k/virt.c | 12 +++- hw/misc/virt_ctrl.c | 111 +++++++++++++++++++++++++++++++++++- .gitmodules | 3 + pc-bios/meson.build | 2 + roms/Makefile | 8 +++ roms/buildroot | 1 + 8 files changed, 140 insertions(+), 6 deletions(-) create mode 160000 roms/buildroot diff --git a/configure b/configure index e6cfc0e4be6c..5cc3d7029455 100755 --- a/configure +++ b/configure @@ -3685,7 +3685,8 @@ for bios_file in \ $source_path/pc-bios/openbios-* \ $source_path/pc-bios/u-boot.* \ $source_path/pc-bios/palcode-* \ - $source_path/pc-bios/qemu_vga.ndrv + $source_path/pc-bios/qemu_vga.ndrv \ + $source_path/pc-bios/m68k-virt.* =20 do LINKS=3D"$LINKS pc-bios/$(basename $bios_file)" diff --git a/include/hw/misc/virt_ctrl.h b/include/hw/misc/virt_ctrl.h index 25a237e51874..e1a3f027ab03 100644 --- a/include/hw/misc/virt_ctrl.h +++ b/include/hw/misc/virt_ctrl.h @@ -17,6 +17,12 @@ struct VirtCtrlState { qemu_irq irq; =20 uint32_t irq_enabled; + + MachineState *machine; + char *fw_elf; + char *fw_ramfs; + uint32_t fw_bootinfo_size; + uint8_t *fw_bootinfo; }; =20 #endif diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c index 11aff6d93865..d6af84d1a3f6 100644 --- a/hw/m68k/virt.c +++ b/hw/m68k/virt.c @@ -89,9 +89,11 @@ /* * At the end of the memory address space we have a 1 MB ROM */ -#define VIRT_ROM_ADDR 0xfff00000 -#define VIRT_ROM_SIZE 0x00100000 -#define VIRT_ROM_NAME "m68k-virt.rom" +#define VIRT_ROM_ADDR 0xfff00000 +#define VIRT_ROM_SIZE 0x00100000 +#define VIRT_ROM_NAME "m68k-virt.rom" +#define VIRT_FW_ELF_NAME "m68k-virt.vmlinux" +#define VIRT_FW_RAMFS_NAME "m68k-virt.petitboot" =20 typedef struct { M68kCPU *cpu; @@ -202,6 +204,10 @@ static void virt_init(MachineState *machine) =20 /* virt controller */ dev =3D qdev_new(TYPE_VIRT_CTRL); + object_property_set_link(OBJECT(dev), "machine", OBJECT(machine), + &error_abort); + qdev_prop_set_string(dev, "fw.elf", VIRT_FW_ELF_NAME); + qdev_prop_set_string(dev, "fw.ramfs", VIRT_FW_RAMFS_NAME); sysbus =3D SYS_BUS_DEVICE(dev); sysbus_realize_and_unref(sysbus, &error_fatal); sysbus_mmio_map(sysbus, 0, VIRT_CTRL_MMIO_BASE); diff --git a/hw/misc/virt_ctrl.c b/hw/misc/virt_ctrl.c index e75d1e7e17b3..2ac725f1570b 100644 --- a/hw/misc/virt_ctrl.c +++ b/hw/misc/virt_ctrl.c @@ -5,28 +5,98 @@ */ =20 #include "qemu/osdep.h" +#include "qemu/datadir.h" #include "hw/qdev-properties.h" #include "hw/sysbus.h" +#include "hw/loader.h" +#include "hw/boards.h" #include "migration/vmstate.h" #include "qemu/log.h" #include "trace.h" +#include "elf.h" #include "sysemu/runstate.h" #include "hw/misc/virt_ctrl.h" =20 enum { REG_FEATURES =3D 0x00, REG_CMD =3D 0x04, + REG_PARAM =3D 0x08, }; =20 #define FEAT_POWER_CTRL 0x00000001 +#define FEAT_FW_CTRL 0x00000002 + +#define FEAT_SUPPORTED (FEAT_POWER_CTRL | FEAT_FW_CTRL) =20 enum { + /* Power Control */ CMD_NOOP, CMD_RESET, CMD_HALT, CMD_PANIC, + /* Firmware Control */ + CMD_FW_MACHINE_ID, + CMD_FW_LOAD, + CMD_FW_RAMSIZE, + CMD_FW_QEMU_VERSION +}; + +enum { + FW_M68K, }; =20 +static uint32_t param; + +#define RESULT_ERROR (-1) + +static uint32_t fw_load_m68k(VirtCtrlState *s) +{ + char *elf_filename, *ramfs_filename; + int32_t kernel_size; + uint64_t elf_entry, high; + int32_t ramfs_size; + ram_addr_t ramfs_base; + void *ram_ptr; + + elf_filename =3D qemu_find_file(QEMU_FILE_TYPE_BIOS, s->fw_elf); + if (elf_filename =3D=3D NULL) { + error_report("Cannot find %s", s->fw_elf); + return RESULT_ERROR; + } + ramfs_filename =3D qemu_find_file(QEMU_FILE_TYPE_BIOS, s->fw_ramfs); + if (ramfs_filename =3D=3D NULL) { + error_report("Cannot find %s", s->fw_ramfs); + return RESULT_ERROR; + } + + kernel_size =3D load_elf_ram(elf_filename, NULL, NULL, NULL, + &elf_entry, NULL, &high, NULL, 1, + EM_68K, 0, 0, NULL, false); + if (kernel_size < 0) { + error_report("could not load kernel '%s'", elf_filename); + return RESULT_ERROR; + } + + ramfs_size =3D get_image_size(ramfs_filename); + if (ramfs_size < 0) { + error_report("could not load initial ram disk '%s'", + ramfs_filename); + return RESULT_ERROR; + } + + ram_ptr =3D memory_region_get_ram_ptr(s->machine->ram); + + ramfs_base =3D (s->machine->ram_size - ramfs_size) & ~0xfff; + load_image_size(ramfs_filename, ram_ptr + ramfs_base, ramfs_size); + + high =3D (high + 1) & ~1; + *(uint32_t *)(ram_ptr + high) =3D cpu_to_be32(elf_entry); + *(uint32_t *)(ram_ptr + high + 4) =3D cpu_to_be32(ramfs_base); + *(uint32_t *)(ram_ptr + high + 8) =3D cpu_to_be32(ramfs_size); + + return high; +} + static uint64_t virt_ctrl_read(void *opaque, hwaddr addr, unsigned size) { VirtCtrlState *s =3D opaque; @@ -34,7 +104,10 @@ static uint64_t virt_ctrl_read(void *opaque, hwaddr add= r, unsigned size) =20 switch (addr) { case REG_FEATURES: - value =3D FEAT_POWER_CTRL; + value =3D FEAT_SUPPORTED; + break; + case REG_PARAM: + value =3D param; break; default: qemu_log_mask(LOG_UNIMP, @@ -43,7 +116,7 @@ static uint64_t virt_ctrl_read(void *opaque, hwaddr addr= , unsigned size) break; } =20 - trace_virt_ctrl_write(s, addr, size, value); + trace_virt_ctrl_read(s, addr, size, value); =20 return value; } @@ -69,8 +142,32 @@ static void virt_ctrl_write(void *opaque, hwaddr addr, = uint64_t value, case CMD_PANIC: qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_PANIC); break; + case CMD_FW_LOAD: + switch (param) { + case FW_M68K: + param =3D fw_load_m68k(s); + break; + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented FW type %d\n", + __func__, param); + break; + } + break; + case CMD_FW_RAMSIZE: + param =3D s->machine->ram_size; + break; + case CMD_FW_QEMU_VERSION: + param =3D (QEMU_VERSION_MAJOR << 24) | (QEMU_VERSION_MINOR << = 16) | + (QEMU_VERSION_MICRO << 8); + break; + case CMD_FW_MACHINE_ID: + param =3D 0; + break; } break; + case REG_PARAM: + param =3D value; + break; default: qemu_log_mask(LOG_UNIMP, "%s: unimplemented register write 0x%02"HWADDR_PRIx"= \n", @@ -114,6 +211,14 @@ static const VMStateDescription vmstate_virt_ctrl =3D { } }; =20 +static Property virt_ctl_properties[] =3D { + DEFINE_PROP_LINK("machine", VirtCtrlState, machine, + TYPE_MACHINE, MachineState *), + DEFINE_PROP_STRING("fw.elf", VirtCtrlState, fw_elf), + DEFINE_PROP_STRING("fw.ramfs", VirtCtrlState, fw_ramfs), + DEFINE_PROP_END_OF_LIST(), +}; + static void virt_ctrl_instance_init(Object *obj) { SysBusDevice *dev =3D SYS_BUS_DEVICE(obj); @@ -132,6 +237,8 @@ static void virt_ctrl_class_init(ObjectClass *oc, void = *data) dc->reset =3D virt_ctrl_reset; dc->realize =3D virt_ctrl_realize; dc->vmsd =3D &vmstate_virt_ctrl; + + device_class_set_props(dc, virt_ctl_properties); } =20 static const TypeInfo virt_ctrl_info =3D { diff --git a/.gitmodules b/.gitmodules index 315d597d057a..b45269f896cf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -70,3 +70,6 @@ [submodule "roms/m68k-virt"] path =3D roms/m68k-virt url =3D https://github.com/vivier/m68k-virt-bootstrap.git +[submodule "roms/buildroot"] + path =3D roms/buildroot + url =3D https://github.com/vivier/buildroot.git diff --git a/pc-bios/meson.build b/pc-bios/meson.build index ffec6decdc4c..c94b63d17d7b 100644 --- a/pc-bios/meson.build +++ b/pc-bios/meson.build @@ -82,6 +82,8 @@ blobs =3D files( 'opensbi-riscv64-generic-fw_dynamic.bin', 'npcm7xx_bootrom.bin', 'm68k-virt.rom', + 'm68k-virt.vmlinux', + 'm68k-virt.petitboot', ) =20 if get_option('install_blobs') diff --git a/roms/Makefile b/roms/Makefile index f9f84e8efb1b..8275083444ef 100644 --- a/roms/Makefile +++ b/roms/Makefile @@ -71,6 +71,7 @@ default help: @echo " opensbi64-generic -- update OpenSBI for 64-bit generic machine" @echo " qboot -- update qboot" @echo " m68k-virt-bootrom -- update m68k-virt bootrom" + @echo " m68k-virt-firmware -- update m68k-virt firmware (petitboot)" @echo " clean -- delete the files generated by the previous= " \ "build targets" =20 @@ -203,6 +204,12 @@ m68k-virt-bootrom: $(MAKE) -C m68k-virt CROSS_COMPILE=3D$(m68k_cross_prefix) cp m68k-virt/rom.bin ../pc-bios/m68k-virt.rom =20 +m68k-virt-firmware: + $(MAKE) -C buildroot qemu_m68k_virt_petitboot_defconfig + $(MAKE) -C buildroot -j $$(( $$(getconf _NPROCESSORS_ONLN) * 2 + 1)) + cp buildroot/output/images/vmlinux ../pc-bios/m68k-virt.vmlinux + cp buildroot/output/images/rootfs.cpio.xz ../pc-bios/m68k-virt.petitboot + clean: rm -rf seabios/.config seabios/out seabios/builds $(MAKE) -C sgabios clean @@ -218,3 +225,4 @@ clean: $(MAKE) -C qboot clean $(MAKE) -C vbootrom clean $(MAKE) -C m68k-virt clean + $(MAKE) -C buildroot clean diff --git a/roms/buildroot b/roms/buildroot new file mode 160000 index 000000000000..5590654699e4 --- /dev/null +++ b/roms/buildroot @@ -0,0 +1 @@ +Subproject commit 5590654699e4926bee834ae99f90c8062bc418eb --=20 2.34.1