From nobody Tue Feb 10 11:17:09 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail header.i=@wdc.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; dmarc=fail(p=none dis=none) header.from=wdc.com ARC-Seal: i=1; a=rsa-sha256; t=1588193104; cv=none; d=zohomail.com; s=zohoarc; b=MVs+VDKCqnhsORGL99VBGaTmP6JLFml3HyG4nsWqmjhEZvnsTKE+79BPPYXf4sR5UkSy0+3no1bCofM9CNPHD7WsYsLirxCMZQlazWTY2K54rHU1NhzpxXSuQws52MtrcRLEbsXIKH5q9uI/7V41SPFfNw2uiiKp+IcuCzpqx/Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1588193104; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=QaVSYy37uL1QJ0rfyu46qwTh3pVihkaAoif0pqvso1I=; b=iLdRUrWZdH8Q8ZlTgiuoLC9eZadd95X0O+k/YBugvOw5pVdVOsCGUJn5brcL25khVAtiq8X5IgNs7rl19UQKFobmggire08mmdum2ftg0NCQZ10T9aT/Tr+/5CwK8nitzOdzlMBfK95kiO4RX3LepI7OWQtyR49EjyFpfS+bXcQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail header.i=@wdc.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; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1588193104977823.3695874801701; Wed, 29 Apr 2020 13:45:04 -0700 (PDT) Received: from localhost ([::1]:37322 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jTtZn-0005MJ-IW for importer@patchew.org; Wed, 29 Apr 2020 16:45:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53858) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jTtOn-000800-Sn for qemu-devel@nongnu.org; Wed, 29 Apr 2020 16:37:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.90_1) (envelope-from ) id 1jTtOA-0006uM-1Q for qemu-devel@nongnu.org; Wed, 29 Apr 2020 16:33:41 -0400 Received: from esa4.hgst.iphmx.com ([216.71.154.42]:7549) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jTtKM-00065w-39; Wed, 29 Apr 2020 16:29:06 -0400 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; 30 Apr 2020 04:28:41 +0800 Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Apr 2020 13:18:46 -0700 Received: from usa004631.ad.shared (HELO risc6-mainframe.hgst.com) ([10.86.56.145]) by uls-op-cesaip01.wdc.com with ESMTP; 29 Apr 2020 13:28:41 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1588192146; x=1619728146; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=8K43csOgq64VK9+paDVKjdj7aHmol+gVY4vaWz2xTyg=; b=QtzIKC7SIx1xQ+7vgMSBqunwICSKYfANrV7B1eRckMa5CG6mg6uSoQ3K HgsniZ/HfgwNezBp01HrXWQUipWplPJoM6C1xJxIiYq95fy8WFY2bQljL 8U1tybc8V46s7510RSdGlfVdWFyZypwfIldFxBAUokttdwAIMOu/F1ozL 2VyiTKG3Ua3R+2EPbGaBF4tfsp6STqv22sQJ+qQJ/GwSr2Pk4xKzC5yD/ q5mKTxWajBtvvU18v2I5ouspGnHMD78J9mIT3ZAWf+AP99OE4bNArDjYN 5Dwj9ilyQMDZr7zO2dikZJM8x0QX9qrnFIidpfqgbaxavI1YWaNsBnuDT A==; IronPort-SDR: E1LJvxRvRWHvGsxLdxG6VBoqEvfvzb0rs4KWax+GI+sG++kBIQHMk7TpVorYEr44asLiwkoX/c BE2dncH0hu5NF+/pFvGzauPgoLPm1B8AbbtSTUFIx7NPzWuf/AnaNuqo9wRao5F1Lz8FAltQfg Ay+e2277503Q3sLdrAXv4RILKOgYmy3qVw14ZEItrSuW96Dvisg9CcqfD8bjJoZaoTPV47/GyC DY7KJrA9cL51iziccZFwCc5E3i1cz77odBvSIW4/D0suGYoOYiOdOK2KqmV3z+EdQfKnN429J7 71k= X-IronPort-AV: E=Sophos;i="5.73,333,1583164800"; d="scan'208";a="136507042" IronPort-SDR: LGciCVkuQWL/jCldNBXep+SSLRJMvVfHcvmGxOhtbTkm65v4UYjljSl6ufRy0Ctyq8AVPdEPjk UcXzuMjsbwarwmOuKzD5iiL6hDg74GF48= IronPort-SDR: HIw8vDGu0W6LgtZ12Kx87k7c4AV6tn8AdbLI61I5BI49X9ORaml2BAJ42L1CzlVjBCEjyOFfbH 8sX5jzwqq5Iw== WDCIronportException: Internal From: Alistair Francis To: peter.maydell@linaro.org Subject: [PULL v2 12/14] hw/riscv: Add optional symbol callback ptr to riscv_load_firmware() Date: Wed, 29 Apr 2020 13:20:04 -0700 Message-Id: <20200429202006.775322-13-alistair.francis@wdc.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200429202006.775322-1-alistair.francis@wdc.com> References: <20200429202006.775322-1-alistair.francis@wdc.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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: pass client-ip=216.71.154.42; envelope-from=prvs=381fbd49e=alistair.francis@wdc.com; helo=esa4.hgst.iphmx.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/04/29 16:28:37 X-ACL-Warn: Detected OS = FreeBSD 9.x or newer [fuzzy] X-Received-From: 216.71.154.42 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: Alistair Francis , Anup Patel , palmerdabbelt@google.com, qemu-riscv@nongnu.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Anup Patel This patch adds an optional function pointer, "sym_cb", to riscv_load_firmware() which provides the possibility to access the symbol table during kernel loading. The pointer is ignored, if supplied with flat (non-elf) firmware image. The Spike board requires it locate the HTIF symbols from firmware ELF passed via "-bios" option. Signed-off-by: Anup Patel Reviewed-by: Alistair Francis Message-id: 20200427080644.168461-2-anup.patel@wdc.com Message-Id: <20200427080644.168461-2-anup.patel@wdc.com> Signed-off-by: Alistair Francis --- hw/riscv/boot.c | 13 ++++++++----- hw/riscv/sifive_u.c | 2 +- hw/riscv/virt.c | 2 +- include/hw/riscv/boot.h | 6 ++++-- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index b8e765277d..726300a171 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -36,7 +36,8 @@ =20 void riscv_find_and_load_firmware(MachineState *machine, const char *default_machine_firmware, - hwaddr firmware_load_addr) + hwaddr firmware_load_addr, + symbol_fn_t sym_cb) { char *firmware_filename =3D NULL; =20 @@ -76,7 +77,7 @@ void riscv_find_and_load_firmware(MachineState *machine, =20 if (firmware_filename) { /* If not "none" load the firmware */ - riscv_load_firmware(firmware_filename, firmware_load_addr); + riscv_load_firmware(firmware_filename, firmware_load_addr, sym_cb); g_free(firmware_filename); } } @@ -96,12 +97,14 @@ char *riscv_find_firmware(const char *firmware_filename) } =20 target_ulong riscv_load_firmware(const char *firmware_filename, - hwaddr firmware_load_addr) + hwaddr firmware_load_addr, + symbol_fn_t sym_cb) { uint64_t firmware_entry, firmware_start, firmware_end; =20 - if (load_elf(firmware_filename, NULL, NULL, NULL, &firmware_entry, - &firmware_start, &firmware_end, NULL, 0, EM_RISCV, 1, 0) = > 0) { + if (load_elf_ram_sym(firmware_filename, NULL, NULL, NULL, + &firmware_entry, &firmware_start, &firmware_end, = NULL, + 0, EM_RISCV, 1, 0, NULL, true, sym_cb) > 0) { return firmware_entry; } =20 diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index e32355a691..bed10fcfa8 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -352,7 +352,7 @@ static void sifive_u_machine_init(MachineState *machine) create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline); =20 riscv_find_and_load_firmware(machine, BIOS_FILENAME, - memmap[SIFIVE_U_DRAM].base); + memmap[SIFIVE_U_DRAM].base, NULL); =20 if (machine->kernel_filename) { uint64_t kernel_entry =3D riscv_load_kernel(machine->kernel_filena= me, diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index c621a970aa..daae3ebdbb 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -511,7 +511,7 @@ static void riscv_virt_board_init(MachineState *machine) mask_rom); =20 riscv_find_and_load_firmware(machine, BIOS_FILENAME, - memmap[VIRT_DRAM].base); + memmap[VIRT_DRAM].base, NULL); =20 if (machine->kernel_filename) { uint64_t kernel_entry =3D riscv_load_kernel(machine->kernel_filena= me, diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index df80051fbc..474a940ad5 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -24,10 +24,12 @@ =20 void riscv_find_and_load_firmware(MachineState *machine, const char *default_machine_firmware, - hwaddr firmware_load_addr); + hwaddr firmware_load_addr, + symbol_fn_t sym_cb); char *riscv_find_firmware(const char *firmware_filename); target_ulong riscv_load_firmware(const char *firmware_filename, - hwaddr firmware_load_addr); + hwaddr firmware_load_addr, + symbol_fn_t sym_cb); target_ulong riscv_load_kernel(const char *kernel_filename, symbol_fn_t sym_cb); hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size, --=20 2.26.2