From patchwork Mon Jun 24 22:11:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 11014261 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B860014BB for ; Mon, 24 Jun 2019 22:21:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A802F28820 for ; Mon, 24 Jun 2019 22:21:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9B9AE288D3; Mon, 24 Jun 2019 22:21:20 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B2D8728A9D for ; Mon, 24 Jun 2019 22:21:19 +0000 (UTC) Received: from localhost ([::1]:55014 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXKw-0008DV-Sr for patchwork-qemu-devel@patchwork.kernel.org; Mon, 24 Jun 2019 18:21:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58701) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXEK-0002I3-2A for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hfXEI-0008Rk-0C for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:27 -0400 Received: from esa2.hgst.iphmx.com ([68.232.143.124]:7981) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hfXEF-0008N2-VP; Mon, 24 Jun 2019 18:14:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1561414506; x=1592950506; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cxvsjHega0AjBNXAZrZeCS/bW018F0q+gG/5NT1Cho4=; b=AYw2FwmvE0b2JS8DwWlOsNuzes19FUbdlSMzxgZ4VH/odYw5chaLHboe eQWkdz5OEKnv4AZLrNfWUqnWvupoPogm1g8E0RfrO8wuArk7GrhkpPXS1 pbp3GP22cXxJUVPzFyuiIIjoDG1Jj2nlBQQFLn4fXNZAV9RY8VbwbbS25 gA8S9WEEWyf+xVDNem7/DGSJY0JwxHr4iwkeYnDa6Kg9qUOVo2OCZNqpP XFKV5ODRqjTvF8Fe/u6vGdesFjA5A/zuJT8ZywpJMdFViwSmlvV3R0Qkl WjN/FA7bxLvBaKFls/Sjx0u9VOwK2jvWF+e+BEejId5pDWxncXA27eHzz A==; X-IronPort-AV: E=Sophos;i="5.63,413,1557158400"; d="scan'208";a="211210895" Received: from h199-255-45-15.hgst.com (HELO uls-op-cesaep02.wdc.com) ([199.255.45.15]) by ob1.hgst.iphmx.com with ESMTP; 25 Jun 2019 06:14:57 +0800 IronPort-SDR: zvxhfm1QOXawx4DUmp3B+gqYVHCH3AL3ImNLGe/JlItoYUDHZT7vylTV4zlyRYBdkDiKKvFriF k1ppNziMTRgTB3t1Bp0gmyoMht7es5oTRIguft/qPenX8sLlcqakGlBlfRBh9S8WPfGbS3MIh4 I49PT3yat12vGhT3DPD+TnbeDnAgIXXsiAlUP8CUMfFGC3Xlmg2qd3M+3zpiFpGfnMQvN+/fGr Viox8M78Q7MPGTr2n35/o3b5WlIFHF5rUbLZMDqCaA0Js4BrcSAQZ1fV8CU6WcHqbyRPCHEHu0 8jd/9HHlg0xQpVle9Xb7AhcZ Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep02.wdc.com with ESMTP; 24 Jun 2019 15:13:36 -0700 IronPort-SDR: KN478tM02L8tPOl3Zb4kFUwjOerP/LHOvuk3EsC4zoT+vZ98lZKBwccSnbopnBPttvBiIhZ6yu FzKyVRpA/lCiJeUZ/rMisn0satzQYLo+Dz3IUMbQs6Ff24Fm2TktUIyKov5gjMZd0GjUbOIHMZ aDM/pgNmk4u5HsCcl5/EVlcFFqU3MIDOpbDMXoR2kv/Et9XOxL95h4V2IE7zvIYvBkMNzC0J+p 07LdEyJAms0aM5r2sWSnoj0qYM+xNN9zNi0ZdgrSpiOfjAncIXuHZBAT7uiJFmBqm5NIYKoHLh rLs= Received: from risc6-mainframe.sdcorp.global.sandisk.com (HELO risc6-mainframe.int.fusionio.com) ([10.196.157.140]) by uls-op-cesaip02.wdc.com with ESMTP; 24 Jun 2019 15:14:18 -0700 From: Alistair Francis To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Date: Mon, 24 Jun 2019 15:11:49 -0700 Message-Id: X-Mailer: git-send-email 2.22.0 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 68.232.143.124 Subject: [Qemu-devel] [PATCH v1 1/5] hw/riscv: Split out the boot functions 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: alistair23@gmail.com, palmer@sifive.com, alistair.francis@wdc.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Split the common RISC-V boot functions into a seperate file. This allows us to share the common code. Signed-off-by: Alistair Francis Reviewed-by: Bin Meng Tested-by: Bin Meng --- hw/riscv/Makefile.objs | 1 + hw/riscv/boot.c | 69 +++++++++++++++++++++++++++++++++++++++++ hw/riscv/sifive_e.c | 17 ++-------- hw/riscv/sifive_u.c | 17 ++-------- hw/riscv/spike.c | 21 +++---------- hw/riscv/virt.c | 51 +++--------------------------- include/hw/riscv/boot.h | 27 ++++++++++++++++ 7 files changed, 110 insertions(+), 93 deletions(-) create mode 100644 hw/riscv/boot.c create mode 100644 include/hw/riscv/boot.h diff --git a/hw/riscv/Makefile.objs b/hw/riscv/Makefile.objs index a65027304a..eb9d4f9ffc 100644 --- a/hw/riscv/Makefile.objs +++ b/hw/riscv/Makefile.objs @@ -1,3 +1,4 @@ +obj-y += boot.o obj-$(CONFIG_SPIKE) += riscv_htif.o obj-$(CONFIG_HART) += riscv_hart.o obj-$(CONFIG_SIFIVE_E) += sifive_e.o diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c new file mode 100644 index 0000000000..0c8e72e455 --- /dev/null +++ b/hw/riscv/boot.c @@ -0,0 +1,69 @@ +/* + * QEMU RISC-V Boot Helper + * + * Copyright (c) 2017 SiFive, Inc. + * Copyright (c) 2019 Alistair Francis + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2 or later, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#include "qemu/osdep.h" +#include "qemu/units.h" +#include "qemu/error-report.h" +#include "exec/cpu-defs.h" +#include "hw/loader.h" +#include "hw/riscv/boot.h" +#include "elf.h" + +target_ulong riscv_load_kernel(const char *kernel_filename) +{ + uint64_t kernel_entry, kernel_high; + + if (load_elf(kernel_filename, NULL, NULL, NULL, + &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0) < 0) { + error_report("could not load kernel '%s'", kernel_filename); + exit(1); + } + + return kernel_entry; +} + +hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, + uint64_t kernel_entry, hwaddr *start) +{ + int size; + + /* + * We want to put the initrd far enough into RAM that when the + * kernel is uncompressed it will not clobber the initrd. However + * on boards without much RAM we must ensure that we still leave + * enough room for a decent sized initrd, and on boards with large + * amounts of RAM we must avoid the initrd being so far up in RAM + * that it is outside lowmem and inaccessible to the kernel. + * So for boards with less than 256MB of RAM we put the initrd + * halfway into RAM, and for boards with 256MB of RAM or more we put + * the initrd at 128MB. + */ + *start = kernel_entry + MIN(mem_size / 2, 128 * MiB); + + size = load_ramdisk(filename, *start, mem_size - *start); + if (size == -1) { + size = load_image_targphys(filename, *start, mem_size - *start); + if (size == -1) { + error_report("could not load ramdisk '%s'", filename); + exit(1); + } + } + + return *start + size; +} diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c index 80ac56fa7d..9d58ae362b 100644 --- a/hw/riscv/sifive_e.c +++ b/hw/riscv/sifive_e.c @@ -44,10 +44,10 @@ #include "hw/riscv/sifive_prci.h" #include "hw/riscv/sifive_uart.h" #include "hw/riscv/sifive_e.h" +#include "hw/riscv/boot.h" #include "chardev/char.h" #include "sysemu/arch_init.h" #include "exec/address-spaces.h" -#include "elf.h" static const struct MemmapEntry { hwaddr base; @@ -74,19 +74,6 @@ static const struct MemmapEntry { [SIFIVE_E_DTIM] = { 0x80000000, 0x4000 } }; -static target_ulong load_kernel(const char *kernel_filename) -{ - uint64_t kernel_entry, kernel_high; - - if (load_elf(kernel_filename, NULL, NULL, NULL, - &kernel_entry, NULL, &kernel_high, - 0, EM_RISCV, 1, 0) < 0) { - error_report("could not load kernel '%s'", kernel_filename); - exit(1); - } - return kernel_entry; -} - static void sifive_mmio_emulate(MemoryRegion *parent, const char *name, uintptr_t offset, uintptr_t length) { @@ -131,7 +118,7 @@ static void riscv_sifive_e_init(MachineState *machine) memmap[SIFIVE_E_MROM].base, &address_space_memory); if (machine->kernel_filename) { - load_kernel(machine->kernel_filename); + riscv_load_kernel(machine->kernel_filename); } } diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index 5ecc47cea3..1b9281bd4a 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -41,11 +41,11 @@ #include "hw/riscv/sifive_uart.h" #include "hw/riscv/sifive_prci.h" #include "hw/riscv/sifive_u.h" +#include "hw/riscv/boot.h" #include "chardev/char.h" #include "sysemu/arch_init.h" #include "sysemu/device_tree.h" #include "exec/address-spaces.h" -#include "elf.h" #include @@ -65,19 +65,6 @@ static const struct MemmapEntry { #define GEM_REVISION 0x10070109 -static target_ulong load_kernel(const char *kernel_filename) -{ - uint64_t kernel_entry, kernel_high; - - if (load_elf(kernel_filename, NULL, NULL, NULL, - &kernel_entry, NULL, &kernel_high, - 0, EM_RISCV, 1, 0) < 0) { - error_report("could not load kernel '%s'", kernel_filename); - exit(1); - } - return kernel_entry; -} - static void create_fdt(SiFiveUState *s, const struct MemmapEntry *memmap, uint64_t mem_size, const char *cmdline) { @@ -280,7 +267,7 @@ static void riscv_sifive_u_init(MachineState *machine) create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline); if (machine->kernel_filename) { - load_kernel(machine->kernel_filename); + riscv_load_kernel(machine->kernel_filename); } /* reset vector */ diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c index 5b33d4be3b..e68be00a5f 100644 --- a/hw/riscv/spike.c +++ b/hw/riscv/spike.c @@ -36,12 +36,12 @@ #include "hw/riscv/riscv_hart.h" #include "hw/riscv/sifive_clint.h" #include "hw/riscv/spike.h" +#include "hw/riscv/boot.h" #include "chardev/char.h" #include "sysemu/arch_init.h" #include "sysemu/device_tree.h" #include "sysemu/qtest.h" #include "exec/address-spaces.h" -#include "elf.h" #include @@ -54,19 +54,6 @@ static const struct MemmapEntry { [SPIKE_DRAM] = { 0x80000000, 0x0 }, }; -static target_ulong load_kernel(const char *kernel_filename) -{ - uint64_t kernel_entry, kernel_high; - - if (load_elf_ram_sym(kernel_filename, NULL, NULL, NULL, - &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0, - NULL, true, htif_symbol_callback) < 0) { - error_report("could not load kernel '%s'", kernel_filename); - exit(1); - } - return kernel_entry; -} - static void create_fdt(SpikeState *s, const struct MemmapEntry *memmap, uint64_t mem_size, const char *cmdline) { @@ -199,7 +186,7 @@ static void spike_board_init(MachineState *machine) mask_rom); if (machine->kernel_filename) { - load_kernel(machine->kernel_filename); + riscv_load_kernel(machine->kernel_filename); } /* reset vector */ @@ -287,7 +274,7 @@ static void spike_v1_10_0_board_init(MachineState *machine) mask_rom); if (machine->kernel_filename) { - load_kernel(machine->kernel_filename); + riscv_load_kernel(machine->kernel_filename); } /* reset vector */ @@ -372,7 +359,7 @@ static void spike_v1_09_1_board_init(MachineState *machine) mask_rom); if (machine->kernel_filename) { - load_kernel(machine->kernel_filename); + riscv_load_kernel(machine->kernel_filename); } /* reset vector */ diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 84d94d0c42..5f8c11471b 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -34,13 +34,13 @@ #include "hw/riscv/sifive_clint.h" #include "hw/riscv/sifive_test.h" #include "hw/riscv/virt.h" +#include "hw/riscv/boot.h" #include "chardev/char.h" #include "sysemu/arch_init.h" #include "sysemu/device_tree.h" #include "exec/address-spaces.h" #include "hw/pci/pci.h" #include "hw/pci-host/gpex.h" -#include "elf.h" #include @@ -61,47 +61,6 @@ static const struct MemmapEntry { [VIRT_PCIE_ECAM] = { 0x30000000, 0x10000000 }, }; -static target_ulong load_kernel(const char *kernel_filename) -{ - uint64_t kernel_entry, kernel_high; - - if (load_elf(kernel_filename, NULL, NULL, NULL, - &kernel_entry, NULL, &kernel_high, - 0, EM_RISCV, 1, 0) < 0) { - error_report("could not load kernel '%s'", kernel_filename); - exit(1); - } - return kernel_entry; -} - -static hwaddr load_initrd(const char *filename, uint64_t mem_size, - uint64_t kernel_entry, hwaddr *start) -{ - int size; - - /* We want to put the initrd far enough into RAM that when the - * kernel is uncompressed it will not clobber the initrd. However - * on boards without much RAM we must ensure that we still leave - * enough room for a decent sized initrd, and on boards with large - * amounts of RAM we must avoid the initrd being so far up in RAM - * that it is outside lowmem and inaccessible to the kernel. - * So for boards with less than 256MB of RAM we put the initrd - * halfway into RAM, and for boards with 256MB of RAM or more we put - * the initrd at 128MB. - */ - *start = kernel_entry + MIN(mem_size / 2, 128 * MiB); - - size = load_ramdisk(filename, *start, mem_size - *start); - if (size == -1) { - size = load_image_targphys(filename, *start, mem_size - *start); - if (size == -1) { - error_report("could not load ramdisk '%s'", filename); - exit(1); - } - } - return *start + size; -} - static void create_pcie_irq_map(void *fdt, char *nodename, uint32_t plic_phandle) { @@ -422,13 +381,13 @@ static void riscv_virt_board_init(MachineState *machine) mask_rom); if (machine->kernel_filename) { - uint64_t kernel_entry = load_kernel(machine->kernel_filename); + uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename); if (machine->initrd_filename) { hwaddr start; - hwaddr end = load_initrd(machine->initrd_filename, - machine->ram_size, kernel_entry, - &start); + hwaddr end = riscv_load_initrd(machine->initrd_filename, + machine->ram_size, kernel_entry, + &start); qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start", start); qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end", diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h new file mode 100644 index 0000000000..f84fd6c2df --- /dev/null +++ b/include/hw/riscv/boot.h @@ -0,0 +1,27 @@ +/* + * QEMU RISC-V Boot Helper + * + * Copyright (c) 2017 SiFive, Inc. + * Copyright (c) 2019 Alistair Francis + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2 or later, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#ifndef RISCV_BOOT_H +#define RISCV_BOOT_H + +target_ulong riscv_load_kernel(const char *kernel_filename); +hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, + uint64_t kernel_entry, hwaddr *start); + +#endif /* RISCV_BOOT_H */ From patchwork Mon Jun 24 22:11:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 11014259 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2FFC41908 for ; Mon, 24 Jun 2019 22:21:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 20C1928820 for ; Mon, 24 Jun 2019 22:21:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1513928A75; Mon, 24 Jun 2019 22:21:20 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 9DDC0288D3 for ; Mon, 24 Jun 2019 22:21:19 +0000 (UTC) Received: from localhost ([::1]:55012 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXKv-0008Bm-1s for patchwork-qemu-devel@patchwork.kernel.org; Mon, 24 Jun 2019 18:21:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58736) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXEM-0002Iu-Ey for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hfXEJ-0008Sy-WB for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:30 -0400 Received: from esa2.hgst.iphmx.com ([68.232.143.124]:7987) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hfXEI-0008Pf-1r; Mon, 24 Jun 2019 18:14:27 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1561414510; x=1592950510; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=w9mKs3/llZzgCEUFHsRlhH28oN+q90K0BfyWypydsrs=; b=qM9wuNA9DuK3BjLsJWuAoyajq+8qbms5wCvq+zaQkl0ZhTmKY3vkQemz wzHv9Ar6FcfABTeY0DxqWyreGWlRfcZuz6fsMNHm5ZkpKbe9ByXoZ1sjV a+jWUbLhEyt4GJhsB15ANi85RJ0q/k9Jo3NCg7gChzn2WpnK/MVVNDcqD 7YGa932Nhca2EHuPlYf2ZeWjtXTKZsouybOwT+0AvST7a73c/Ogkn8cTy AyNCkbfuvRx5gxVIBSDDM4FNuKUv7AlWa6sWLJZxyvUtfmyUJS9mUiYMA axw7FEsWxteEfbWAzcK73xd7abUQeGFkN+ZOXBmr24kPwQypmndt9n3p8 Q==; X-IronPort-AV: E=Sophos;i="5.63,413,1557158400"; d="scan'208";a="211210897" Received: from h199-255-45-15.hgst.com (HELO uls-op-cesaep02.wdc.com) ([199.255.45.15]) by ob1.hgst.iphmx.com with ESMTP; 25 Jun 2019 06:15:02 +0800 IronPort-SDR: qFz5LZlw6f1KQpjgh4TCvjbYWKDIhZktKhloLo77jKAYoLiW7mmSrALif9z2PtdCY5aTGRsDwW m4GhmeR6qm9v6BpEAqEb4mS76g1lV3BA6aW4+q2FiQ5viAFbZxgyZrdRYE94bhr3E9vKZuu3w9 yuq9DSKrRdDPImyORwZMPXOt/nY7j0f0jM5kPxD6bZaJ4Ef4zGwky0P+4DJCnpvdxpiHv43ULZ sossB3QRnYxaW64VarCjX6fB3LbdLo1lHPRqmSw7//IWr/jPALsTMslPb1Og8noEddIfg/NvlU aypsfdEYBMbsG1dVoLAqIiw4 Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep02.wdc.com with ESMTP; 24 Jun 2019 15:13:39 -0700 IronPort-SDR: uLJTM63mlEOz8zNXDCnPSaNxfc8SWQVjEJPfUsVSAd3Vhmumiu84QRpQup5FcZhWtJAT4Z2FwD q4eLrLSNJdrTEiCs5BBSH70C5FaYYaSH9Hh5xmSwlu+wAmnXlgmIa9FTRDr7seZOFpKDomQ7um 5WdBHeSvcExbDoI2yWoqRSlWr5xy2VLA2kyJ68xsmJbbFM/r6PlR/R4ufFrkWhOTbypzxLXZb8 TV6rDg5s4s69I6Yanfdpa4dx+tGCtgdWOVIxPKNKLqbTe8jnkdZ++12zR6r0sO5VJcEo7Jr1Vq rnk= Received: from risc6-mainframe.sdcorp.global.sandisk.com (HELO risc6-mainframe.int.fusionio.com) ([10.196.157.140]) by uls-op-cesaip02.wdc.com with ESMTP; 24 Jun 2019 15:14:20 -0700 From: Alistair Francis To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Date: Mon, 24 Jun 2019 15:11:52 -0700 Message-Id: <03f453d45b8565472386fdb7403b6713ddbb8683.1561414240.git.alistair.francis@wdc.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 68.232.143.124 Subject: [Qemu-devel] [PATCH v1 2/5] hw/riscv: Add support for loading a firmware 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: alistair23@gmail.com, palmer@sifive.com, alistair.francis@wdc.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Add support for loading a firmware file for the virt machine and the SiFive U. This can be run with the following command: qemu-system-riscv64 -machine virt -bios fw_jump.bin -kernel vmlinux Signed-off-by: Alistair Francis Reviewed-by: Bin Meng Tested-by: Bin Meng --- hw/riscv/boot.c | 26 ++++++++++++++++++++++++++ hw/riscv/sifive_u.c | 4 ++++ hw/riscv/virt.c | 4 ++++ include/hw/riscv/boot.h | 2 ++ 4 files changed, 36 insertions(+) diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 0c8e72e455..883df49a0c 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -23,8 +23,34 @@ #include "exec/cpu-defs.h" #include "hw/loader.h" #include "hw/riscv/boot.h" +#include "hw/boards.h" #include "elf.h" +#if defined(TARGET_RISCV32) +# define KERNEL_BOOT_ADDRESS 0x80400000 +#else +# define KERNEL_BOOT_ADDRESS 0x80200000 +#endif + +target_ulong riscv_load_firmware(const char *firmware_filename, + hwaddr firmware_load_addr) +{ + uint64_t firmware_entry, firmware_start, firmware_end; + + if (load_elf(firmware_filename, NULL, NULL, NULL, &firmware_entry, + &firmware_start, &firmware_end, 0, EM_RISCV, 1, 0) > 0) { + return firmware_entry; + } + + if (load_image_targphys_as(firmware_filename, firmware_load_addr, + ram_size, NULL) > 0) { + return firmware_load_addr; + } + + error_report("could not load firmware '%s'", firmware_filename); + exit(1); +} + target_ulong riscv_load_kernel(const char *kernel_filename) { uint64_t kernel_entry, kernel_high; diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index 1b9281bd4a..a04f2d0754 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -266,6 +266,10 @@ static void riscv_sifive_u_init(MachineState *machine) /* create device tree */ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline); + if (machine->firmware) { + riscv_load_firmware(machine->firmware, memmap[SIFIVE_U_DRAM].base); + } + if (machine->kernel_filename) { riscv_load_kernel(machine->kernel_filename); } diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 5f8c11471b..7fcc8c03b5 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -380,6 +380,10 @@ static void riscv_virt_board_init(MachineState *machine) memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base, mask_rom); + if (machine->firmware) { + riscv_load_firmware(machine->firmware, memmap[VIRT_DRAM].base); + } + if (machine->kernel_filename) { uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename); diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index f84fd6c2df..daa179b600 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -20,6 +20,8 @@ #ifndef RISCV_BOOT_H #define RISCV_BOOT_H +target_ulong riscv_load_firmware(const char *firmware_filename, + hwaddr firmware_load_addr); target_ulong riscv_load_kernel(const char *kernel_filename); hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, uint64_t kernel_entry, hwaddr *start); From patchwork Mon Jun 24 22:11:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 11014253 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CC553186E for ; Mon, 24 Jun 2019 22:16:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BCF62288D0 for ; Mon, 24 Jun 2019 22:16:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B11DC288D8; Mon, 24 Jun 2019 22:16:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 89430288D3 for ; Mon, 24 Jun 2019 22:16:50 +0000 (UTC) Received: from localhost ([::1]:54988 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXGb-0004X4-Rd for patchwork-qemu-devel@patchwork.kernel.org; Mon, 24 Jun 2019 18:16:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58735) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXEM-0002Is-En for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hfXEK-0008TU-CU for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:30 -0400 Received: from esa2.hgst.iphmx.com ([68.232.143.124]:7981) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hfXEK-0008N2-33; Mon, 24 Jun 2019 18:14:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1561414512; x=1592950512; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=VSX/lTm1FfCnSq76Fl/EIw7/gylhHoPDOqjPWphv8bg=; b=XqGYR2sZ/d1wAwHOGLpzCIDHkDqFDy9dCyXU7gsMShVoZ1UnH3IlXPi4 2tVR/0a8BElNi+EpEey78rnNekndhA3G4kY+U6iWRL+ROUEZDRa4Zhcgg d5UtiisWeKRvxf/5TqAoq+HO8mUr2TUREseYo9dbdMphtehS1CsJRJmWy fDpG0rkfZK71eKdmTG/MRz5TMD78tbtVuV9otpr7EW6U2GKMaxjk5hD5y koUEvUBE9Lubc8GkffJCKM2H4eA+/iadofbwiD15SzYt6JhUyBpioba+W ERruE8PiZGuxqRvgU6OSCNslG+eR80tZX7EGJ7WX3vZjAFSIZSdG0zyRQ A==; X-IronPort-AV: E=Sophos;i="5.63,413,1557158400"; d="scan'208";a="211210911" Received: from h199-255-45-15.hgst.com (HELO uls-op-cesaep02.wdc.com) ([199.255.45.15]) by ob1.hgst.iphmx.com with ESMTP; 25 Jun 2019 06:15:05 +0800 IronPort-SDR: 8fDIrg/yh0nl3KRmnavelRJaNpJQ7/AVJjFbg1r3/2YJ5MnHEcfz4vC5EUTD6aydk9RZLhLm+u 4QIyqdWZk/EKSKXX+jsuvPx6yu+HcNq3cBfmwWCalTiANnjl1Owe+PTPGy2O0NZ2QTlJxk5KqN fEP3wePmwnZysjkuY02Z9DF5X0ZNCKA+q21Kw12Be5pOQBDLDxcN6VN9w9bCWrz6CIl6xehYqu IYHMogItIqjzYjhCFVSU6+EsoYcPlWcn5MyiJH4yUXnn0XZH1SFrr45XxvabqubFeovwgwa7uA xXvuDpnpwxQ64Vs4u3oWX9DN Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep02.wdc.com with ESMTP; 24 Jun 2019 15:13:41 -0700 IronPort-SDR: t9Mg3nqyYVmSibuFL+FLky+xBq+H1uCG1N76Bdlq6mJfekpLhqMyBCSQkX4emJLvG0EKi0tGgB Fthh/tsHBsWmxW4PuSXcAJ4oYEsk61VISu18IsD2XnfzZHgR079gYe1HQRaroT0G6PlE/EfGmG MGXdI2LbTiXn6oooSnVdz/yBy5knz2eCjyVr8LVhzoB1veaZ/KMiKIV/BwrSNA2uNM+PvI/YwD dex1UwITZ4+QiUmQkma7tPv4F7IOCIPtudyyOyAYpz2K6NEGWb2wJMHS3tUPX+2wUi3v+hjJ0W zng= Received: from risc6-mainframe.sdcorp.global.sandisk.com (HELO risc6-mainframe.int.fusionio.com) ([10.196.157.140]) by uls-op-cesaip01.wdc.com with ESMTP; 24 Jun 2019 15:14:23 -0700 From: Alistair Francis To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Date: Mon, 24 Jun 2019 15:11:54 -0700 Message-Id: <03cdfe700a884b52a9f6da0e50bc0693c9a61e03.1561414240.git.alistair.francis@wdc.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 68.232.143.124 Subject: [Qemu-devel] [PATCH v1 3/5] hw/riscv: Extend the kernel loading support 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: alistair23@gmail.com, palmer@sifive.com, alistair.francis@wdc.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Extend the RISC-V kernel loader to support Image and uImage files. A Linux kernel can now be booted with: qemu-system-riscv64 -machine virt -bios fw_jump.bin -kernel Image Signed-off-by: Alistair Francis Reviewed-by: Bin Meng Tested-by: Bin Meng --- hw/riscv/boot.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 883df49a0c..ff023f42d0 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -56,12 +56,22 @@ target_ulong riscv_load_kernel(const char *kernel_filename) uint64_t kernel_entry, kernel_high; if (load_elf(kernel_filename, NULL, NULL, NULL, - &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0) < 0) { - error_report("could not load kernel '%s'", kernel_filename); - exit(1); + &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0) > 0) { + return kernel_entry; } - return kernel_entry; + if (load_uimage_as(kernel_filename, &kernel_entry, NULL, NULL, + NULL, NULL, NULL) > 0) { + return kernel_entry; + } + + if (load_image_targphys_as(kernel_filename, KERNEL_BOOT_ADDRESS, + ram_size, NULL) > 0) { + return KERNEL_BOOT_ADDRESS; + } + + error_report("could not load kernel '%s'", kernel_filename); + exit(1); } hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, From patchwork Mon Jun 24 22:11:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 11014255 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 43E0F13AF for ; Mon, 24 Jun 2019 22:18:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2EA4B288D0 for ; Mon, 24 Jun 2019 22:18:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1DE372890C; Mon, 24 Jun 2019 22:18:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,LOTS_OF_MONEY,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D5FB6288D0 for ; Mon, 24 Jun 2019 22:17:57 +0000 (UTC) Received: from localhost ([::1]:54990 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXHh-0004wT-4L for patchwork-qemu-devel@patchwork.kernel.org; Mon, 24 Jun 2019 18:17:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58839) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXEY-0002Nn-E2 for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hfXEM-0008VM-GS for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:39 -0400 Received: from esa2.hgst.iphmx.com ([68.232.143.124]:7994) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hfXEK-0008SK-44; Mon, 24 Jun 2019 18:14:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1561414512; x=1592950512; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4d98c4aYEebYI2mmefzg35VGbuuJNmPVjraclHTzZpU=; b=SRUutnEpKA9WjqOBy3qgWeysdbF0ld3Y78gdNlPLBqNxK8UWeWdPtjAh hx/F6Dz7NEPCrY7eiujdZ0gWb+aP3WJk7N/8+TCo/HWlBMGUBpVfmsJ3+ HyiwfY2FjgiWUn1+wqFuNBNZY3r5G03sJpATqxhzEyy+3e3LXaBo8MbSE eA0u1nzyYtNaTQR5jR9LvEzVEmcBdDHYHAy1r3ak+cx1UHhuL9mazrlVW U9hnoKpQLlzAGXupbCYYcMFun0XLhEsjiNXNLIyw4cEJsc3Sc8B0tLSha 5G6LpcEs5l7ddDcfA/QCTJZvtRj1nP+69+rqBMeQCWP0WyfMJtTjZxnsz w==; X-IronPort-AV: E=Sophos;i="5.63,413,1557158400"; d="scan'208";a="211210924" Received: from h199-255-45-15.hgst.com (HELO uls-op-cesaep02.wdc.com) ([199.255.45.15]) by ob1.hgst.iphmx.com with ESMTP; 25 Jun 2019 06:15:09 +0800 IronPort-SDR: CouVEZRn9vVQXxrYmc1YAGOJxXicN+a4h4iDtVjalUoXK63oYAlz9wKu+KIujo/PoJzwYuCFRO HPuywmxKnVktanT0eAkVL3YHDsPfa8YXjX5talrH1anJZcrOfVeEmcciVxB76nQtLFcFDeOENj 1k9zDPdMtkoI2opJA8xXo9SPtpMRe1kucNJ1WNCNT9k28Oj+8wi3LXxcMa1zU972mcEislkzcc mhjCGl7t3jzmOjC0SVjZg1F5EQAqtFqRomxnL24AoHFUTLgfs7H/e9V9dOErUt/UmxSVlm1zjY hCoQ2PJFtk9c9ujXf+HiRd+O Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep02.wdc.com with ESMTP; 24 Jun 2019 15:13:44 -0700 IronPort-SDR: Y5IXKia0qUhPiCqT4gQidGMsjlo/V7Dxa0RRwmfUJDB1ajZTunsXuBSIoQIQjh03uU/bOjIzfV 2g6DMTYmtvWAWZm+GD/f3RWVWvgYbGvnk0eEAlDBG4RYf5YZ7T0TEYg4NUIwy4ldJab0Y7NCUt AZQ9VbtM7Lgx2FkbeIIjPmxtRVeQ/NCQPbOA7/W5BLJjxwInD8ehNzw++Eix0AXd7AzoNTar3X BP2Kp0OQL5PwAXpHKOJrkIgOvgSxot5AmqgGk+gVcK8TXviVmmZM8Rh7/jLdW1naPZNaV+5MD4 Dq0= Received: from risc6-mainframe.sdcorp.global.sandisk.com (HELO risc6-mainframe.int.fusionio.com) ([10.196.157.140]) by uls-op-cesaip02.wdc.com with ESMTP; 24 Jun 2019 15:14:26 -0700 From: Alistair Francis To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Date: Mon, 24 Jun 2019 15:11:57 -0700 Message-Id: X-Mailer: git-send-email 2.22.0 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 68.232.143.124 Subject: [Qemu-devel] [PATCH v1 4/5] roms: Add OpenSBI version 0.3 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: alistair23@gmail.com, palmer@sifive.com, alistair.francis@wdc.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Add OpenSBI version 0.3 as a git submodule and as a prebult binary. Signed-off-by: Alistair Francis Reviewed-by: Bin Meng Tested-by: Bin Meng --- .gitmodules | 3 ++ Makefile | 5 +- pc-bios/opensbi-riscv32-virt-fw_jump.bin | Bin 0 -> 28848 bytes pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin | Bin 0 -> 28904 bytes pc-bios/opensbi-riscv64-virt-fw_jump.bin | Bin 0 -> 28904 bytes roms/Makefile | 48 ++++++++++++++----- roms/opensbi | 1 + 7 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 pc-bios/opensbi-riscv32-virt-fw_jump.bin create mode 100644 pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin create mode 100644 pc-bios/opensbi-riscv64-virt-fw_jump.bin create mode 160000 roms/opensbi diff --git a/.gitmodules b/.gitmodules index 2857eec763..7a10e72e09 100644 --- a/.gitmodules +++ b/.gitmodules @@ -55,3 +55,6 @@ [submodule "slirp"] path = slirp url = https://git.qemu.org/git/libslirp.git +[submodule "roms/opensbi"] + path = roms/opensbi + url = https://github.com/riscv/opensbi.git diff --git a/Makefile b/Makefile index cfb18f1525..c74e5ba914 100644 --- a/Makefile +++ b/Makefile @@ -761,7 +761,10 @@ palcode-clipper \ u-boot.e500 u-boot-sam460-20100605.bin \ qemu_vga.ndrv \ edk2-licenses.txt \ -hppa-firmware.img +hppa-firmware.img \ +opensbi-riscv32-virt-fw_jump.bin \ +opensbi-riscv64-sifive_u-fw_jump.bin opensbi-riscv64-virt-fw_jump.bin + DESCS=50-edk2-i386-secure.json 50-edk2-x86_64-secure.json \ 60-edk2-aarch64.json 60-edk2-arm.json 60-edk2-i386.json 60-edk2-x86_64.json diff --git a/pc-bios/opensbi-riscv32-virt-fw_jump.bin b/pc-bios/opensbi-riscv32-virt-fw_jump.bin new file mode 100644 index 0000000000000000000000000000000000000000..c3e2aaa5148930754d3f88dcc9c6efdb961774d8 GIT binary patch literal 28848 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 literal 0 HcmV?d00001 diff --git a/pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin b/pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin new file mode 100644 index 0000000000000000000000000000000000000000..530d53f3c84632f2170fe0ea0b4a29019153de65 GIT binary patch literal 28904 zcmeHvdw3L8w(qX0uCDHoN5>{=md<) zn55Hb8q9-fF<|rz1_9-qVU!3N@M3r+4LE|Jh&TttJP0^wqU4DrxxZaiotJa&9j@Q~ z=X@q#^{QR9_u9X`_G|66*Dm`#Q@96v)a4ODxOs2 z^Q4Jf9%JTsV&+w(!l@#niX#;~N6s8RJWnq)2lb10&wzL=r#9O^B^7z#^TS!v3}noI_>P1JRv_fLR75JezavKi&BYusztlt)2YEhqFcmlINJZUIrlRgsTy@NA z9&v%4a38Y76n&I=lO4&`&9rwL1d2Y2aoR@IP28#{eSh*BSI-Es>+g2m)M#8W_Isy( zZ&)Lhx7qQGOT{hqs^~Lu&I>_?JUnOFrV7^vZpt4kgr%IB{b8y{AUaCzIyOe;*mzx* zRQmObybau|rCW+k(Y3@B^8=OBFw=wOpo@l^9x5li4R2UEm94`RgL^4&?^V--zUKmG zdZ?B)MYAeX468CTERo|2YP)WJv^|2vG?A^L8@DoKWN`T9$oiRA4cWk{b=Pw#CsbU9 zTV>X|+0uN}UHP9$;_MF{AJU@&ho+IOk=we9)%Md-oHjUg$@0P6$z3Ld3rwVPMX>Nq;VnS)p6IY^2~H6MKd*H`=aXHvUtekX z=Gu4P{_uTU>&?#YE;G-N8?;=yMMC+a+GKWByuH@0PT7%SO}&z;UcFTK4c4CYM zc2vKaCnPV2Az{2OP9KtplFQExc&_JpMw6VEBexS{PG4)GcS$SDn|EA4RbS9@^6J^k zIm344HyNYHao(YvqejI!yrVcrbqp6Sa5dAp#Ns1@qvmn$LUAq6c~iKHg>0z9o5{^8 zDi1wV6mLi@t~FdJF4OYlJ+Gt2z;iVM;zjXXbu90ww(;d^!~&=Jd}8rp-cggzCl%&} zaNafii9(N|fc?1mNa)3)#RjMCgVIRqhSqdci2FwJOdwoOf8Yyu&t{cUUI!D6=&INKs~M5-*k6mcdJ9wq^4J%goy* z8)6yY{i84<*AnS$BGE(~!T;)%6Zgi)#*3l+uSAuUhZcEgk%ty}Xr(-~N*-Dz53Q1i zc3>X4-n>%r4n9=ofB9MPA1dE}5)b~qdsfu(LuVt`cQcjpZ5Hlu)C^@g?<)-C#&Fdt zmaEBU9MvkuacUIHoqCJmPLE<7M`KvWk@p$L=@_P5%^jW2h6|44#~8@=_;lt((eH{; zKY?8J<7|8&SMwPYALOWhoT>Qk5-~6Tj+meAA+@NB6t)&Q)ibq0kUz#SjAOM&n2M$* zhSfVxWwLq0xKk|*JB&M>$(Thu2@k2b`UD9NH81I4%0tYlsl=QX%2YJ)%#qM|!x4j= zZ|zox0SLmOFE9PABq8B`{6mGBy;Q1|NjZbLeHhv5BVX&T1E0;?y$Y9bnv zYcZtKUSshz881I9-#cGvG8!K~>6AkeJDQABAG#5xi}vtDB_0z9D63biI{Uq!lxqFgHSuzkNIS#hy~QSA+Ya38)*wc~!(wJ&JHO zF~m_bos=Wp5sV9ulZ%CmX)h(Sit<7o)tTf>Q8>nsBN#(!LoOD|TrF<_{{vjjE8vlj z^lyRR`^4crM#9yzijJrq)t@2VV&KU`x^krZlF!{Fr*)R2ykk*g506>jWF%9<)I2HU z{fL4WZ>QcT-#0)qIrq}qy__od8n>7Bp%qgvyr=ZxeL*Q zN1d9_-LXiWQkxl{ zU7pQ8U;A|YGv&`PmSkXy3l6U*8vBa4nDCT1%&B*-EWf&=zTo=F%d>CI>6q8Dp!vz` zIXc=7I2+G7ED;#ri@;_L#qM@zC zz9=r{OSI0d$)=dMZc^Uw^;}tGg)XGdsLhUlzWjOih1zE#Ab$~>jGd4>PE^$mvvi@i zt_{)=a;DP0XnHh9d!H3jw?XPN##0RiQkQ4aL`Z+JhJ(~;FNBU_%i_#wYV@2wE#B zG61p+fGh(b%K#tJ^8r4jjR8KS?E!<4ZaGTp7_&$s6C8duvR-|i==$T@mCsqER#?+t zPo^y>gaXrbcf_ot3OJIjB!9usl_;zD(mv-Cj&G|Smp{|G1t!5Cb?cA11tyz>iT2+4{=IeU-&?o- zgX{KbE45-Gw)fVj=Z3aL0&012tcWu$q`>i%*2K%|?qN9=lJxM@M zib79{MNhKz_N4i}Jt@7nC$0HOPx?QPN^_P;9Cg7IIIoedlkADha4zxtWz+L z90~P&aSpBCi*7JqH>A!GchF@$jkyc&jn#5v{>-@59q&3*YGz4#B z&IOy;>fmi`s?NlP1aIT`V5b#p##hb}PotpIZkX7}r|ShF=Rz^~5%6QezHl*~bKw6u z_a24v zQ|*-u+vOhXZqj{X4)fz-l`zJLhj@0hZFhcMa^>{Wd2|(V9Gf$A;u#g&88PF2h61LlcTVhSlPT;au_JyF8%|?svuJ^zX>UA|EAgm76y1(;AMc91zrYtS>S~oAb|y5tnYjABHjgN5MJ=O#tgy>KAp_%;@x>w#=GNc zFW%D%-g@Aj>+o)YwmKXdD%P1b(1%aGqeAVgQ2Q#>z6!Mu4K_j5hxY>FC8-ADy#^i` zs)2Yr!6#dF+juW2crW$hJ*MEj0K7AR7xUe4=w)uqGg=;adEkYOLvRc|=fm~L1d zwF2-8zzdtyeyoxw3cxD>FUA62`@Mj8Nx~q!;E^E=!V5mx!foR{q~JZ&i+7uX_piVk z1-#J5hiiZrbG%jqyc*!u0IvpkHNdL@UQIu|h?k@pgcm$AG=uPhPqyZ^@$OUb?(4<7 zS;6~f;2iztOW_$es~ctNjnHHcw}e?;RT;;?QP@z zPX+IP_Tnv6@RkE_F!1^TuOINj3ZeA_UO(XV171Ji^#fj5B@+Dl;YGY8zd?AxBg1bH zUhv8GyKTJX3f}Twym<=VQs9MUYs(Peg`Vt&-mD!0yhDI@2=GFOo`^N)3Fy%YL;B%G zyrdz6@PbFikU@CCCws_kL3qI@+yA!l7Abh?d@SQ#s^HB9-W9+b0KCvZ z-Oxz20l*soywFVdLo=Ni0K5Uf8_*9g;w1$P!V4Z50fX>@PjifPXw#VT4G z1iXR38w9*qT~7=GUhG^XV8`M_U_ZQwcOh^PUhudUI0!HJbOzow-ZTYoS})$I3f@HE zosRa4yxhR_P7qhKKd2nD*NGt6Hhv*UwvAs4l5OLiL49^ZeW{aMSS<5SOZM@uo+R_G zhAf(=K%1UpG{=NqY93RVhCR|SZAlP+!n;str)AsdvN8&XPbkL(Kj2VHziZ$ zHw6=F8Ai~J@_esg7_<=nH)rw_>?^~1{&pKWfc!Ybi%&wmciQC{JNr|=eP zQGZFsfQ5(`TtEcO$Je~sT5--;OV z2gM-w&=_08eK8oxf;00nwc(6$W3Nsu!>+&RrzO1A!#~D>uRkm)zh|zMZ5m3#3PK3o z8JPOp+C}l$S!OeMtaW_3tW2v+{rFD3T5a?=`Nv|%GrA_@p^3hnhJQ_MfxfsmqDTx^ zZNLgZz)B$snt3c%2sS1h`=Cdl2hL|sz*@{zr!#V`uVKySr+<2aNu$_u^;U?65 zVW~74Mofq0IF9DjD;ZcKHObUsE3W{NFP`{+9Yh}E`#=e67Qm)KVS@RTXezBGS{*o!A&PF~_) zHorBl?EFsV;Wy%f^=n$Wu*B4<;q`a^iD&|Or>&y2k?h*^>%Fbk@DwJ3^5~0CW5)&G z`6rsfX$!9p)(G4zl(n#Z^rj z@eCnc?)2P*`?r4Jj*0WEi6ZpLK`+1IRQ|*N=!$u=;B#r`sHdg1gR^Q$$jJ}fqvM>T z>C?#@Mq{_>sT;hOzFFHQE+|p$aQCID`o6W}1MOsn?m5kN4%~I3drruS%}rQaNoibF z?sQ6LRbqeZk;F^63CUIa+|H^m-6txCuPpC4b^Ywsf?GRUPBs%pZ=XTNuHWU}<77-) z?}yFfp8|F{uYzqQPtlP!#GuB!CB{QXT0mf0@!h`Us++zoXkfs zJ2KVTS2CbN3K`D<{mP#PA`1IZY!?uW)ixFCRBRVI+a-P zg$h(%xA}`(o`U)wy*fwOR(uTUCb+Vy>gK9jD)>WFX$jt_(yKpVDPmK!suR0X9Zk)@ zxrm*k4(>r!M^|h>m6D$KrQchXwKDwcv(4&;9k)()oND>}`j=NP)z@B5yY+O(@)iRB z3pE+DUUUifjeB|b`hD))-!hNrwU4p1p105Ps74Uc6Q$>@Bgon#VnC$c1N6)+5j*gl z^*-WJ-ADLY9wC|){n`S>;j0-ZtQIPwUv@vK8?w45Oi*`uFec>A7VElLr>d-UEUZQ< z@`39-Q&wsq9|X1&U!1z{ySl+i5QEwRJ;GGAsA==}2qkJ!MQM&8vTdQDyhz$cc!b9U zk)f0bqFSQ7$hY0)5e}*KFApVRKpV7g73R=rwRmT{+Obnho_4hr=+*fhv~8MHEgjob zDoF38j~&>Ve^dK`|0X8*-rOHWwI6ZB`Vmu(Kz1$iOG$HH$+Twg$W}jp+v<$9hC`vkuI90k8-a2lkiPerPlx3N^Xai zcr=82dR?1~x4mPP<3076FK>#wvy$7VB_r>BQyW)9@yc<2bCjZ^@7GpRo}OYi5p%qE z=ph9fUn=p2#y~x!H1b}tpizxG-t=HgyGMi8mDi|lbICdT@-;p5S$k9SpZ@0fjjEmU zc1+1{?{;_Y<*rbSIyJ?}*bZCYt1>_{#+-h-56x2td}#PeB@Zb+9;%g919N-F+O?OKrhoo2ue*=PG8%a=E$K2}EY-EDpXUFLHLf!E zxA!0Pta*W)`6&3_kz2dnlQz5=M8n+$VZtM%;m5<+{~rZUk;fpdlEq?;Gs9lG1YT(ycoqf>#)EA)PCr~I}dmA;i{9IACq zTp8XG*)p?v_Vqbe=hdrkW36YE#ZzXrYcuEnzJ0 zdAU;t*i|sw9>r{X9JB3l%(hsqV5WudQasjF=^C?m6n0LBcMa^uOJMV-_Wpss78{S| zm3|;>nOdjYb<>oiBDE{xGs`pC?Ana@r^}xn34C`-9wKCz>7lo7=`IhgA6rmfpy%_u zaxKHIj<}A|i!;Rx#g*TUlI|;q{haP|`%>w-d_q$Wtv8K%{}xT>;iq@KRxmJa3erBc z$Cox~rMe}&S+eRY65T#$ShMLt(G9qJVHK+Ecmb>*TPs#54GHC zYVP^7uNG1tg||)=3C&L2iDN@8b#yKC>qBgEr+rE^IbzltA=(94bZnP zkV5jRg0sDvwW_Ry#ua5%Yt`6h{M*Vp?m!0Atwss z4YMR4#*sF0X}eKwtp==?;a^omTkU$`K=aB zu=_DxCrP^Iaa}yWun;@Qx>|ThI=q=WHguqrHwt0rutW3(cB8OcGzRI-zm}=Yl z&s3%j^{Q8`q!~c<+6`G$X_8$k6# z{*hKX3E}nMr1D$!?FJI@4}E(SxxZ=ShBI|^Z||!E&QXVLVor<3qt3qxpTL_QKED&I zVBIHoK=11OdPBpf96Wb&ZDQ&-L|(;l6I3^MKu7ba+j>5H74z&q8dKjcXp+8~2cCc0 zD~Ao_cYj|%!|%)CD3WmgNgA%8;f)&(f4Ufw`NNk^(mua{i~m|Vv<_LSq&=ABEa`CO68als|v>+ zu}zf#zeCP4Uv;LaR>N7-RTWpip#FK*H7aS37<-I76OY}+TKF63+X~3Unyz{Fk~Hi# z59CI9g{%M1-1G(~Yfcpyy+O?-6xRa%;q|#SYvCyJb;NegGH$%^};%91Ne~b*H z;gK6eLAb{rMWVN)WfhD5!aa-)S~>c=A(D_uuQsyQS8&>4`1x-8W6{_#HNeg&zy=uw zn_jFW$=;PHB&qm84UnYIlgbn7lcXfE1!~q|6;yhmL?=u1e(YzL>O5*=xV>ZoP9sD` z+asf+#o*74HzJME;+^O3qN}!odb)0-9)LNhJ)k)TG}S;;6AQmC2Wr+reL0TJ=aQ&> z#G8(~gg0IF8tk=~4?XvCyukvGN+);WWsIY$;0D4wm2lIFxSe@Q2Mf3bkz(s8@`bGvRSx1b*$S_Z2)Hh zT74Aue`Aq@jg(`Ij)(PTKKxmsM^vX1>_1cAftoeQXBgw5HQ9hsx|HWm6fX{4Sd?8v z=VI)MKl=SK_-JCcEg!oEZ(;U$AAVHu(NxR6m7l3)KfQXj?5EcP&sSd!P>=fy-kDgJ zGZ6=E)c0Pzv6CE3xc_5jrsMcf%t$KimW=|p7@-{V@N|KCG|*o1xIj_CJMnmmKuZsa z9?ujMJL53PLq*bo&N}r%{wok1q-|2aMqujB2+d`i*QEie(b;SCLiz_LlLHQm~_G-Sbd#(eD&$9d{vX~-8-m;1HItjP?3&*rQ}?( ztg}WO98m|~+dKN^R^}%h8V(>vpv+oM6nz++OsiDzj`V>b5rZuOtd{$G5gE`H>wDaE?kg&q5y@K3E&$>&4hc>_H&H%k1m zRpSwwIkB-)L-l_3tv<~^2VSJpqxl5$@cl$Tv$IED0chVUeH^n|zUnPHQ{_BIwf{&b zJ@FxFqtWfyM||TZj<9oY5(^o-J#WWIexe7E2hW%RKxFUVS_O( zxSWF%CCa>Hjo`Qh>J#pO-h2TXA@v1bShN_H2Y97soFM3JR(Pdei)6wL=8Pz2;K>yD z-23(Sx#wo~`P?t|Ge3QkFk{50rV6{)=T4W)e&Q9wztNffBM-GQEiXNZedA7iuc7vojcW>Yx))2I*MDb2u=jqHQ zhFCf#xX!NE9@s*yFZvgLWX8Nq*9r@uzrOG~X{K19(_>fm_0+s z&3*zNi%WElY0v5OujUa;(UBnYmD4!iX@2%J(Z3qVn$xZ@;dhzSPLX&$Yz}zl;C2^G zK}$~~HO_dHwW%q&3VTJ-5^tJ^!k_Y^d02`(r9lkM=}a-rOCMUyEG(iqdP)OXw3yH$ zb|H3-IF7a+2gaRB;)hccBwC*xNyIQMaipt>xwDaoLG(=AVbAcl9rKkZq1OnP6iMQ> zCrha|?160R@~?asQianG*LPe!S%2#CoLloc7PLIsycnk+_BbV^HuU%75zuheSjUb> zEnB2ohMrNA2+zq5s*QV7b&@u2;EreM68hRVbjXE80k%qkVicnFS&?M;HAe>Uv|b}3 zX<&~G$EgMm7?YG|p$&vf1V(<>7K(9pk=+y>^G3Qh-Q#K(D%v|?yF-l@c<%~G)AJLE zn7dOwJXNn5PsC#3?mN}6BHneUAQm^?#is`d;>(T35K4<1jr-FJrSzg}=UrM}e0ira zI2~58@ZfYUjTf#>7oClxaQ{Z*C{O1^@@9PQO#YDvw)*awN4OIqI_@N|a~zA%IgXCk zIZj(pKW@UEPSknIRE#;z%9yWwL>#A55q7|HFiThQkB`s_g4l{@Rx@Sme&|7cqLr*> z^rafsQx?e4_>9M+(GySDI#`cXHxF!n%|%ni@+>jC(x*Z*yE(4ZDLh$lBa)Bi{?^_@ zZ&fiBjW(v1tEjtyQ4)9?*O2hLE7E(&k-I9s>n4R(4^~zcjprGyP4rwK!L|dX zdODi)^JX33$(pwv_6c~i=D?dZ7v8M7eDJnBc(OX+$?Bk~XMKweyv2tfJ zkGvzr*(lZC{=NE3qlx|xe;^|R?+VOKpmoYT5+TKKQ=T02$o+dMPq*}D;z7^(Y|^zM zDe=#r`f_3(899iH4^8z4zSx`o-XG=HAN({|{*eUdzLL->RFgaXROhkC=7>{NSZmMo>gcW)U%e;Ui2Y))?W6=U7kyUv}Zl3 zJPY0H>skLUt%dK2j?tgHi_vE}gDQlb*n{bQL+NeZ=v9?>6sGFejb~w> z5IoK-RxGGg>D8-QG2eR!pQcw&U`4n0j)`d=VFIaWrzyO5XtA#H4t*d^Eb{7bpW_W3 zohH6ae-V1sJ50anE<*FAHMk4)EbJdS4JU@WgSU>H=CBwb5dotuBr^k2u|X>QnL@0} z;SFqF{vq~h(shfWaU5qHmNmLOock4+@Q}6Ug@y5zI0`Fg6hVX^*JVq&tc;_4;vS|Q)eQTx@{y~XJQQS{}$l;?S=36dEGXy9j$w@q@M>*3#jsy z(Yv0Bkjgl1VwHB<=qk_ovE+>nZwf`!?kEPM{4L$Vl>?trskC%=?e(1hgVZWNKJO{L zi+I{yK{Sp0_AuJ4{PxU%w=&0B2leO1k~`fa`9OZ;G#?hBoFYj&n3VXY;)78t`wji@ z`ZVzmtt5y{W#lKW=GR3wBs+J?CVY|LuNM2tw2s7dbivQW@`^;h|A)P>ilF%ja6twav*{G65{3)1hJKjLd& z&KN_KQ%X2tc=_(Va@_QDQrZ`MX&cY_(yG4hTWR)5;7{+#=^D>S>DIKe3ZGA27oA6y z{7?CK(EJ&T4?$nq-%Afq`PvYizN>UhDfJLCRqXhiL_cUdDbc^|J4tz&sv3{?mxe)- zc+}rUh_6qht-|vvYzQaS-L&P65Z4{;l~8XDr=M6S2J@OYCPIpDYwZb7=_*}YNWC&- z{}eVfyq@_Z(d31AgtngCjWiF_Z+0I0a8s^Tyi!dn&Q-Hz1+6`Otvl-2W-(b9dXzrd zEaqC{dheaqk;?t+;(Nj?z$2sI{xNO+k=NBN@=4)!sk`$_BT%!>hH&WbcaCm&{kH)& zc#o*U&c~9F)A>uvg!Uf&7R;1M7Z{K07@4wVqw3EIBe%Y(5{pMM>!vo5k|&vny5Zw{ z*1~t}lZERJy{W3(G^(e(x3ya^FZQj#a;*k6RwC+}cC6P}UyYz%dnM(q1tX!O@g&a_59RE%nT$6G z*nK#l{bvW@_eCT4{ZK$GmVvNGi~iaFO=JWjE>(`_oTY5wQ_CZx0QWmHSO}g zEw!$s2(L^nAVzhv?( z{6iG*F}^=P1&WYKpXE zFGX6iogyvSM3I&_DbkWGinJt^A}vXzNJ}gfX~}qsv?PKeEeWAWOL&U3WIRP$5UvP7#cQM06=(Wv3W%r7}tkAiv5?1J3P6;b?u1X0j zbS|%i6*^a~gcUkhP{InGt5L!VovT&C3Z3hxgcUk>h!R%lTz@63(76FhSfO(Rm9RqR z1}R~MqW)`@`j;sVTgqXD!c;7W70Po;SfRX12`iN6m9Rp2wGvh+FDPM!@){+qP+qHq z70UZ5VTJNTl(0g1etpB)V~~7DC%DhD-`uFhZTzYm%|E0{mWs6qWR%2k z6!kBM6)MlHR6jM3-`dZE*lC0RFuphv&4#DsM(Ot&`n}_ABa*v%{u0$7z0ZyMc7P9Y z5RTG^rzq>rJ2h>EmUIRL7-zBE5V9#Q3-2 zu?Rl=ISu7gcUS98SOwo5QAgu478)BP;vtc#)_4k{4vDIBD&RVVcpX@u|1_SqS|!Ev z$EjW#?^msDo{nLp?lsM=wTW?+o{kx$?qyB)jVR-Qw4RQ2r0x|>$M>-OO&!-icTdMX zq|TwaHNk0$sqbz&^lJwfo8PVJhtJcYVe0ZUz&&*UPn2T-Cuh2+0Fq+Psl`us0Htt9 z3_@vWsVH?pvO%pX)UUMS7+bKbK$f0!y(~@V2KZC#r`qJQM5;|o^7d=RI(q83x{%ge zcAae;^~}LZ>vv@;C^Sl;HigDY@#K~io}%9yBDEFnL7q5ga8Vi(HrK_J8E}QVNJV2h ziRF4oMOzy7*bb+K&3EC{in=+gSlT7}qakSg%J6HE4J3Hx*Qais?NERFdCQm0m#)`d z^{8f$F>ck@kxn{)!fw`Sdhl3>>7iFTnh4482q9!gDYc!`@0Dmjatf4wSl|>=@jbu` z@M;k8tsqC#dd3-LGPd00u$$zzar@lF6y9ChQ4ZAq6;JEHLIQ3llc4fFu;B;;Ub* z;XO6u$@T0j9b0O8u)Yl*k8S_G)aZU1l@a_!+Nf;c-wnJM56XBaQY-S+IUNg{3$E{| zr{B?;*OH?fw|>N8UD}upd8Jv^@IqxadbtVfnOw^P>}oq=hLDXa>;RC?@rQh}(&Zwj^cWavi5;jkjN;^+(HD`(|+U7~pK38mB6U#_#r8G)wicb0Qi>dm8 zW5hARj}22~R2JeQCyFat6QvZWDJ6yJzLuMtr+Z!z*xV9{JB|NOs1aAGFs zfm|E*|Hsq)RkX==y`{AW=QbGGhQMY_anf-!7bhR`azqureV51o$}uB^aMO4KpB?Oz zjwj`kpJhC3bi2>LGDrMaNa9>^ywjIIfw-u4spE zMS2H`)dYTmnMU))clhpJh-1bk?1?xTZpL=TVcW}4{>Pa?{J}d6-)xZiA7^}=`*Y2W zvdj>l?g*qUwSa!#>CtlpyoqC4HF3l{$)2LIMVxgzaagbmF{2e_*-OfUkXzGB@c4Lw z9O2{D6%DPh^oKHwHMQ`v_$zumb5Cwm+1zzZ*;(Yi$wkVB;r{M*BsiTSFAq1JYGSf0TYUEi&LLZf_XQ}`&?GiLKH z+COii*WHvnHh9&KjMWr#tjqM^XI<#Ew=e?sm>#OX2|v^>+D@@fdWW_`#zNcPTIlw) z&gsl+ig~|#f~%C5YW%A`)Po#er+<>>99pv&xurQ`oNIRhW0m7Mw_$bCYkxuv*c#Rz z=By!*6l&cj*E;=bTRgtrAn);)okM+;N_9?V7005rA5JwtcU&qx&Qmqh(db)@m9c_U z)57`hb``+#wy6<&$FJf`1_cb~-N87#`xv^rJdBAKXbPD(>^q-zbpK52HK;Rq8gAZ&RWsPLZX`Xjt=Zlt~#~x)nYzkq#K<<2l&Yv`$d?!oGfjGIR;YBEz zg;t~x$Xe)0^64SyRLVJ`zPOu?=Gt-_hQBS|JWu-4R1~yMUEA(UmuvG`ASnv>M`K*P z;N-UjwRh8S>i|8BKf>Xe_Vk!ncezGxrT4?VPMpbT>~`{XTfD$7+t6suQmpQeJgu!k zqN|ng@B@Zrs_FOl2hA(aw%} zb>i0E@N12b2P8JE8YyH8Qh3T_XXDg9ynKyMHgqf&*-CJDV5`I0-XpHtM-I63E(56> z-qzh;A{VO$e!2CR&@U4BMFPJ_;1>z}B7t8d@UKZ=+_*{OVkbpE=!`sVUoE(*T0_qfdNXp8{N({Hb5RXdFvp(ZGu|DSqYW(yw$6 z#>yYw_uZoyK0!UUG&wWv*;UJovy+#l`XU>RlORkfO7Hs_adRFwT2qrVvsR_r@qW&{ zh!iCbm3eQxS;@~CX>1B4r`gc_(LDT!?qE+3 zy^j1Znf{kT+Z0OQy^ec&(el_AXFQd;DtX0IsjF5!yNZxhF?s1y5k#igj=r`aHru36EE0Mx@XxHQpl?2SV}nl>YCR ziOE^^)Q2JQ=m#b&ea^Tnb9M64-k{uK2EBz&0>prjjmQq4o#l^!8|(CM)4&U)ZcXAE(gq3XM@H{C(+P@&uXMmH2igzFmoL zSK`~1_;z1>dDtO#Wkj++AOo;JAOpx$@MJ1@G8O)r3ja)nf2P7eQ{nsH$U_z$psvcW zi>vQju{1-J8Q-%!Yw6O_gxvJ@^h`P4(=!9tdR!&AKF2i{&*?SdgxroFoAns2dS9L1 z@4GSH6DJAczTe97xNnX^=PUFHnSS$WPfyF)o}QVX_4K6SqTwG9eggLo;(9WcT*xdP+WnyG`Nhnd9jFp>#LrgHeAiPzQI+G>k_Un zaGk~VH(WKi4&ge0>wR3ialM6WI?_+U^&qZsxM=*_x$Z-nNL&>6;IjPRu$@9)v^~)A zGj&-OW|!2bMEk0zR;4COma z`0TP3$(b38m(oPP{QV+{9Q0u1ku=~4q98JJP{@OTgCQs_ML)d+*`; zyZ_v4@~d98tM*>|+iSnpUVH7b-539zIEMrnT!iQaS8o}p$0hU{V+1lz|S_8F-x0H5zaC64+; zVk+T?{)s@w^y0T9BCrx6&zB{nvgccJG|*Ja5z|Y}BrVAEnS-gkSx+kKk1>_?pW&)! z{^$`G*$DRmON=qcnAh3ST>UItk3pd5qZy}lRQ=?gdeZ+Vzj5`B61)Fy)5XW&inaYR z{yW23sk|+Yr(G&;nO8-hiSwQhG8EuB%QjcKHgePcP$?|qOzijZ9)aj6wdvScnPbxp zSyEXyDhoDpuas>sHOABtW9;`-P9uyDRe&xTX?(bX@K(HGR8jIpfB#IQt;FQ{$0g)z2B65C96hHlx(kkP>rm!leHT{GkXr`FxTrJq!B z*>06d>t@ReQFnzi>QB9F(!Rk~7LG~KYk}K2CV@?_NKed8WeW0bWUj8QnjyBk*jQui zJk`wz665*w9pd?Z0`VN3KtvZyDp`i;8Mb-!PI|X|Rp>RxgaTD)D@}7VLKhoaM^lAf zWiP860&m>a@{7)UZdY91)3E>An>XHRIoSGM=LfeFuUHyqU7z#KyzdsYE$VuryY9-> z#;>n``_1>?wYS~s>ghJ|47o|mrCTCYEU8OnS0~!)Z0htq>6VPE8R|8A)>zhFUF)}W z|I%66UuXM0xBt0W&wu@V;IcQD%~}5K^1v70d~wc8-@f#RG~4F8V&B0p8&k15G1W%G zV}KpiZ{i6l$Y)3xuS?K}B%|c=a|531d7jav7UawABs{;rwa~kiRTV9JZk%o?YCU!B z)64lI_7^sX&oy!0;hdvZ#W}oVI7dw^7a?%9Gq~i^qk^OMG45h%9nX2wxl6@tsKcAX z%`T}3JzJ7!NG`22Tr4fu^5ku=qt?K4wF2Tr^IT0F@2Iiz6>7u+r-giSX&UdS&Eivv z3qm;WTK;6Q$56z6TzWM0Qc0S@X??#ej!7=E~>RE&N`BJShT#uI+k~sC-W$?B?(ATW=je$mD!rjOJ%m^@q^3E zTc;Z07~uVbFv@O@ayF9~B97vJaoUOd@RgIqQ2rO9O3FivJhaF|i#)Va9$F<2t&)dU z$wNCh54*RZOuUN^mHA(O2K0LQ)3Lrx7$T@d7tF%08a-BG5p zxtU@0j?+18!3gejE5nZ9&g3vA(MBRdDz80GB0^0|JDG|QQ$_|cWri}9jXZNSG|_O> zAm>|mk3O`7^MsUg`mI{F^6Hl)rQ}jEv!yva<_VPPC$t5pnYM-~Cv6YSA+5eMf6^=Wp}6e|lZ==7O@6E~nI1!sq|4O}>kXO8QQ|i_eVg zz8R^Dv0L>TRTpo$ZkcLmC(BENy0fC`L%rSe7QM1e%dLg9E#l29KPg{o6))$4^LF$ae;ucdbO%+!279o zv&d*!&bnRYu((wY>pqpkd`J}`&^Alk>!o6Qq#S?uZt#2Pw8Fgx-1Fm5H-z)5h@)l< z;c8=vqjmC9_KkLLD_ZBb2+8ccpVltPl6#HYOZ(8~go|%0eK@VAI&W1(i@G)H#;j{|8psHT zHH34_;5lw)Bo$Vic+vesR-LLrtk? z_(ZhM_{DoO-n~G6`_=) zZ?vT&PZjAZUAOR3{RH=$Zj9cE9-ddtayIMU(gu;1ptHx(^Rj$)cm=*jepBaAA=vDiepEP=T z)BTiL!Ef;BCG%md6)V}CI?T=$*;AZm%u0(_6*W{`j=DXkbzaMY8&5RkYi4yWy7p$_ zI~!=7=_c$)iQ;FK595jbueK;%Y?Z*0n|p+qZA)yM)iIS_*NMJ-7<;;qNz(tzFjm~C zWj!6ki8J5*Q8}+A3yS7BMb$5v=9ZTlcx`t}<;6V4(=`(FK7IG4bDp!g<*T|qOVsIg zIf;1{dF*p_PbEHG@ib#j1-69Xhz6putxSlGNKe3=diSb|YkL}sZk)P2=k~nL1+9x( zp16^(qwRpR@|?pQ$#GIUa9GTkBhkjK$(SS2#?cCB8|RX8F(difcp7G;E<)$q_=iP~ z&JElB(8v7H$NbR8sB|qSW$9Wj%F?x7m!)g%`jK>*$bz!&l!R>0MJ>B-r2Ek=vqsO- zZ&cAbQ=!gOs52GnOobX#datAQF_lthDy7a;gX_!~+j=XA?DTWQ72aaZrj9s`*7;$YG4_pHl=s`cSC?3z3#qf~@)Dn`c#eI(?&(O#UxX%OBjm1=)%7FH z-RP|^2I&YnTV-1^BZi~B&jP7iA@!LPsfGfn%QI;*q@SkYAa&Xcp`%!HIa8(@J*Qtw zdHW3KH4Jmq3d6V)(Zisj4C898!|1q%{#(0nm}%)Xl7>+#YnUm6XQ-aDc39FNJ%=%G z{|GGvS|QPlM<1zJ!b+_Kx|g{i|EJHAj<&AG61p+@FBer;6vIJ;6vIGFcj(bW3-Mji!5M*Bd$d?sBaM6KwSF^IkVIX zYX|Ddv<0PeixoY2aQmUC41theAmkSa`9Z6)2KrDf4D_MO3iP2`8~D#rjkZX7V9QJY z27JF!My*KQhw`X35T!%LIH;%8VVug4b$RrY!6N|Y6;%Aj2hT9(Lmxqg=r1nxm%YOr zHC5;@-oE~FLFzBymnDaL&inLm*Eb2WSYfy^Js z{HYuh(SI)ZrxZ)L{7*`?(Bc2zK{Zfj|0ko%pK09!li-iK^+(+TlU2e*d+$R3zPk1A zt6Tq}b^GcuU;C#m4{LJP_LemkRAbv|jq!~(L!bL*Eh*kx))?viPOCD5{nT>NQOSUw zB%minqbJ3oCt3S?(!#!;l-1Xh*8Zp`{jWzQx%E2CTXoz_C+61OI&S&_T?Ox$S)-Fy z1p+toyzb-DG|ab+I+J*l6hISe(^XzuN+L#3X&w!s@#+j8m;TwI?~Eqmy_!HzTO6_J z;)dIFp~G#PqlVv%o~v_MkcY*IUc6i9n29{p9P*G>sFw3OtYtM0OC$JRgYLy42g)1k z6wD(>Lp@))i2f^qDgV;N=)V+L{bw%L^M%0azi?rOPcs-vo33kZa;e94Vfil77Hni1 zgLg6KgNKdU^84lHN*n z)_Iqy_DV+VcaL{B>sn&N{CHR;!ehk`d3LPz&BFTBsu^Vq=qlps_xe{N$)s0CBu*-0 zUEPm4^S{|tY^`74n)s?!e6^K8yKJexSkb4;u}@K5PEH&3!}4U?*qGR|WN>ntzZ>V8 zS7g9F>=50}y7)D-TziV<70GWin&mecc(XHy^KREUyd!m7ty|}))#|v@`*hr~u{y_z zLptunWF1#?Qs<~i(nSar!tYAYmvXfi5idoT7?{XOYf!WX&U+m^vUPQuG)?8T6O3u; zQo^0?0-rn`8&ZH3W{9-9j0mj=O)B{qR*R#C^QCF`ctRcA?@CQs-;zruK6K7T8J)8o z+R9Tv#sDGKFju}c40miFah#aUa3>BCt|kd<>XW2Gh!D<}CIejx;$0*%x*lQ@ z>#=Uh29N7xFuFYO=_3CO-BClL;cTgXL>`(+>A;|ku3z?%fTnD0hHFLPs_(el8{126QoL(tbI!|HVs zR<9&}0A9pP;fLS_k8FMjUhv7|?-=hn1@E~&yoVILr-64G@T!3qTACYLn^q0Hu=0$B z_I3!`+hjHHVl|zl9)K6|Qq)86f=9M`2ww2XQ{OS(QwrWweR$tg@E!wR6Y#>SHxg@1 zH>{3Y0eA)Ag-z-ZR>_kE;1z%uV}Y;zUPQbUVF+IE$QFj+1)n_Oj`4n|;Qg=^uy1zs)iYJpb^yjtLewIE45059UDXouhhk8JG_yx^0k zy<@!puHgOmKD@;W-U{Ho3wZs2*AIAMh0yu|uOIOG0k0qM`T;Mj5=njo@FHG{-w?du zk?l7GFZks7-7($@1#d+k-U0=08So0gI}CWCC%d6HYli{vFyI{qywIU1W6gOIdUVpT z0eBHFW!MnB;E_FS2ww2X8+ONdw<&nH0k4_P&Caz7-c8NqlNW&3A9$gux}mvh{ejmX zc%i`_f(APo+Vx3j*Gc{Z@FHG{{}8<3k?lVOFZks7-!a}21uvbCWxUH2ymsJS1-t>k z3k}o_jZ_-|yaB)q&GZm7)5!tA8vwik1MnhVO281j;E^3L1TXmH1>7;-LIrPOAKp|0 zaO-*J8sN=zct>)acROtFTG+|mu)B}txMTZR$BD@tcj6Gs)g)oBVE3gTVlhTsK{>)a5$;M2w3G2WF5-j#iLA64)!0p7X58w9*q zMQekAHxPJ(fETOl$w9!2or@&wSey(TfEV#D1`fds9@hhh;02$qz&pm9so>4*!yB*Q zO$J^w+As2Q1Jk}BuJ%w+1!k|4L9%W9VvuYbzaAvp#=C<0?S}d?C%3p%=AD`9<6SdF z=3N6>=;EPGKYFTY4y>QeWb<4F$7C^tuN|th(^zgZ;^{X3N{RQ-s!Pwb1RbYuwn%T@ zN|4_aP0l|1Ov^Jz>6`8Hn>F&AtCP*=pJ_Ssp&U{_vOM{jmgZ`#5-#`t`_LTa6<$O- zZ>Ba?Ib{FlRqLoa<6CNi^{Q%Ay>AV(F1fKo+{I5&3h#B%rnh<;i! z+T!6`1n~98e#UaCI!_9hLjTKwfXU{u0;b zACW%I*`MYwkq7W3%*jjq%NMpKlwa7(Jo0KnuzqbD7nYn6AJK64YeW;sJFS&vO=SPp zUma+(poSwUkN)^Hc0%youhA4vYeYjJPc(9TeN9L2uMX_a{BfH9dwEc4mJ56j(Rg45 z*9(_4&8fx8;tf`v+jwOp3(6SBLn2oe!&yKb3FLcCd z(Y_m1Zy$s83?q*V`t)At(^b&7y%^CI>zSZf&jiJKCJfGV`>`n4rUv$cw!i-rewY3} z(OghQvF)x3sTq~(KI8s)Tf)eXjQL(ND%B~By0RmoJ8s93g8YK~{%8IDX#(sL_kQQ= zYl~OWouyfwbZ4okVNUC!Yjl5Ug8N|MxD9V^;4Eq)&ilkK^{CT)%Jsf8GU0u98*xGw z0_nab{&hR?QXxXmPaR1LSqFisU!^r>@> zGtu=y5iC15uCBD?Oywh)Jvr*UtJ#*Pw7@~*w%(33hm|b79lY}$r>WyS+dbU$`FU2f zHImh3VFLVm@*7C~&GS8?KSvTQdRJ?&SXj$?)P&nrdamca!ukMhr`@YxdmkBHuNOXH zca=8uFiG9Rld3#wok}eFLItX>-}c3APf(!sI6tOWz)rEbk&gPb1U&3BeC-;!5vpX)JT1n6Q(jTbKT@`WV(-w8(p4+E7Pq%)4 z<8Rl#Y^b}OdHbo(6|Dpw8EP_agXj|OpRno84F}!!-!PBrwR2fo&%0-PRHKOKiPm$L zQDogwF(69s0eWV(h&_4EazF8??kD_gj}XI(e(izc$Tf@;b_^BKFMoj44_nh4CaAkT z7!&Ms#QJX5sVXlU4?B{Iyzjcel$ROE`+*(A7pMNa?jCRw#Gv*-j}WgGHSPW$VY6CP zQJOD^Y`SyD}!iQ@8rr|^kXoo(o!mJvj7Vqv*JN9bH zQ?B+Ry}GcIwoRj|wR4wB1?j!?u>*VcuWR4;-^v94(*A>}_9KosKVr-m$o?gM>6y-} zIhMRVdFtn`K4p1&&(rEHpxBWt7Fdl zDd+mvgs*d}wEo{zaeK7HqaoZ=>)Tztb)Q9!_vATW-V}FN6?YJG?=N51Ce%{Aa-3fu zqv+`Sbybw7r_@cveD7U)NP)(eO1!ZtP!B1M{-s#dq{ba@e5kds?NiNgZh5P|3U!SZfR(TY)?c6xuy)u_nG8m9_e zUZ(f!y5zSt>GZ8U<4~<@@~Vi=sMc96b8gJLwxB_MJ0Cmh6E>8kU}kl@)26z26X&c4 zcZ#3hQXBK%KnrzLX$fO~+smCcz|w-*_84Z{6PRsJV7A5j1v4$YnG&(e%F>v`W3YTW zylY`eUW#1+x&tuS`(n$ng0lC8?eX=x{kM$yDpI#HF{dJj&8y2!e5&H9(ZF}N z7$1J)w(j!qhVexeMS8xl+io6lZPX2nUYs#@IIhATl=NT)Eb4UU+m}ku6%v|qc!P1= zySHgN4?m;(k41yirX%f>@A%TDtWvi|v`BV-MWW8%jc74Ggq$88&W&pIZ_r&Eegiv& zlRZKqi7NV_$ZlrL#)n&PH@Ecu*;fnZInbaVqCBIVb?F(vdWJ> zBy)*mCg^^C0r$%(a@?rSR@Ef3A`J1+GHN zg1j90u8dBrOcem)f;7mJT#r^*vjgdNymOY=}K5 z{VD7p4c$B1Wq(6w%x~50${!wVw5x)R1@G#16&%+Y9p`kr91Ykz>hD=Y%R)<1A^dmC z(tNr3-y*9y$fCKW`NAVr%`Lw@>v`Ns^pEpQd9styFW_0v0w=3q$a9{BPR_Xg4b`so z!+E1y#qV;zt1@mluG+QXoXWVdLA7gRtE%k)WaGVb;HRPDA>n%u|4d!BICdFtv?c^m6qM=#7dB;M(=bAVv(1a%Gyc&(|db-Yk`6Lv3I)f z?ZDprmW`rA(8)f$r>>oD`1JCE+lxA%XiaM=YRw;EpP~0_;mRh{u`nsa0IJs}Squ+@ z`u{bnY$~2_{3z1^svq`IM%fgEH=Ii6cj`L~B=R5nj%e~g^OlWg>*;RaSMNE;9I=Y| zts0NI@D{uTZ+ZB_F06uebH_mM>bkPA@iPv-Ja(&?@imcGaoi-;tv%4uJnHt|4_?7M zdyvM|cL=IUG%rE<8cQl{CC%clDl?>YS_T zmh3&*>Zj_SOMJfKdG-Z5HeqzK$X-}*!*6-kRe6d7tSP$Q!n^C%$*EejrN~xz^&Dv|XXHqXS8rHw^IV+~9Rh-43 z;>-fPA){4}nQ^KJ>>68DN$^DE%nMa#OX@V7B}-L#?F;I$XIZO~c8#&?$TNx9Z>)m{ zlD@r&Os?%-VB4ID{pZ2lD6a_h|C*cL;ABl10;4ymxunuMpg*#~Ub}9gO_vp8n+ud_f`ffdiGiESXW1-u|;auVG&e%VY5z_=mXf{ zF4K9`;SsjYlW;yEI>r_i6C(zH9)2?_JVw0x!aa1=R@6Y(ZPX_)AGHTG$AP8>Xlmo& z>E%GpnyGik@r7IpwU2nSP?zwpt67WP_ln`?HzgX(@Ue7q7dK%XRRwPpgM?75OW{B2 z!anU@0v{lP8KBlnlyxovALP_TOiTX+k1?*M1AfT;9%E@CDaCdRKU3+;YSC3Y++_Gd z>dPkKa{PF=qs9Qv0<`*Q>(-7@Y{~%|dv%LXW7)BG{3p-UPL4k>HRp-i2osyf)Rcx8*st?77#VmOb}c z;S1}l0qTQ)(K`$4awhVym3rfgH}{gmNe_I?%yOI9-bjk9|zh? z9up`k_$!`B7ij4r(Gxj>VtE`P`K(Af(5FtlPUR?;@9Un{Wn2I2Fh_n|Ex$ipa_+dq=x+y*_n z;j{k1ma?&(IBScoVsSf5-^g!oQa)v9>xsgTo>sAq?^#SYGSsM>G>te=G z4F`I`e-0Pv_*X{Gm&!UT|DU7kn{~P|{c|hxBMvo(5F=dX;Q9|A2amU-w@u-)yNYso z>)wCHMcEfQ(5(9;O!f}2zAHa7zgs9`j2=Z(ML8?dd5o5rnNrj(ahkpD)7Sh8|a14&Fc5UPxCW9b&D|L#3$p0H#gX4$YtN>G5iai+5hbi@MPD; zKNsf2DKEyvalyK(q1UD2s;;EdsAqMNY(;QE`6tS`|4JZh%Dl=%++)f- zO%nC6IpCRtd$VX7T6!j_bta;$XTD9X#$Hj3#GB@!@TdG}9_A8HSr9{WI$KKf(ubBZ zi%V#Zp0Yp|Ehe;tU5uS0j-#!|fpMpb_~9G{iP7gp5iv|l99e2&>S`il5IrS##53|w zj)lsT(CdUti6V*GQ)N^e_CPlEg;&1~sm6JT8+)#uYB+s)-t7gQi&~#(NyB-FcbpPZ zEBgD1NNBiftYaslmd#QvL(iy9hA(9&)yBOUI!PNha3^wgN&W2`I^^P#0Be;%F$yvI z+$b{gx+5ES+O89kG_prW;+z8qj48^q&_==~10%nGJHiJ1TwC`1q%+PBl60uac_ii<;i1*wrh^0;U@L2(ZxTz^TgwoQc@IzU} zQhL#~_Z}@TZrU3joCT{`L~xdt#*5HqiO!}mxPP^2jHhcdc|FlSi+}XNoxXeKQSM}j zjyuKc9LFPdj$;#bjx%P|kDG93l69VP6=TY@Fs7>?5y$BagdOlD%+*!?<0G_!Ahz=9 zHB9;X?|V_7XeDbHeVK;!lm~J&KI8Fd^u!ak9@Zn(t@pP5(M40m@hma9vf`nc-I`G5 z6rL!$8O6tNf9>d{axoGYQ@^FNNB_he!cD|F?!}TI@vdS1CY-bw|F4yck{M&n6AVR5 zQ4d5+(NcsIoyXuNrmwBgTUAVDla;CCD(i1zlmyJMFon&qX|6@O;{`NX#>@TSe#hEIKRszO1Q0xOk|V%706u$B(egqlXXsYJ-2Y z_^>b5-u6f(mVFlU=sqdV7OD0Q9ngO{mgrx6k&F(!C(xcm>y&vkQi|cGJUQmk2M$o4 zZt2bB!=4Lyq zTzx%jX0+V1%$P~dR$tGuU>=owmNiT2S(ry>uGO6^j)0X&nmMGNRcs#8vsTbv^Z|O- z0ru!Uo-YGw&w4_67J9(fv;I|D3*Q$Lt3Q7aqtA5)RSJ8_4pE!w;U}@!gXwuy>1{pe zRaJKtXXw{YWMQ8WJkDHJEUHrJ)oWO>(0do3saH>8MYs2^$(bHu5~=K_2)*JRq2GEBq50Ap+>d&8of zGZRv=LMr^(Vyw#HA8cCj0rqLKbZO8yPB0GhT3rE70t-w;$U4*F;>1u^pH!ls&#|zG z_SA*w`Imdfc`Da;#-A;Y3q*ff-zlx_#-lF$d9-dPytjFHZ^O>@IVOqEVdJ_08yCA*XCzg+T_j6qWDM{K7vK%F%yIT%{rU0aZue+DkRLtWhs9M%k)#|> zNq$}N$|#dOiCo|9m@dB9MyQX5{3NS+hscKH*{5yAHwuo(-U0OV463ac{$t0I0*vt2nbWYX+M|O=xTg3F6Um0?7d0|W()uNK^SrIi zpS*Ny#}X#elpQ%BUfWGkqm_{CSTgO8#_(}W#Skxb=%la<%lS4n4n^**_aV3UAx8>n zy#%~Rlyq0NiFbcwknO-%Mofnn0Cp9`o+c@0`FZqLBg6tjm*c%M#=7m8Pgh-+d`XdA zL^|bVJhb<}B>J{OcUS$_K<^Fu&f{wOV!fzI?enrw(0uhD@>}7H9n+ae@r5=bhh67s z8FC^0?uDbS_;SV=qMTd8nZwKX9+2Z&&q-;Y_oelo^`%u^>0fE~OW?J)<#gUpq;zZB zScT7-9isD?lK;m(9yEW(>_gCB_P4Vl(ythTv-X#bE2BO`#`pG|lIT0_GTn3V6y;?+ z*mUB@(hxq{HeL2KLMlldWuogUi#cb*RkCAxm{UN#gkxub zdXsQl1(Fz&utk0%dzf&DLH#raJ{#0dj_sIkKu-8($gvUAr-rm)m%wRZwupfjSoD4D z-uAcsy+?M4)3*96t-k+x^oR7hQFj2IAQVUc8`lTY8{&I2u%<%H*qd$9=kn~ji+h}~ z4YgFa|F~Xgtb4!ptPMdcbT|3r4Xf=9dQVG6b7X?ULMCHn#bz4o z-fx^{Ee+qWn}cci2F3MS14aGohP%yn(67Fh(KBXhiP-%y9TlQ(s9WVT)$23fEG&ye zi+7rJ)JJ)2o^ozuOZ`Wc|pAz3Zr#-Qx8hzOJg@I;OXxZxk>i-~N@U-C|IqUe&c7&AQ91PjUn6 ze(!GXPlD33qIYAwSkvYo_W0w3zfU~H`-M4p5@xUw*1&k&S<}kEPxAS!dEGv96g;ou znfJFq)NHv%O~T5a9gv2Z-XAxM_~KIDVhzuR>5swth1JIi;e^go zQ#{i=l(W-n48KVzH!%TRx1B(&f)O;9=L-${-nI|6(O7n?ac3vmh1}|7bd6>8PpI45 zs@5fcQ`KKq<38^zQtj`mlIi<rN}#J>TV%^r8IdjW^3+S!w#ZMW z*5LQUsozxDBHx;N9=|)McHzn9saNouKlLPjS5Ey7&zDTSh~K$WkKi|c>T*1fnVO8> z@Tu$YL^m}9zhvrc{KiaKMW0Ve!LM#g0)EMq>?+2bB9(d&(&i@gX&=(P-wi;zxy^@k zb0bB%`8-9sxrQR$e1Ia|yqhB3yp`E}N;*WklSSqS)@jb0YAVlQJQv3jlX^*lhyS6s zvg;&q+AA9;GO+NrRR3dv^AzZ>|1r?YJMa`e&87NFPb1a}eYwyaJm<%fb=B17i&9?S z>)%zgs`h#ZK z3x%l%H%!>@rhDqhY&u3=Fy-wdrj%?(zt+uMu|_#Xp@YR9_jy0wZ8g3%7HggT;CgGw zu04y>|I~JcJ@wDJ7vgI(tlrwz>sf0cZf~*GkH1*;4i05|))_a$R>BJ9 z1tqLdUZaE+%4?OdLU}(WtWbWK5>_bhuY?uK2Pk2M@_|ZNp?r`MRw&_HX!$===zK;A zD|9}qgcUlUQ^E?JuTsJaozE*_h0a$iVTH~Yl(0hQYm~4;=WCU)Lg)J_VTH~gri2wb z-(LwUbbf#mR_OddC9Kf-K}uMmsQ)^p{$+||sd8AMFrmv~h4P#dRw%Dh!V2YiC9F_h zt%McI3rbj_yhaHtl-DX@h4Ow%SfTtdC9F{1UkNLe4^YAiJyLB7>N_~<}Hx-mxfqh^BLS=4$-boho{{&%H%P0LH-(oWUQ`Bi(ziy{)3~xehY|5Zk*U#milRRhRp(W} z^&#SQ!fx^7c-k736we>$pJ}{bw6%LWN09nIYHqJfPN?#9&Ls7lG(9(?!w04Hbgn1$ zFKar#gGDrc!ob`;o%fM?hvxPqr!lsnr}?edTDZ8v9?bxJo=y!@U!Vc*_(42TjzOH9 zS)L+DiaDAyjK^Tx$T;^Nr8KLu4=2 zCYL8u&0CVUUmNTT@e}Gp+HTu))(O;O31`yZlBuB3XoXr88Yjh*TT(>2{y>P-R=9_F z;+)AvYe?997gKJ)73w0DO<5$4>m`-#nb>t+zPrvbn9?K{qi*wBCZ2I;QoO z-3;%wPPWW3NlT8T$NBYQov&(f&kFd>mPh$Vwf-h_#zDwBJ{zan4RU|zrN4_-wf1Wo=)VbN>IG|+;3}J>MChT!s zAw@WeEik5BGZVI;h$NL};QMH-;cYeJv3m}djW07k)X)x3(Dwhi)aX7Vl@a`C+No^d z_YS<54$F8aQ|tP*d7X<|if-&_pkEwX(3-ECuwhi1E_2+*g0kEic;_-(yxgP>jNQBl zyZw&XVPuO6J0s-sY@Xl$vZo^!8jDj!={LPcva6`f-P)Fbq;2t1X&1p;}vTfV@FI&(4! z!C?j`T6>kcmqaw=mJ;~#CBV86mJDArL1@VA&?QOY%bf$L~R$_ z$8h5}*pnvj#8)RL@kg9v#qKc-mE#h4NYa+S2Og~-6xOf8ha6KXu#SY6zVrnv`Kt$S zA7LcRihO!VTER+VLFCj4I7yWMpxp|;h>3LH8EvvdZ*J?wc@{=q1+&@HoOG16<3vb7 zzNo@i0t@(GIA(?rZaPok%Y^;oiKIgEKTU+~as*Q+P`jl)I_xvF*KLsTHWz$JmXf%j zUXmbIc3xx3FTnSY<63C!$`1IPWOb4_P2eY(X*6Gai!T(0IA(6eUXhdGX6|Mj)&mUX ze}WmpAH2ixbqksQ3C72HAXj^|d8YVOXCQ5eP|5J#euyi+p1gtP1> z4l{OVX11X$2S`N_a%+AGo-mJ-qkN*evat<2AfZf}rVidG|A8LQ+-Hw2pTC|d{}j1z zb&>KBxW9Kj346uGRQ5I__5!4SmY8}Q(HGYfT3*vLR~dXIjWIpD6xQS{V!Ebb=q?01 zqQGE`Y3R{Eu2H^8Dtu)3jN7)K_Rm}Bb+;r>7GCuOV==}a?>0Vkt{c7fHb%f+tCeB!ybH%C%0vZyf!Wm27!*`;x4 z?ME_9&z_JY? zFOa)mrSm6EC*R4^av+ZV47@7^lhB3~0$B$=$#=er_9mLDKkn9JcB{Q{zw6z6^t~SEMKN^;iAAI&086zz-jS=t>W95ZPp%I>H^c2!0mzdXv zb6QoT+rW7RQXkgVBXU*5ZuOzw@2dYrRnNzYP1z*W5bY_-X}^o&sp_eJm0D-|(TqGr zF*|wA+tw>1uK(j;ykgJ+BCb5Z{*#!$XjgdYh4x;G^1ZDYfAgr@db{xz*AQUbmEQ#Y z?ZTiO?>JUkp`Ru2vjl#Yz|Ru+|6KwTCQO+SHznpF zpByY1Y2gzlg-?ii5Qii1=l9!{87t-|CWWtwOdlVa9)4e>Ej-dT*3TC|JUskK{DJ)F zk3N4=ekpa`zsni5P$TEkL#0wOOrqOs~5t@ z(^xd{0!@lv`MLBf-Gj06hxh&WD27i^bC;#&WInTcdH9^vRd60=KJGVge=dtr7p|PT9J_+ zzU-OQ^dH3;@ZOg54CF9`N$v{yL3((`vpE^7S4dgnW_9k$9EyWt9h!zdkF-s}9k72?~{rHq4;{r!1v3=)LdJ}BanE^gOip$8@@beP3p3~pxj~x#m`tN_Pq{YZp%UA zu=PEV5v?*EM}kNf8-bfH2Ym+9@#dVAHlet)jF_gP#ttitsa z?q}gz8AtMI%>P&E=l`4XWv@^=q3r?MF;}ExSeS98w|5$@hj2~6HR}$q`w>41S2(U; z;2MrA5SIoQi|h8~-rjaxEx5kM)qv|uTwmZijcWzsEX9?E>-S20n&!WIEkK&NxG3(S zW%=J>>qI`ZJ<#zpV|gxSmy9Px+v+D*XQWEw<IUO1>2hcz9ndK`}bF$Nx(L_K0{Vai>CGfKZewM(`68KpH|4&Kacjnp2;R~{{ zSe%_IF3nzXr_=o-iZnEohAV*qq##_@TMO@%=^qrjXNDa9M4`V|;*C(~tOWV}3kp>w Y%Heh;{l6>W+X_9d&~wWBcZbmb0Xhc<(f|Me literal 0 HcmV?d00001 diff --git a/roms/Makefile b/roms/Makefile index 078d3fb705..562ed726fd 100644 --- a/roms/Makefile +++ b/roms/Makefile @@ -37,6 +37,8 @@ find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1)))) powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64) powerpc_cross_prefix := $(call find-cross-prefix,powerpc) x86_64_cross_prefix := $(call find-cross-prefix,x86_64) +riscv32_cross_prefix := $(call find-cross-prefix,riscv32) +riscv64_cross_prefix := $(call find-cross-prefix,riscv64) # tag our seabios builds SEABIOS_EXTRAVERSION="-prebuilt.qemu.org" @@ -52,18 +54,21 @@ EDK2_EFIROM = edk2/BaseTools/Source/C/bin/EfiRom default: @echo "nothing is build by default" @echo "available build targets:" - @echo " bios -- update bios.bin (seabios)" - @echo " vgabios -- update vgabios binaries (seabios)" - @echo " sgabios -- update sgabios binaries" - @echo " pxerom -- update nic roms (bios only)" - @echo " efirom -- update nic roms (bios+efi)" - @echo " slof -- update slof.bin" - @echo " skiboot -- update skiboot.lid" - @echo " u-boot.e500 -- update u-boot.e500" - @echo " u-boot.sam460 -- update u-boot.sam460" - @echo " efi -- update UEFI (edk2) platform firmware" - @echo " clean -- delete the files generated by the previous" \ - "build targets" + @echo " bios -- update bios.bin (seabios)" + @echo " vgabios -- update vgabios binaries (seabios)" + @echo " sgabios -- update sgabios binaries" + @echo " pxerom -- update nic roms (bios only)" + @echo " efirom -- update nic roms (bios+efi)" + @echo " slof -- update slof.bin" + @echo " skiboot -- update skiboot.lid" + @echo " u-boot.e500 -- update u-boot.e500" + @echo " u-boot.sam460 -- update u-boot.sam460" + @echo " efi -- update UEFI (edk2) platform firmware" + @echo " opensbi32-virt -- update OpenSBI for 32-bit virt machine" + @echo " opensbi64-virt -- update OpenSBI for 64-bit virt machine" + @echo " opensbi64-sifive_u -- update OpenSBI for 64-bit sifive_u machine" + @echo " clean -- delete the files generated by the previous" \ + "build targets" bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin @@ -162,6 +167,24 @@ skiboot: efi: edk2-basetools $(MAKE) -f Makefile.edk2 +opensbi32-virt: + $(MAKE) -C opensbi \ + CROSS_COMPILE=$(riscv32_cross_prefix) \ + PLATFORM="qemu/virt" + cp opensbi/build/platform/qemu/virt/firmware/fw_jump.bin ../pc-bios/opensbi-riscv32-virt-fw_jump.bin + +opensbi64-virt: + $(MAKE) -C opensbi \ + CROSS_COMPILE=$(riscv64_cross_prefix) \ + PLATFORM="qemu/virt" + cp opensbi/build/platform/qemu/virt/firmware/fw_jump.bin ../pc-bios/opensbi-riscv64-virt-fw_jump.bin + +opensbi64-virt: + $(MAKE) -C opensbi \ + CROSS_COMPILE=$(riscv64_cross_prefix) \ + PLATFORM="qemu/sifive_u" + cp opensbi/build/platform/qemu/virt/firmware/fw_jump.bin ../pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin + clean: rm -rf seabios/.config seabios/out seabios/builds $(MAKE) -C sgabios clean @@ -173,3 +196,4 @@ clean: $(MAKE) -C u-boot-sam460ex distclean $(MAKE) -C skiboot clean $(MAKE) -f Makefile.edk2 clean + $(MAKE) -C opensbi clean diff --git a/roms/opensbi b/roms/opensbi new file mode 160000 index 0000000000..ca20ac0cd4 --- /dev/null +++ b/roms/opensbi @@ -0,0 +1 @@ +Subproject commit ca20ac0cd4c099006d4eea4d9ac7bd7b58e2ae0f From patchwork Mon Jun 24 22:12:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 11014263 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5C3CD13AF for ; Mon, 24 Jun 2019 22:23:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 48D01288D3 for ; Mon, 24 Jun 2019 22:23:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3CC1228AA0; Mon, 24 Jun 2019 22:23:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.0 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A3E82288D3 for ; Mon, 24 Jun 2019 22:23:58 +0000 (UTC) Received: from localhost ([::1]:55036 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXNV-0001fP-Oh for patchwork-qemu-devel@patchwork.kernel.org; Mon, 24 Jun 2019 18:23:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58815) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hfXES-0002KL-TX for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hfXEO-00005F-Oz for qemu-devel@nongnu.org; Mon, 24 Jun 2019 18:14:34 -0400 Received: from esa2.hgst.iphmx.com ([68.232.143.124]:7996) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hfXEM-0008U3-JI; Mon, 24 Jun 2019 18:14:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1561414516; x=1592950516; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=CqeGaTwLwtSj5t8Bw5VBD9Fwg69+EafHOWkeml/LuM8=; b=N3ZGZfEtGPok2+/f8cE+a7dKd0m/GTvskmYauZTKETJLv1TpQdWJ2/GQ 5XMMbUpVJxjEKDwniIFOJDULYJrSkjpx0u4B81vtcHelIURUeyWAcX7r1 dj+0m+K05PJRSRbCNZlUs/7lJVvgiLNUOamIW/4CnY1ytOzuzmsEzJRgG 9qG2k1jJP5BusL8Rldp6Onc3iSaOlG9lPkwi7Fqznmoh5zmT+j5noiqcI We5T21MR/TnZpI+A7HtwA1XQ4WRXrCPf04g5UcKW72AMSBLUT/a3xdOuX 2TQa+jFxsbTOKhmHa2pGGmI2beiI8vcD5Uu8rh3lDWkTXM6wIUpczlJdd A==; X-IronPort-AV: E=Sophos;i="5.63,413,1557158400"; d="scan'208";a="211210932" Received: from h199-255-45-15.hgst.com (HELO uls-op-cesaep02.wdc.com) ([199.255.45.15]) by ob1.hgst.iphmx.com with ESMTP; 25 Jun 2019 06:15:14 +0800 IronPort-SDR: s6zFBDL4cMDhcbrf0NEwupcZfAd4ZXWz5hqBkNCoyEcyLgtyV2yy95oBDrvrWSJ+OcwuHKtuJN k01DcN5wyQhI0J0VUDNVpZmN+wWqo4MNMHlvu96P2UIJclK6ViqBfAnRKdfULD05n9vJW/BipF e8/EcwEDrIjZy4QcVFHzd1PrkdkGBoVeEmFXpvP0nUzASQgngIAHSNzRd99r/cQoaMb3JCWLf2 o/0GGe+xvZ/VojHYWvD/styiC9lonxI5mCsMBqrNorixi/yfhUYc8lDkDTfBD3UGCyIXfnOJAK CA009eT3Fu4UkApv7S+k42DW Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep02.wdc.com with ESMTP; 24 Jun 2019 15:13:47 -0700 IronPort-SDR: Rj8S4SVPXB5XQRWwVqB5psbA9bYHP8YrCOSi0TWkdPYPbhQ1w09IvFgiPK5uQkkJ9m/9RNiWY+ JYIeUyW4xlmJNOaWdF9aFsiCy8NtmiFCH1EY5rQ9mjqg47WYMboONNHBehYu5TvGzjymnATVet J/XGG9rFdhhgiPpKOZjKQEl44ZBISAWMY4umXJyQ9Ax6PD8p0NeZMeRLFsKn+sZjRflKMDPVU8 0NJ1rvxIdpafBgHQRFJYWcIQ5Jlw8FVe7iN4giDepsPIo68pXXOJNsuRCSkq+cfXDo4MicsLS7 Euk= Received: from risc6-mainframe.sdcorp.global.sandisk.com (HELO risc6-mainframe.int.fusionio.com) ([10.196.157.140]) by uls-op-cesaip02.wdc.com with ESMTP; 24 Jun 2019 15:14:29 -0700 From: Alistair Francis To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Date: Mon, 24 Jun 2019 15:12:00 -0700 Message-Id: <7f51ed96a93bf46f76dbdfac61e4d14002d40e08.1561414240.git.alistair.francis@wdc.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 68.232.143.124 Subject: [Qemu-devel] [PATCH v1 5/5] hw/riscv: Load OpenSBI as the default firmware 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: alistair23@gmail.com, palmer@sifive.com, alistair.francis@wdc.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP If the user hasn't specified a firmware to load (with -bios) or specified no bios (with -bios none) then load OpenSBI by default. This allows users to boot a RISC-V kernel with just -kernel. Signed-off-by: Alistair Francis Reviewed-by: Bin Meng Tested-by: Bin Meng --- hw/riscv/boot.c | 49 +++++++++++++++++++++++++++++++++++++++++ hw/riscv/sifive_u.c | 7 +++--- hw/riscv/virt.c | 11 ++++++--- include/hw/riscv/boot.h | 3 +++ qemu-deprecated.texi | 20 +++++++++++++++++ 5 files changed, 84 insertions(+), 6 deletions(-) diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index ff023f42d0..c7d72f682f 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -18,6 +18,7 @@ */ #include "qemu/osdep.h" +#include "qemu-common.h" #include "qemu/units.h" #include "qemu/error-report.h" #include "exec/cpu-defs.h" @@ -32,6 +33,54 @@ # define KERNEL_BOOT_ADDRESS 0x80200000 #endif +void riscv_find_and_load_firmware(MachineState *machine, + const char *default_machine_firmware, + hwaddr firmware_load_addr) +{ + char *firmware_filename; + + if (!machine->firmware) { + /* + * The user didn't specify -bios. + * At the moment we default to loading nothing when this hapens. + * In the future this defaul will change to loading the prebuilt + * OpenSBI firmware. Let's warn the user and then continue. + */ + warn_report("No -bios option specified. Not loading a firmware."); + warn_report("This default will change in QEMU 4.3. Please use the " \ + "-bios option to aviod breakages when this happens."); + warn_report("See QEMU's deprecation documentation for details"); + return; + } + + if (!strcmp(machine->firmware, "default")) { + /* + * The user has specified "-bios default". That means we are going to + * load the OpenSBI binary included in the QEMU source. + * + * We can't load the binary by default as it will break existing users + * as users are already loading their own firmware. + * + * Let's try to get everyone to specify the -bios option at all times, + * so then in the future we can make "-bios default" the default option + * if no -bios option is set without breaking anything. + */ + firmware_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, + default_machine_firmware); + } else { + firmware_filename = machine->firmware; + } + + if (strcmp(firmware_filename, "none")) { + /* If not "none" load the firmware */ + riscv_load_firmware(firmware_filename, firmware_load_addr); + } + + if (!strcmp(machine->firmware, "default")) { + g_free(firmware_filename); + } +} + target_ulong riscv_load_firmware(const char *firmware_filename, hwaddr firmware_load_addr) { diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index a04f2d0754..d308aec592 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -49,6 +49,8 @@ #include +#define BIOS_FILENAME "opensbi-riscv64-sifive_u-fw_jump.bin" + static const struct MemmapEntry { hwaddr base; hwaddr size; @@ -266,9 +268,8 @@ static void riscv_sifive_u_init(MachineState *machine) /* create device tree */ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline); - if (machine->firmware) { - riscv_load_firmware(machine->firmware, memmap[SIFIVE_U_DRAM].base); - } + riscv_find_and_load_firmware(machine, BIOS_FILENAME, + memmap[SIFIVE_U_DRAM].base); if (machine->kernel_filename) { riscv_load_kernel(machine->kernel_filename); diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 7fcc8c03b5..260e6e8e4d 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -44,6 +44,12 @@ #include +#if defined(TARGET_RISCV32) +# define BIOS_FILENAME "opensbi-riscv32-virt-fw_jump.bin" +#else +# define BIOS_FILENAME "opensbi-riscv64-virt-fw_jump.bin" +#endif + static const struct MemmapEntry { hwaddr base; hwaddr size; @@ -380,9 +386,8 @@ static void riscv_virt_board_init(MachineState *machine) memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base, mask_rom); - if (machine->firmware) { - riscv_load_firmware(machine->firmware, memmap[VIRT_DRAM].base); - } + riscv_find_and_load_firmware(machine, BIOS_FILENAME, + memmap[VIRT_DRAM].base); if (machine->kernel_filename) { uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename); diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index daa179b600..d56f2ae3eb 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -20,6 +20,9 @@ #ifndef RISCV_BOOT_H #define RISCV_BOOT_H +void riscv_find_and_load_firmware(MachineState *machine, + const char *default_machine_firmware, + hwaddr firmware_load_addr); target_ulong riscv_load_firmware(const char *firmware_filename, hwaddr firmware_load_addr); target_ulong riscv_load_kernel(const char *kernel_filename); diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi index df04f2840b..b0494c3350 100644 --- a/qemu-deprecated.texi +++ b/qemu-deprecated.texi @@ -88,6 +88,26 @@ The @code{-realtime mlock=on|off} argument has been replaced by the The ``-virtfs_synth'' argument is now deprecated. Please use ``-fsdev synth'' and ``-device virtio-9p-...'' instead. +@subsection RISC-V -bios (since 4.1) + +QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the +RISC-V virt machine and sifive_u machine. + +QEMU 4.1 has no changes to the default behaviour to avoid breakages. This +default will change in a future QEMU release, so please prepare now. All users +of the virt or sifive_u machine must change their command line usage. + +QEMU 4.1 has three options, please migrate to one of these three: + 1. ``-bios none`` - This is the current default behavior if no -bios option + is included. QEMU will not automatically load any firmware. It is up + to the user to load all the images they need. + 2. ``-bios default`` - In a future QEMU release this will become the default + behaviour if no -bios option is specified. This option will load the + default OpenSBI firmware automatically. The firmware is included with + the QEMU release and no user interaction is required. All a user needs + to do is specify the kernel they want to boot with the -kernel option + 3. ``-bios `` - Tells QEMU to load the specified file as the firmwrae. + @section QEMU Machine Protocol (QMP) commands @subsection block-dirty-bitmap-add "autoload" parameter (since 2.12.0)