From nobody Mon Feb 9 13:05:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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 1767964749961172.29943434541963; Fri, 9 Jan 2026 05:19:09 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1veCNY-00074e-2U; Fri, 09 Jan 2026 08:18:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1veCN3-0006yB-90 for qemu-devel@nongnu.org; Fri, 09 Jan 2026 08:17:43 -0500 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1veCMw-0005tH-QJ for qemu-devel@nongnu.org; Fri, 09 Jan 2026 08:17:36 -0500 Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-2a0a33d0585so29152045ad.1 for ; Fri, 09 Jan 2026 05:17:30 -0800 (PST) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a3e3c47390sm106103735ad.25.2026.01.09.05.17.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Jan 2026 05:17:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767964649; x=1768569449; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=bdGoioyK2QiPOyfMp3O2eTqnnXisFArETNv4sYqKAKU=; b=mafPjb9lqyHwYP9IlRH6HKtoBif1mqzxYjcps8ylFUTfTU3e5fDZiLQq9JaPayVmv1 9oM94ZTaZlX98myjc/DuMeD1Kt8wnkmSdpUi+oxvi6srp13gLVKGQ245s1uSp5HG4kuF 4bd3pMsVEulOmrshJkR2SAiL+zsYhjMEz0kpL0PtdT+s0pYbV3vKj4Qk/TXbQPjh7pja XK4oXPm3+JxnOI4C1SpjFn9ECMWuQpvwC16lV7EwNI2QrKduXF94Xd0BfvBOTScrRujq G1bdyFxyDbS1gBOzWu7pdDuqt5W5asgcoVFC9SHgai9+c8RJdw/6Uknmy1MMfUXEuofk 0RmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767964649; x=1768569449; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bdGoioyK2QiPOyfMp3O2eTqnnXisFArETNv4sYqKAKU=; b=reDma1So2/JesRryJX4UZWWJBmQP1jmIbtoaQFD31JS+iyNIMQqm4qi0y4tULeIV2+ RdkVlxRk2ewI6l9rmz3ebqs8wo5L5oMYHKmBzNxeHoLZZxTVkA/cjTfE92MGxhwGM/Vi /8dQo3mT+omUoZDYJcHsnRsk7F8o5aaXMloAQW5gdiWeYJoVcdMkUS/vnCHz6WOj84a4 88c+dQBKy4WmA3sb3gwUcGqLIA8mwgbPzAshs2CoA8m66bqcKXqasPmpWVDVIQWZthn8 kB2EVhZomi7GRY8Lf8A9bhk2rUo326B/O/PqEfdMgO+Tr1G1cdEYD30i94Qj8RY40AFB sytw== X-Forwarded-Encrypted: i=1; AJvYcCWov7QD4KyEWAQQRbj3mrc1ZGzS/6QHy9rk293N73RQp8o9QUk/oT9Y09eWJOEVFraztJAZPsJkVthq@nongnu.org X-Gm-Message-State: AOJu0YwpURCgDY7r07Q3jcMz6JMMzAoOKrZgBlvrqBGXalTIkjq3YsZY 6MXI59JrvuBoBGOMeSwiA/oWBp8S+a4oUdKi74PJ7KflLgqaKMh6EIPm X-Gm-Gg: AY/fxX5uBwNczHeTMCPvBsH24uyxfJ4oWMDgwTAPXZq+y05pEH8R9exVt6fIwL4EKBP +o9I95doTN8ltmEpakehRZZsERK0Yldb8XRtFi95GbZ8V+nuD9COjZtZ32ewJYTg+Weg9VdtJ7u Eiy4aZNTrwSW50OVwVwG3PiKDEfMX0U+93j+sUaGf3tgMODn9o8OHRRz25L4/ALiQHz9EJ/2g8r D3PQfB+FKGt2Zcl2ayeLdHB7ox76X2kRlDK9XTj+E2RpQOPnvfUSfNwpeP/ft/2yNISDkZuAI/K NKItoiD+CE2nW4Ct0AAPjBpQZxZmYbojhLGyg/OQCkbqgopmiqQ7N1e+tFw1LvFGliLpsf7Foyt 3aA5e1hfRjcO/vCwqeRjYShL8VinExSdUaOJAXusyjq1KaSNB8WB1joxbFspbqg9sFMI3xVY8jx /oFqFyow0V9QLTzUPk8gn1 X-Google-Smtp-Source: AGHT+IEL9n52ei84W9xn7OVtF8WoJOOzh4g541L875Gw/s42e1h6ru0IcBxYJqy7fZ/YPzVGKEj1Ng== X-Received: by 2002:a17:902:cf05:b0:2a0:97d2:a264 with SMTP id d9443c01a7336-2a3ee49015dmr86832435ad.37.1767964649069; Fri, 09 Jan 2026 05:17:29 -0800 (PST) From: Joel Stanley To: Alistair Francis , Daniel Henrique Barboza , qemu-devel@nongnu.org Cc: Nicholas Piggin , Weiwei Li , Liu Zhiwei , Vijai Kumar K , Ran Wang , Michael Ellerman , Joel Stanley , Nick Piggin , Anirudh Srinivasan , qemu-riscv@nongnu.org Subject: [PATCH 1/4] hw/riscv/boot: Describe discontiguous memory in boot_info Date: Fri, 9 Jan 2026 23:46:52 +1030 Message-ID: <20260109131657.396794-2-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260109131657.396794-1-joel@jms.id.au> References: <20260109131657.396794-1-joel@jms.id.au> 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 (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=2607:f8b0:4864:20::635; envelope-from=joel.stan@gmail.com; helo=mail-pl1-x635.google.com X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1767964752901158500 Content-Type: text/plain; charset="utf-8" From: Nicholas Piggin Machines that have discontiguous memory may need to adjust where firmware and images are loaded at boot. Provide an interfaces for machines to describe a discontiguous low/high RAM scheme for this purpose. Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley Reviewed-by: Daniel Henrique Barboza --- include/hw/riscv/boot.h | 7 +++++++ hw/riscv/boot.c | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index f00b3ca12245..115e3222174f 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -28,6 +28,10 @@ #define RISCV64_BIOS_BIN "opensbi-riscv64-generic-fw_dynamic.bin" =20 typedef struct RISCVBootInfo { + /* First contiguous RAM region. If size is zero then assume entire RAM= */ + hwaddr ram_low_start; + hwaddr ram_low_size; + ssize_t kernel_size; hwaddr image_low_addr; hwaddr image_high_addr; @@ -43,6 +47,9 @@ bool riscv_is_32bit(RISCVHartArrayState *harts); char *riscv_plic_hart_config_string(int hart_count); =20 void riscv_boot_info_init(RISCVBootInfo *info, RISCVHartArrayState *harts); +void riscv_boot_info_init_discontig_mem(RISCVBootInfo *info, + RISCVHartArrayState *harts, + hwaddr start, hwaddr size); vaddr riscv_calc_kernel_start_addr(RISCVBootInfo *info, hwaddr firmware_end_addr); hwaddr riscv_find_and_load_firmware(MachineState *machine, diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index e5490beda007..9babb85b0458 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -69,11 +69,22 @@ char *riscv_plic_hart_config_string(int hart_count) =20 void riscv_boot_info_init(RISCVBootInfo *info, RISCVHartArrayState *harts) { + info->ram_low_start =3D 0; + info->ram_low_size =3D 0; info->kernel_size =3D 0; info->initrd_size =3D 0; info->is_32bit =3D riscv_is_32bit(harts); } =20 +void riscv_boot_info_init_discontig_mem(RISCVBootInfo *info, + RISCVHartArrayState *harts, + hwaddr start, hwaddr size) +{ + riscv_boot_info_init(info, harts); + info->ram_low_start =3D start; + info->ram_low_size =3D size; +} + vaddr riscv_calc_kernel_start_addr(RISCVBootInfo *info, hwaddr firmware_end_addr) { if (info->is_32bit) { --=20 2.47.3 From nobody Mon Feb 9 13:05:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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 1767964762482801.441104950397; Fri, 9 Jan 2026 05:19:22 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1veCND-00071H-GQ; Fri, 09 Jan 2026 08:17:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1veCN5-0006yI-Gr for qemu-devel@nongnu.org; Fri, 09 Jan 2026 08:17:44 -0500 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1veCN1-0005u1-Qg for qemu-devel@nongnu.org; Fri, 09 Jan 2026 08:17:42 -0500 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-2a3e76d0f64so14192265ad.1 for ; Fri, 09 Jan 2026 05:17:35 -0800 (PST) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a3e3c47390sm106103735ad.25.2026.01.09.05.17.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Jan 2026 05:17:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767964654; x=1768569454; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=F/yvKgL4XUpT4wTLDPBCE3z/j1k7RmMU+ZeLwFn8WEU=; b=bMDxnCWJO14azZcGtPdkCqik8pFAwm2TnyZWivc356qdqu5fBYOJ79unf33f+TaJeg RKEM0Az+jIofKd2jH+XqEf5LRN7JrgMz/GbPDkKL4gmEhY+03ebRmnHhj3h8mZNsdU7M /oqiOkz2McrId9OSGdL+N3Uknp58hBosZWV+EGqWSg8lCH7PNa/4h0Ga0VRUqbLlgAXq xsKLb1wRVSgKI/dZF3p5iggyRl33xl7oZPmPArLwiyLIOgCISArm/ZGRrAXOLHAMseMP /TCfLzVE7CtlZlK6vOpIDbjLejIwnQXImkE8d0RXRbPNwUJ99+hy8zZWmOIrm0IVkrQJ NjTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767964654; x=1768569454; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=F/yvKgL4XUpT4wTLDPBCE3z/j1k7RmMU+ZeLwFn8WEU=; b=CHo2E1Hp1M2BTComjvXfOTMTRbFP9ginkmjplNzLMzuRNbXc7CYJi1YoASRoDVblG5 gKjXCh6azSnwvmHo8T9Iyxq+tBguSOEy4e48kOzaIOMsCXHL4YqbsD5jhpGKjh129SUo lR+MJ9TmGMEownhaaCQRi0+8exT+r8JAz9KCH3EXtZf31eyvi+Uv+FMBYoEur/SWVmfp Jz5gFCvU8kmfrcV6I7zbH/nDhU9/vZNhh0MzqBEFsRPov9WVr8PfTfdhunad4fHkeEta KNYwqfdxQCBJrML1HNDFZUwQQKnNRh6nDzxY/nf1NYc+HOYOyv+NyI1UWjJ46KOt9zk2 7M3w== X-Forwarded-Encrypted: i=1; AJvYcCVzkAkQSNagJ+s+h8ClXCvvpAXESL4YX8ykRz6hDg/3DKqwd6i0siTxSEyIsWAq286iNxk5NhrqH7XL@nongnu.org X-Gm-Message-State: AOJu0Yz342apxn86ae0uTKmMMa9ydxGyHAcl/4P3B96sbuN6Oj+yrCMR 31b3TX4WnfZjskB26nhKnKxOUsg3t072Wg/qFv0XGXRH+FjUxJsOenF/A/4yaQ== X-Gm-Gg: AY/fxX66oZbySsNaJ3es1ydMg/HJwG9UkRVxneKRDAwETOI4q0XFB/PkX1bjr7ffQAu IvF6AJs5/tGRdHTChbJIJT3/JBmMGYnzpm6MlNePu1O5CoDA2d15m24bRIL6olBylZxZmgS/Ins li/wd40kRg3O5GXOBSR46EyMGjFkaZGBU7uavqVBunKdOtS/QFpLt40hnxFqnz5+Ktki0z98l3j 3E4HM4qTJtoj162F2BMFybws/9ifsrvF31n1C0WoHgT+7AePbV6Pbcxcv88ckNbcGYME1fHr6LU hmP5xOp4yZ0sjvn8pOQytXMZ6nLPDp6ZOaK5sGSAJFiYBx1gQE04DQkX9g5VJfNCqg7sS30qbpB 1A7/RDirlcdY1W5p+sBDEX4oxAr3wBO8VZnT2uzAHeEX3o5ZaYbzqYf1+mc7oVtkKPxuuECNNM+ bhQBJtKh1jh1Yaz05mCWtdiuTio5HvoUY= X-Google-Smtp-Source: AGHT+IET9Pp9VaOesCtjfHleGLyyYODxS1kIdzNQn4TPGhDTEiiF7qEJNdgaXjM/iZMcehav22po7w== X-Received: by 2002:a17:902:f791:b0:29a:69d:acdc with SMTP id d9443c01a7336-2a3edba6425mr93234455ad.25.1767964654363; Fri, 09 Jan 2026 05:17:34 -0800 (PST) From: Joel Stanley To: Alistair Francis , Daniel Henrique Barboza , qemu-devel@nongnu.org Cc: Nicholas Piggin , Weiwei Li , Liu Zhiwei , Vijai Kumar K , Ran Wang , Michael Ellerman , Joel Stanley , Nick Piggin , Anirudh Srinivasan , qemu-riscv@nongnu.org Subject: [PATCH 2/4] hw/riscv/boot: Account for discontiguous memory when loading firmware Date: Fri, 9 Jan 2026 23:46:53 +1030 Message-ID: <20260109131657.396794-3-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260109131657.396794-1-joel@jms.id.au> References: <20260109131657.396794-1-joel@jms.id.au> 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 (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=2607:f8b0:4864:20::62f; envelope-from=joel.stan@gmail.com; helo=mail-pl1-x62f.google.com X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1767964765156158500 Content-Type: text/plain; charset="utf-8" From: Nicholas Piggin This loads firmware into the first (low) memory range, accounting for machines having discontiguous memory regions. Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley Reviewed-by: Daniel Henrique Barboza --- include/hw/riscv/boot.h | 5 ++++- hw/riscv/boot.c | 18 ++++++++++++------ hw/riscv/microchip_pfsoc.c | 6 ++++-- hw/riscv/opentitan.c | 6 ++++-- hw/riscv/shakti_c.c | 6 +++++- hw/riscv/sifive_u.c | 3 ++- hw/riscv/spike.c | 6 ++++-- hw/riscv/virt.c | 7 ++++--- hw/riscv/xiangshan_kmh.c | 6 +++++- 9 files changed, 44 insertions(+), 19 deletions(-) diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index 115e3222174f..fb90bf12399e 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -53,13 +53,16 @@ void riscv_boot_info_init_discontig_mem(RISCVBootInfo *= info, vaddr riscv_calc_kernel_start_addr(RISCVBootInfo *info, hwaddr firmware_end_addr); hwaddr riscv_find_and_load_firmware(MachineState *machine, + RISCVBootInfo *info, const char *default_machine_firmware, hwaddr *firmware_load_addr, symbol_fn_t sym_cb); const char *riscv_default_firmware_name(RISCVHartArrayState *harts); char *riscv_find_firmware(const char *firmware_filename, const char *default_machine_firmware); -hwaddr riscv_load_firmware(const char *firmware_filename, +hwaddr riscv_load_firmware(MachineState *machine, + RISCVBootInfo *info, + const char *firmware_filename, hwaddr *firmware_load_addr, symbol_fn_t sym_cb); void riscv_load_kernel(MachineState *machine, diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 9babb85b0458..f3857e984240 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -145,6 +145,7 @@ char *riscv_find_firmware(const char *firmware_filename, } =20 hwaddr riscv_find_and_load_firmware(MachineState *machine, + RISCVBootInfo *info, const char *default_machine_firmware, hwaddr *firmware_load_addr, symbol_fn_t sym_cb) @@ -157,7 +158,8 @@ hwaddr riscv_find_and_load_firmware(MachineState *machi= ne, =20 if (firmware_filename) { /* If not "none" load the firmware */ - firmware_end_addr =3D riscv_load_firmware(firmware_filename, + firmware_end_addr =3D riscv_load_firmware(machine, info, + firmware_filename, firmware_load_addr, sym_cb= ); g_free(firmware_filename); } @@ -165,10 +167,13 @@ hwaddr riscv_find_and_load_firmware(MachineState *mac= hine, return firmware_end_addr; } =20 -hwaddr riscv_load_firmware(const char *firmware_filename, +hwaddr riscv_load_firmware(MachineState *machine, + RISCVBootInfo *info, + const char *firmware_filename, hwaddr *firmware_load_addr, symbol_fn_t sym_cb) { + uint64_t mem_size =3D info->ram_low_size ?: machine->ram_size; uint64_t firmware_entry, firmware_end; ssize_t firmware_size; =20 @@ -183,7 +188,7 @@ hwaddr riscv_load_firmware(const char *firmware_filenam= e, =20 firmware_size =3D load_image_targphys_as(firmware_filename, *firmware_load_addr, - current_machine->ram_size, NULL, + mem_size, NULL, NULL); =20 if (firmware_size > 0) { @@ -197,7 +202,7 @@ hwaddr riscv_load_firmware(const char *firmware_filenam= e, static void riscv_load_initrd(MachineState *machine, RISCVBootInfo *info) { const char *filename =3D machine->initrd_filename; - uint64_t mem_size =3D machine->ram_size; + uint64_t mem_size =3D info->ram_low_size ?: machine->ram_size; void *fdt =3D machine->fdt; hwaddr start, end; ssize_t size; @@ -243,6 +248,7 @@ void riscv_load_kernel(MachineState *machine, bool load_initrd, symbol_fn_t sym_cb) { + uint64_t mem_size =3D info->ram_low_size ?: machine->ram_size; const char *kernel_filename =3D machine->kernel_filename; ssize_t kernel_size; void *fdt =3D machine->fdt; @@ -274,7 +280,7 @@ void riscv_load_kernel(MachineState *machine, } =20 kernel_size =3D load_image_targphys_as(kernel_filename, kernel_start_a= ddr, - current_machine->ram_size, NULL, = NULL); + mem_size, NULL, NULL); if (kernel_size > 0) { info->kernel_size =3D kernel_size; info->image_low_addr =3D kernel_start_addr; @@ -370,7 +376,7 @@ uint64_t riscv_compute_fdt_addr(hwaddr dram_base, hwadd= r dram_size, dtb_start =3D QEMU_ALIGN_DOWN(temp - fdtsize, 2 * MiB); =20 if (dtb_start_limit && (dtb_start < dtb_start_limit)) { - error_report("No enough memory to place DTB after kernel/initrd"); + error_report("Not enough memory to place DTB after kernel/initrd"); exit(1); } =20 diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c index 4ff83e494034..8905ed0ba190 100644 --- a/hw/riscv/microchip_pfsoc.c +++ b/hw/riscv/microchip_pfsoc.c @@ -615,18 +615,20 @@ static void microchip_icicle_kit_machine_init(Machine= State *machine) firmware_load_addr =3D RESET_VECTOR; } =20 + riscv_boot_info_init(&boot_info, &s->soc.u_cpus); + /* Load the firmware if necessary */ firmware_end_addr =3D firmware_load_addr; if (firmware_name) { char *filename =3D riscv_find_firmware(firmware_name, NULL); if (filename) { - firmware_end_addr =3D riscv_load_firmware(filename, + firmware_end_addr =3D riscv_load_firmware(machine, &boot_info, + filename, &firmware_load_addr, N= ULL); g_free(filename); } } =20 - riscv_boot_info_init(&boot_info, &s->soc.u_cpus); if (machine->kernel_filename) { kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, firmware_end_addr= ); diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c index 309125e854bc..8cd660dd4154 100644 --- a/hw/riscv/opentitan.c +++ b/hw/riscv/opentitan.c @@ -99,12 +99,14 @@ static void opentitan_machine_init(MachineState *machin= e) memory_region_add_subregion(sys_mem, memmap[IBEX_DEV_RAM].base, machine->ram); =20 + riscv_boot_info_init(&boot_info, &s->soc.cpus); + if (machine->firmware) { hwaddr firmware_load_addr =3D memmap[IBEX_DEV_RAM].base; - riscv_load_firmware(machine->firmware, &firmware_load_addr, NULL); + riscv_load_firmware(machine, &boot_info, machine->firmware, + &firmware_load_addr, NULL); } =20 - riscv_boot_info_init(&boot_info, &s->soc.cpus); if (machine->kernel_filename) { riscv_load_kernel(machine, &boot_info, memmap[IBEX_DEV_RAM].base, diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c index 49a39b30212d..eb720d9cdf5d 100644 --- a/hw/riscv/shakti_c.c +++ b/hw/riscv/shakti_c.c @@ -45,6 +45,7 @@ static void shakti_c_machine_state_init(MachineState *mst= ate) { ShaktiCMachineState *sms =3D RISCV_SHAKTI_MACHINE(mstate); MemoryRegion *system_memory =3D get_system_memory(); + RISCVBootInfo boot_info; hwaddr firmware_load_addr =3D shakti_c_memmap[SHAKTI_C_RAM].base; =20 /* Initialize SoC */ @@ -57,8 +58,11 @@ static void shakti_c_machine_state_init(MachineState *ms= tate) shakti_c_memmap[SHAKTI_C_RAM].base, mstate->ram); =20 + riscv_boot_info_init(&boot_info, &sms->soc.cpus); + if (mstate->firmware) { - riscv_load_firmware(mstate->firmware, &firmware_load_addr, NULL); + riscv_load_firmware(mstate, &boot_info, mstate->firmware, + &firmware_load_addr, NULL); } =20 /* ROM reset vector */ diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index 7ec67b256514..4c526f73edf6 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -590,7 +590,8 @@ static void sifive_u_machine_init(MachineState *machine) } =20 firmware_name =3D riscv_default_firmware_name(&s->soc.u_cpus); - firmware_end_addr =3D riscv_find_and_load_firmware(machine, firmware_n= ame, + firmware_end_addr =3D riscv_find_and_load_firmware(machine, &boot_info, + firmware_name, &start_addr, NULL); =20 riscv_boot_info_init(&boot_info, &s->soc.u_cpus); diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c index 1493b928dad3..86b06a173565 100644 --- a/hw/riscv/spike.c +++ b/hw/riscv/spike.c @@ -289,9 +289,12 @@ static void spike_board_init(MachineState *machine) } } =20 + riscv_boot_info_init(&boot_info, &s->soc[0]); + /* Load firmware */ if (firmware_name) { - firmware_end_addr =3D riscv_load_firmware(firmware_name, + firmware_end_addr =3D riscv_load_firmware(machine, &boot_info, + firmware_name, &firmware_load_addr, htif_symbol_callback); g_free(firmware_name); @@ -301,7 +304,6 @@ static void spike_board_init(MachineState *machine) create_fdt(s, memmap, riscv_is_32bit(&s->soc[0]), htif_custom_base); =20 /* Load kernel */ - riscv_boot_info_init(&boot_info, &s->soc[0]); if (machine->kernel_filename) { kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, firmware_end_addr= ); diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index bd8608ea5bfd..a907ca359e09 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1466,7 +1466,10 @@ static void virt_machine_done(Notifier *notifier, vo= id *data) } } =20 - firmware_end_addr =3D riscv_find_and_load_firmware(machine, firmware_n= ame, + riscv_boot_info_init(&boot_info, &s->soc[0]); + + firmware_end_addr =3D riscv_find_and_load_firmware(machine, &boot_info, + firmware_name, &start_addr, NULL); =20 pflash_blk0 =3D pflash_cfi01_get_blk(s->flash[0]); @@ -1489,8 +1492,6 @@ static void virt_machine_done(Notifier *notifier, voi= d *data) } } =20 - riscv_boot_info_init(&boot_info, &s->soc[0]); - if (machine->kernel_filename && !kernel_entry) { kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, firmware_end_addr= ); diff --git a/hw/riscv/xiangshan_kmh.c b/hw/riscv/xiangshan_kmh.c index 436e51c1c593..247a0b5d1f21 100644 --- a/hw/riscv/xiangshan_kmh.c +++ b/hw/riscv/xiangshan_kmh.c @@ -166,6 +166,7 @@ static void xiangshan_kmh_machine_init(MachineState *ma= chine) const MemMapEntry *memmap =3D xiangshan_kmh_memmap; MemoryRegion *system_memory =3D get_system_memory(); hwaddr start_addr =3D memmap[XIANGSHAN_KMH_DRAM].base; + RISCVBootInfo boot_info; =20 /* Initialize SoC */ object_initialize_child(OBJECT(machine), "soc", &s->soc, @@ -177,13 +178,16 @@ static void xiangshan_kmh_machine_init(MachineState *= machine) memmap[XIANGSHAN_KMH_DRAM].base, machine->ram); =20 + riscv_boot_info_init(&boot_info, &s->soc.cpus); + /* ROM reset vector */ riscv_setup_rom_reset_vec(machine, &s->soc.cpus, start_addr, memmap[XIANGSHAN_KMH_ROM].base, memmap[XIANGSHAN_KMH_ROM].size, 0, 0); if (machine->firmware) { - riscv_load_firmware(machine->firmware, &start_addr, NULL); + riscv_load_firmware(machine, &boot_info, machine->firmware, + &start_addr, NULL); } =20 /* Note: dtb has been integrated into firmware(OpenSBI) when compiling= */ --=20 2.47.3 From nobody Mon Feb 9 13:05:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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 1767964769066294.6293139610593; Fri, 9 Jan 2026 05:19:29 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1veCNZ-00075V-GW; Fri, 09 Jan 2026 08:18:13 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1veCN7-0006zC-Cb for qemu-devel@nongnu.org; Fri, 09 Jan 2026 08:17:46 -0500 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1veCN3-0005vs-1w for qemu-devel@nongnu.org; Fri, 09 Jan 2026 08:17:43 -0500 Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-2a0833b5aeeso44847215ad.1 for ; Fri, 09 Jan 2026 05:17:40 -0800 (PST) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a3e3c47390sm106103735ad.25.2026.01.09.05.17.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Jan 2026 05:17:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767964659; x=1768569459; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=AotlSXgtMThsWPFh4xyqLvvRMQWRm88XvYR4PBobHgk=; b=XY4FmjRBVyNZ98uQgqCWELlxJoQr7XLQzjjJXVJsY8o14IhudhTkWkKZ86mr8PqBl9 8MPurQzAs86nKVclFBW744Tug0xzCIOB92c3x8M2wqjkOqUWx8sgJ9OJ1YA/Mzan7C7g lU1+HAisOQ7cCa2M+CC72R3aK/AYFu91FkMC30hERLFcEtiee2/hjxcrOQiVfFTNkkmQ vcz0WqZBhufh0GdxwYqL/p/TSRx0IqNWbPmJbKOq/K75xLwSatqFeuD4jzrowDhefSmY FPYh50DWaDWfTODqFLAhKjwl7c9k/9CkvVfmzgySuOpi6uNaEqyB3hgq2T2xZZwF4CYk kzHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767964659; x=1768569459; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=AotlSXgtMThsWPFh4xyqLvvRMQWRm88XvYR4PBobHgk=; b=PYXKO/6T30LQrj/tEEaA+WCImcEQ3mhWZQs2KPwk3H81KAY0jGKOeWgiiVEYet1TRQ ciyDWflaYIqrh5PUaz3LlSMUM65RRgm/WYfrLK2orgPWEEDsk5CMZ5o6WbWAOzGwKAGe BZDPcen+OIqIz6ISen1pc2OjLPVDmHFt/vRHOO6h0YyNTNUcztF51RG6yqXRnEJPb16/ lt+h6cXLow9n5UDePZw4iSgasl9R2vj/EN+AJD7aLOIWM3nsVuHwiTM+uQPt6U1uvXrr mAbuwvJuED4OCY5y145DHtDT+RD20bQMvMFdBecoiYs8AS6j3ypd8ihfdvuonLZdf9cD yrFg== X-Forwarded-Encrypted: i=1; AJvYcCUN7xvvXdAcK+s9j8yvtUUfjHPFKdnjIEqx11at/m2esgpjmP12+YBm7Au+tBGQfAoyakXcrH9uZ/uP@nongnu.org X-Gm-Message-State: AOJu0YxFTubqlCnjCMQwAu0ZOHbl0HcxED3+Xc+j59FuSLEHUlkCgh5/ +duxgvYMp38P3CcLD9qygdtSVW/CQbzkj84mNR8pAPHyuvTTmaxArxHN X-Gm-Gg: AY/fxX5QdqlwKop2e6AoaNVVSYJ83gxjTKqBi7W9Bkek1F4MdtcWBDNJ0pzW+fR84os VOEq1sinKu6OQiWBB5li8N/h/Cs6s67tDp/80CkTmU+oU99QGv/qcES6rdNZNsOWpucclK35LbC 1JQm99+PcexMgoIKaku7nDtxoD2OMDiT4+Yc87dYXqjlo+h2cdezDHFi8U/3eL+Qq3vcHb0KZBH RW8LGzpRFyDy4urD3VPhZbEwA27xG1bOFR+iNk0kEt67gvRxxuInE2QurO4EZMM5lJVy5CJujgs SezNOL9b3H02wPx8trUfw4hBqmO1x2LVh/PldsiL+lgP91UnIhN+Qb3qgANSsl0+5plA+u+ivBe BrQl8b9VrpU8yZcyzxDE9MXbyEuB30LIvPLxTr18OhGz8no9Av8CYNVyJrzaU+jRRYrBmKEwR+Q PqXwVkgfidRGCpbceZxB7I X-Google-Smtp-Source: AGHT+IEXkG5m93JuLmmHhoiXmhLPWoPtnfIQncLSHPXliQNnunzi8EyPLWvQnB/RqZg4tqNnD8GVzw== X-Received: by 2002:a17:903:230f:b0:258:f033:3ff9 with SMTP id d9443c01a7336-2a3ee4b2467mr99411425ad.48.1767964659401; Fri, 09 Jan 2026 05:17:39 -0800 (PST) From: Joel Stanley To: Alistair Francis , Daniel Henrique Barboza , qemu-devel@nongnu.org Cc: Nicholas Piggin , Weiwei Li , Liu Zhiwei , Vijai Kumar K , Ran Wang , Michael Ellerman , Joel Stanley , Nick Piggin , Anirudh Srinivasan , qemu-riscv@nongnu.org Subject: [PATCH 3/4] hw/riscv/boot: Warn if a ELF format file is loaded as a binary Date: Fri, 9 Jan 2026 23:46:54 +1030 Message-ID: <20260109131657.396794-4-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260109131657.396794-1-joel@jms.id.au> References: <20260109131657.396794-1-joel@jms.id.au> 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 (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=2607:f8b0:4864:20::629; envelope-from=joel.stan@gmail.com; helo=mail-pl1-x629.google.com X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1767964770947158500 Content-Type: text/plain; charset="utf-8" From: Nicholas Piggin It is possible that an ELF file can not be loaded, in that case the loader falls back to loading the file as a binary blob. Print a warning in this case because it is likely that it is not intended. Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley Reviewed-by: Daniel Henrique Barboza --- hw/riscv/boot.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index f3857e984240..3ea95c175c14 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -179,13 +179,27 @@ hwaddr riscv_load_firmware(MachineState *machine, =20 g_assert(firmware_filename !=3D NULL); =20 - if (load_elf_ram_sym(firmware_filename, NULL, NULL, NULL, - &firmware_entry, NULL, &firmware_end, NULL, - 0, EM_RISCV, 1, 0, NULL, true, sym_cb) > 0) { + firmware_size =3D load_elf_ram_sym(firmware_filename, NULL, NULL, NULL, + &firmware_entry, NULL, &firmware_end, + NULL, 0, EM_RISCV, 1, 0, NULL, false, + sym_cb); + if (firmware_size > 0) { *firmware_load_addr =3D firmware_entry; return firmware_end; } =20 + if (firmware_size !=3D ELF_LOAD_NOT_ELF) { + /* + * If the user specified an ELF format firmware that could not be + * loaded as an ELF, it's possible that loading it as a binary is + * not what was intended. + */ + warn_report("could not load ELF format firmware '%s' (%s). " + "Attempting to load as binary.", + firmware_filename, + load_elf_strerror(firmware_size)); + } + firmware_size =3D load_image_targphys_as(firmware_filename, *firmware_load_addr, mem_size, NULL, @@ -195,7 +209,8 @@ hwaddr riscv_load_firmware(MachineState *machine, return *firmware_load_addr + firmware_size; } =20 - error_report("could not load firmware '%s'", firmware_filename); + error_report("could not load firmware '%s': %s", firmware_filename, + load_elf_strerror(firmware_size)); exit(1); } =20 --=20 2.47.3 From nobody Mon Feb 9 13:05:39 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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 176796471652435.33713454095357; Fri, 9 Jan 2026 05:18:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1veCNF-00072P-S9; Fri, 09 Jan 2026 08:17:57 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1veCNC-00070I-90 for qemu-devel@nongnu.org; Fri, 09 Jan 2026 08:17:50 -0500 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1veCN8-0005xK-8A for qemu-devel@nongnu.org; Fri, 09 Jan 2026 08:17:48 -0500 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-2a0a95200e8so25768985ad.0 for ; Fri, 09 Jan 2026 05:17:45 -0800 (PST) Received: from donnager-debian.. ([45.124.203.15]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a3e3c47390sm106103735ad.25.2026.01.09.05.17.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Jan 2026 05:17:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767964664; x=1768569464; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=dEAkhF7Gs/JkiVXMykS0GnYYtidy6ieqVLgHbEaHLzA=; b=g/AxMIOnENtmIlU2yieKUXctcYoxtdBHHkzwgnBxadNJrNzCQUPTL/H0Pph2tTA6Ok EnJoSEDi3n/m06Y7K25T5W34i0UIP9pz+yRqoeJUcQNWSA40Y5/x95riaobiNhoKOaBO fVMBe3kmg+ijRdkJr6C8xja6lKVXJkD+ZOpKtcz2bfl1WLGkCiG/ibAjfLrP2wFCja4p O37ABzf93Zp9FkvA/acRC0EV64hL0h4iewBTHX2dktNWKwbSJ4cleTUYjjRMHiJBcN5j hlawKBCTZJWuSn9Kzc5XvqHL3zJEBYxbbgo6b2yk3nNLYTLU7lTCpslENtNymdYDABvO tQ2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767964664; x=1768569464; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dEAkhF7Gs/JkiVXMykS0GnYYtidy6ieqVLgHbEaHLzA=; b=TLreDS0J2F+KwWvPYlfkDyte9SQybErbudOIBd+w6jjkr8/IbY73tsUdU9L9CJyXbX ilviINE+vVbuCL/O0PrNsMGE8wXNo+tVlxdQSNDTUjyBLHP1TZRWdPJeTz+zoYwR+Qnq a5L3WiZo+eIENZtn8hDlZT0TYe1a2yO6R8vT7WmCLlmka/LC0uKvCahix8oj70wx4r5U pQQfAs1W/UQ4hTisxbn95fMoCoJMpPqgGupM9beXHnZSmaEUqBPbzJlRrRwgKNUTdeCo /x24dddA4MhA+T2pL5i4Wp5UprwXS86CMzB1z2qCbuBe0q+ggaMNfk0zJnBZD8f7Pajx FRLw== X-Forwarded-Encrypted: i=1; AJvYcCURrd5wU0uDiIjE4fGxyu24R2KRWveL3HcoJy1GxChSrHwLx+TDnd2mLpcNwidnXyWc6gZmS8N6NyNv@nongnu.org X-Gm-Message-State: AOJu0YwQ7Tve5EED4w1xSN2W3BC7ODO1DxYpeKSaiasYNDB2nHe+zKQc aNhDf5EzCi7JOz7iZEYP2LsnF6kPw9Q0k1QZw7emJ7WRiU34p49sTvLn X-Gm-Gg: AY/fxX7XJRSrfexy1irI9cyfxcyI2+HhuGbdxPkhIo97IuFzUdDYEO8K7IZnMnCd35s lITKctD4unWnL/ozLmDIcrdSJb8tL5ixRj+TbR0JIjtToXI+9ytsWO75A9I+i9bXc6g3ZVRz7pl hdtBVltluaj8IuWRcaMq27O5XJdxnCf00Z/PCxJ9mtnh4MCNDB+sGjXYmbV9VQe59wD5cfRRbL4 LNuePOBxdQ8yJYcZRa75izzUyyWSN+pcDPS/NzZjlYnoTgk1Lfiq82Ngs523XwbMLiUXmatth0n sta/I2acvetUaomktLxuXfqOvYrSgWBFIMoDBzukF+OgDnsTaUEbOw3hqKtsnG/Aa3/GlZI6AmC aV0V4YyAewqj5DJztOVBPNNqn0FGbfm0huPth+svpecZEn3TCQnoEy1aoO4EFIDLNIDTd/oBNoy +CxUYUKTXTUcGxH8zJpC42 X-Google-Smtp-Source: AGHT+IF7ykl69do1dPb+W6el91zat01jqrsDTfEeH7NwkIhso8cO492tTsw1bwTN669PA8gs6P2bRg== X-Received: by 2002:a17:902:ea09:b0:295:738f:73fe with SMTP id d9443c01a7336-2a3ee4ab6a2mr100802305ad.30.1767964664442; Fri, 09 Jan 2026 05:17:44 -0800 (PST) From: Joel Stanley To: Alistair Francis , Daniel Henrique Barboza , qemu-devel@nongnu.org Cc: Nicholas Piggin , Weiwei Li , Liu Zhiwei , Vijai Kumar K , Ran Wang , Michael Ellerman , Joel Stanley , Nick Piggin , Anirudh Srinivasan , qemu-riscv@nongnu.org Subject: [PATCH 4/4] hw/riscv/boot: Provide a simple halting payload Date: Fri, 9 Jan 2026 23:46:55 +1030 Message-ID: <20260109131657.396794-5-joel@jms.id.au> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260109131657.396794-1-joel@jms.id.au> References: <20260109131657.396794-1-joel@jms.id.au> 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 (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=2607:f8b0:4864:20::630; envelope-from=joel.stan@gmail.com; helo=mail-pl1-x630.google.com X-Spam_score_int: -19 X-Spam_score: -2.0 X-Spam_bar: -- X-Spam_report: (-2.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1767964719687158500 Content-Type: text/plain; charset="utf-8" From: Nicholas Piggin OpenSBI hangs before any console output if the domain init code sees the next stage is not in an executable region. If no kernel payload is provided to QEMU, the next stage address is NULL, and the riscv virt machine memory map ends up covering the 0 address with the catch all S-mode RWX region and so OpenSBI prints console messages and does not hang until the next stage boot. The TT Atlantis address map has RAM starting at 0 and it loads OpenSBI there, so it is M-mode and not accessible by S-mode, tripping the early check and hang. Add a helper to set up a simple payload that gets OpenSBI messages to console. Signed-off-by: Nicholas Piggin Signed-off-by: Joel Stanley Reviewed-by: Daniel Henrique Barboza --- include/hw/riscv/boot.h | 2 ++ hw/riscv/boot.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h index fb90bf12399e..d1d7258a2179 100644 --- a/include/hw/riscv/boot.h +++ b/include/hw/riscv/boot.h @@ -78,6 +78,8 @@ void riscv_setup_rom_reset_vec(MachineState *machine, RIS= CVHartArrayState *harts hwaddr rom_base, hwaddr rom_size, uint64_t kernel_entry, uint64_t fdt_load_addr); +void riscv_setup_halting_payload(MachineState *machine, + RISCVBootInfo *info, hwaddr addr); void riscv_rom_copy_firmware_info(MachineState *machine, RISCVHartArrayState *harts, hwaddr rom_base, diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 3ea95c175c14..fc8a39a8d913 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -518,6 +518,27 @@ void riscv_setup_rom_reset_vec(MachineState *machine, = RISCVHartArrayState *harts kernel_entry); } =20 +/* Simple payload so OpenSBI does not hang early with no output */ +void riscv_setup_halting_payload(MachineState *machine, + RISCVBootInfo *info, hwaddr addr) +{ + int i; + uint32_t payload_vec[] =3D { + 0x10500073, /* 1: wfi */ + 0xffdff06f, /* j 1b */ + }; + /* copy in the payload vector in little_endian byte order */ + for (i =3D 0; i < ARRAY_SIZE(payload_vec); i++) { + payload_vec[i] =3D cpu_to_le32(payload_vec[i]); + } + rom_add_blob_fixed_as("mrom.payload", payload_vec, sizeof(payload_vec), + addr, &address_space_memory); + + info->kernel_size =3D sizeof(payload_vec); + info->image_low_addr =3D addr; + info->image_high_addr =3D info->image_low_addr + info->kernel_size; +} + void riscv_setup_direct_kernel(hwaddr kernel_addr, hwaddr fdt_addr) { CPUState *cs; --=20 2.47.3