From nobody Sat Oct 24 00:32:48 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790918934; cv=none; d=zohomail.com; s=zohoarc; b=HMDp7nt655U8BEQdxkltEjyHXOtsLu3vW0gLiTM183YUkU1sVyKw0WnjrUpTVpY4k/w5Eel6hqUM4OQN6QEbpeMG+Q5lBHlDEN4tc2bxR4iA/MTL3Qtu0RUTNXHHTmpgMKdoyxTFdYhpm8OmTqMXtNMgzyfmD+ZDwW0yCZEzRwQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790918934; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Xz6IQMJvcd99HMztJTjPmClv2LvdyYKgXMxGqdftuBw=; b=YgOzpUQJZymOFTI8D7yHnC8lQPTU/qyVzguOFgEAzmtorF6I5FBR2SxiC+7d/1BHEIc5nv9B1shBkb0Y91MKA5yHfldCcCkGzvsHd2ACsCrIh16nZP6BUnLtPSSXhB8t8FBBP0VUPutbGwVA7Cqy9ofowaqtkPTAxNpQb/vg694= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 179091893478431.65889610932993; Thu, 1 Oct 2026 22:28:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xCVof-0008JM-3g; Fri, 02 Oct 2026 01:28:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVo5-0008F3-8t; Fri, 02 Oct 2026 01:27:45 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVo2-00080y-Q2; Fri, 02 Oct 2026 01:27:41 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6922ZR313548244; Fri, 2 Oct 2026 05:27:27 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx5j5qs9n-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:27:26 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 6922KAJb1897664; Fri, 2 Oct 2026 05:27:25 GMT Received: from smtprelay06.dal12v.mail.ibm.com ([172.16.1.8]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4h1aa7xhe8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:27:25 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay06.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 6925ROGw32047678 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Oct 2026 05:27:24 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 368AE58056; Fri, 2 Oct 2026 05:27:24 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AD0A858052; Fri, 2 Oct 2026 05:27:14 +0000 (GMT) Received: from li-bd0dea4c-2912-11b2-a85c-e84940f94d2e.ibmuc.com (unknown [9.43.111.176]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 2 Oct 2026 05:27:14 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Xz6IQMJvcd99HMztJ TjPmClv2LvdyYKgXMxGqdftuBw=; b=SsllzcfRQ6h8jc/+3y+//zfbjzoR8iw3K L2zrHRu49XPM7mX9tuiBBHK3Nyyv3sjpQXKIuFTnSJE+a15SscaBQim8nXUTMEHE 8Zn78UGZUQsiQDkwWNhU8KkzAtMHEFwesky+ON8mmBaf29NojVyAIWcrmB1L1lK/ hJshCM81DbjZBZ0sOws3cSwiaNoHzCCssRT2Gq2JKVrG8mV/rsx8c/w5DOfsYF8H TM9xGJqupJKGJWyIqs+ugQrXm2+cKz3KGlFOlRLf1+I/wWZm+LKFPE4acUFt2m2U eqosJAW1sOUIuwWHctVnwx5CaH/mbTJAVFQAu9QVlegT1dQaMgecA== From: uverma@linux.ibm.com To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, aik@amd.com, nnmlinux@linux.ibm.com, avnish@linux.ibm.com Cc: pbonzini@redhat.com, th.huth@posteo.eu, sbhat@linux.ibm.com, harshpb@linux.ibm.com, amachhiw@linux.ibm.com, rathc@linux.ibm.com, balaton@eik.bme.hu, philmd@linaro.org, npiggin@gmail.com, marcandre.lureau@redhat.com, fam@euphon.net, alex.bennee@linaro.org, richard.henderson@linaro.org, Utkarsh Verma Subject: [RFC PATCH v2 1/8] ppc/spapr: add PReP boot partition detection Date: Fri, 2 Oct 2026 10:55:40 +0530 Message-ID: <20261002052605.605858-2-uverma@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261002052605.605858-1-uverma@linux.ibm.com> References: <20261002052605.605858-1-uverma@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX0OwNT3rdZaKm 1xDB/JyrDK6MYuQWFGoNQMOJc1XIwVvYMLi6hd3AkWOoHBZ+TG3Jcj6HMsRMgjqBKxRV4+m/oit dOjP6j4H5lOjBfP4n5MEOImklEW7Ygs= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX6GL46w9QQ8Gy lb4Lh5slQK695nznoXnin3ucgutmEcpeJokiGro72b52wiTtSKl3QIJyJTrmxWWDEHXxABEy46T B5sSy7lReBW/rnhCobu5AsTRFwT3yG6qp3aQIbrsh9uNisl0b99Ftz4nDG1/uRBllue71UCs/Lo auDu5eBLlggYu4FnvJLxtT/8p3hnzrBuMyPrONt/tRa7NdI/pVZCaWn1KABj082bMKkqvOUX76T pt8H396D1HLD/u87xImYWxgqYGKQ0iDBM0MI30BoKuaRJ5pT0mVzEAuu46nKJbBHnNx3oT5HFcw AHHtE4jg11eiR7axsqdE0Zou75ISzR1InjAjLs9FPfyvtYX3z3OEf/yIB6rhcLXNYrQSncxzliQ KzLe56Z8TmQtFt+wokXP7gBEAcsAemm409V5/Dz4X5E7uCRkgl7uG0ouexeM2eBFzde/7ehLxVJ jjZOivR/GYgTuX8eYuQ== X-Proofpoint-GUID: HibtK9Oej-h0piv6a62nfN0wUax65lvu X-Authority-Analysis: v=2.4 cv=RKcmjIi+ c=1 sm=1 tr=0 ts=6abf40bf cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=660iZSQnnn4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=8QURaz6fMi4Cysm5H64A:9 X-Proofpoint-ORIG-GUID: wWXBOclZpPiuQ_YGRTXn-uLY---74PEi X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-10-02_01,2026-10-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1011 priorityscore=1501 spamscore=0 bulkscore=0 impostorscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2610020020 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=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=uverma@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: qemu development 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: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790918935618158500 Content-Type: text/plain; charset="utf-8" From: Utkarsh Verma Add spapr_vof_partition.c which implements basic MBR and GPT partition table scanning to locate the PReP boot partition during VOF enabled boot. AI-used-for: code Signed-off-by: Utkarsh Verma Reviewed-by:=C2=A0Avnish=C2=A0Chouhan=C2=A0 --- Chaneglog: v2: - Added CRC validations for GPT. - Added bounds checking GPT header size. - Added new GPT_MAX_PARTITION to cap max partitions at 128 - Added bounds checking for the partition entry array against disk size for GPT. - Switched GPT entry to use a fixed-size buffer instead of g_malloc per entry. - Added validation for first_lba and last_lba in GPT before returning size. - Added validation for MBR PReP partition entries(start_lba/num_sectors) --- hw/ppc/meson.build | 5 +- hw/ppc/spapr_vof_partition.c | 272 +++++++++++++++++++++++++++++++++++ include/hw/ppc/spapr_vof.h | 14 ++ 3 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 hw/ppc/spapr_vof_partition.c create mode 100644 include/hw/ppc/spapr_vof.h diff --git a/hw/ppc/meson.build b/hw/ppc/meson.build index 37aa535db2..68a5d2622f 100644 --- a/hw/ppc/meson.build +++ b/hw/ppc/meson.build @@ -93,6 +93,9 @@ ppc_ss.add(when: 'CONFIG_AMIGAONE', if_true: files('amiga= one.c')) ppc_ss.add(when: 'CONFIG_PEGASOS', if_true: files('pegasos.c')) =20 ppc_ss.add(when: 'CONFIG_VOF', if_true: files('vof.c')) -ppc_ss.add(when: ['CONFIG_VOF', 'CONFIG_PSERIES'], if_true: files('spapr_v= of.c')) +ppc_ss.add(when: ['CONFIG_VOF', 'CONFIG_PSERIES'], if_true: files( + 'spapr_vof.c', + 'spapr_vof_partition.c', +)) =20 hw_arch +=3D {'ppc': ppc_ss} diff --git a/hw/ppc/spapr_vof_partition.c b/hw/ppc/spapr_vof_partition.c new file mode 100644 index 0000000000..b495a53d9d --- /dev/null +++ b/hw/ppc/spapr_vof_partition.c @@ -0,0 +1,272 @@ +/* + * QEMU PowerPC sPAPR VOF Partition Table Support. + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * This implements partition table detection for VOF boot, + * supporting MBR and GPT partition tables with focus on PReP boot partiti= on. + */ + +#include "qemu/osdep.h" +#include "qemu/bswap.h" +#include "qemu/error-report.h" +#include "system/block-backend-io.h" +#include "hw/ppc/spapr_vof.h" +#include + +#define SECTOR_SIZE 512 +#define MBR_PARTITION_ENTRY_SIZE 16 +#define MBR_PARTITION_TABLE_OFFSET 446 +#define MBR_NUM_PARTITIONS 4 + +#define PARTITION_TYPE_PREP 0x41 /* PReP Boot partition */ +#define PARTITION_TYPE_GPT 0xEE + +#define GPT_MAX_PARTITION 128 +#define GPT_SIGNATURE "EFI PART" +#define GPT_SIGNATURE_SIZE 8 + +/* PReP Boot: 9E1A2D38-C612-4316-AA26-8B49521E5A8B */ +static const uint8_t GUID_PREP_BOOT[16] =3D { + 0x38, 0x2D, 0x1A, 0x9E, 0x12, 0xC6, 0x16, 0x43, + 0xAA, 0x26, 0x8B, 0x49, 0x52, 0x1E, 0x5A, 0x8B +}; + +typedef struct MBRPartitionEntry { + uint8_t boot_flag; + uint8_t start_chs[3]; + uint8_t type; + uint8_t end_chs[3]; + uint32_t start_lba; + uint32_t num_sectors; +} QEMU_PACKED MBRPartitionEntry; + +typedef struct GPTHeader { + char signature[8]; + uint32_t revision; + uint32_t header_size; + uint32_t header_crc32; + uint32_t reserved; + uint64_t current_lba; + uint64_t backup_lba; + uint64_t first_usable_lba; + uint64_t last_usable_lba; + uint8_t disk_guid[16]; + uint64_t partition_entries_lba; + uint32_t num_partition_entries; + uint32_t partition_entry_size; + uint32_t partition_array_crc32; +} QEMU_PACKED GPTHeader; + +typedef struct GPTPartitionEntry { + uint8_t type_guid[16]; + uint8_t partition_guid[16]; + uint64_t first_lba; + uint64_t last_lba; + uint64_t attributes; + uint16_t name[36]; +} QEMU_PACKED GPTPartitionEntry; + +static bool find_prep_partition_gpt(BlockBackend *blk, + uint64_t *offset, uint64_t *size) +{ + uint8_t lba1[SECTOR_SIZE]; + GPTHeader *header; + uint32_t header_size; + GPTHeader header_copy; + uint32_t crc_stored; + uint32_t crc_computed; + uint64_t entries_lba; + uint32_t num_entries; + uint32_t entry_size; + int64_t disk_size; + uint64_t disk_last_lba; + uint32_t array_bytes; + g_autofree uint8_t *array_buf =3D NULL; + uint8_t buf[sizeof(GPTPartitionEntry)]; + GPTPartitionEntry *current_entry; + uint32_t i; + int ret; + + ret =3D blk_pread(blk, SECTOR_SIZE, SECTOR_SIZE, lba1, 0); + if (ret < 0) { + warn_report("GPT: failed to read LBA1 (ret=3D%d)", ret); + return false; + } + + header =3D (GPTHeader *)lba1; + + /* EFI PART signature validation */ + if (memcmp(header->signature, GPT_SIGNATURE, GPT_SIGNATURE_SIZE) !=3D = 0) { + return false; + } + + /* GPT header size validation */ + header_size =3D le32_to_cpu(header->header_size); + if (header_size < sizeof(GPTHeader) || header_size > SECTOR_SIZE) { + warn_report("GPT: invalid header size %u (expected %zu..%u)", + header_size, sizeof(GPTHeader), SECTOR_SIZE); + return false; + } + + /* CRC32 validation of GPT header */ + header_copy =3D *header; + header_copy.header_crc32 =3D 0; + crc_stored =3D le32_to_cpu(header->header_crc32); + crc_computed =3D crc32(0, (uint8_t *)&header_copy, header_size); + if (crc_computed !=3D crc_stored) { + warn_report("GPT: header CRC32 mismatch (computed=3D0x%08x " + "stored=3D0x%08x)", crc_computed, crc_stored); + return false; + } + + entries_lba =3D le64_to_cpu(header->partition_entries_lba); + num_entries =3D le32_to_cpu(header->num_partition_entries); + entry_size =3D le32_to_cpu(header->partition_entry_size); + + /* + * Usually the PReP is the first partition and most systems commonly h= ave + * 128 max partitions, so cap the scan at 128 + */ + if (num_entries > GPT_MAX_PARTITION) { + warn_report("GPT: num_partition_entries %u exceeds %u, " + "scanning only the first %u partitions", num_entries, + GPT_MAX_PARTITION, GPT_MAX_PARTITION); + num_entries =3D GPT_MAX_PARTITION; + } + + if (num_entries =3D=3D 0) { + warn_report("GPT: partition table has no entries"); + return false; + } + + if (entry_size < sizeof(GPTPartitionEntry)) { + warn_report("GPT: partition entry size %u is too small", entry_siz= e); + return false; + } + + disk_size =3D blk_getlength(blk); + if (disk_size <=3D 0) { + warn_report("GPT: failed to get disk size"); + return false; + } + disk_last_lba =3D (uint64_t)disk_size / SECTOR_SIZE - 1; + + if (entries_lba >=3D UINT64_MAX / SECTOR_SIZE || + entries_lba >=3D (uint64_t)disk_size / SECTOR_SIZE || + num_entries > ((uint64_t)disk_size - entries_lba * SECTOR_SIZE) + / entry_size) { + warn_report("GPT: partition entry array extends beyond disk"); + return false; + } + + /* CRC32 validation of GPT partition array */ + array_bytes =3D num_entries * entry_size; + array_buf =3D g_malloc(array_bytes); + crc_stored =3D le32_to_cpu(header->partition_array_crc32); + + ret =3D blk_pread(blk, entries_lba * SECTOR_SIZE, array_bytes, array_b= uf, 0); + if (ret < 0) { + warn_report("GPT: failed to read partition entry array for CRC " + "(ret=3D%d)", ret); + return false; + } + crc_computed =3D crc32(0, array_buf, array_bytes); + if (crc_computed !=3D crc_stored) { + warn_report("GPT: partition array CRC32 mismatch (computed=3D0x%08= x " + "stored=3D0x%08x)", crc_computed, crc_stored); + return false; + } + + for (i =3D 0; i < num_entries; i++) { + uint64_t current_entry_offset =3D entries_lba * SECTOR_SIZE + + (uint64_t)i * entry_size; + ret =3D blk_pread(blk, current_entry_offset, sizeof(buf), buf, 0); + if (ret < 0) { + warn_report("GPT: failed to read partition entry %u (ret=3D%d)= ", + i, ret); + return false; + } + + current_entry =3D (GPTPartitionEntry *)buf; + if (memcmp(current_entry->type_guid, GUID_PREP_BOOT, + sizeof(GUID_PREP_BOOT)) =3D=3D 0) { + uint64_t first_lba =3D le64_to_cpu(current_entry->first_lba); + uint64_t last_lba =3D le64_to_cpu(current_entry->last_lba); + + if (last_lba < first_lba) { + warn_report("GPT: PReP entry has " + "last_lba (%"PRIu64") < first_lba (%"PRIu64"),= " + "skipping", last_lba, first_lba); + continue; + } + if (first_lba > disk_last_lba || last_lba > disk_last_lba) { + warn_report("GPT: PReP entry LBA range [%"PRIu64", %"PRIu6= 4"] " + "exceeds disk (%"PRIu64"), skipping", + first_lba, last_lba, disk_last_lba); + continue; + } + + *offset =3D first_lba * SECTOR_SIZE; + *size =3D (last_lba - first_lba + 1) * SECTOR_SIZE; + return true; + } + } + return false; +} + +static bool find_prep_partition_mbr(BlockBackend *blk, + uint64_t *offset, uint64_t *size) +{ + uint8_t mbr[SECTOR_SIZE]; + MBRPartitionEntry *entry; + int ret; + int i; + + ret =3D blk_pread(blk, 0, SECTOR_SIZE, mbr, 0); + if (ret < 0) { + warn_report("MBR: failed to read MBR sector (ret=3D%d)", ret); + return false; + } + + /* MBR boot signature: byte 510 =3D 0x55, byte 511 =3D 0xAA */ + if (mbr[510] !=3D 0x55 || mbr[511] !=3D 0xAA) { + warn_report("MBR: invalid boot signature (0x%02x 0x%02x), " + "expected 0x55 0xAA", mbr[510], mbr[511]); + return false; + } + + for (i =3D 0; i < MBR_NUM_PARTITIONS; i++) { + entry =3D (MBRPartitionEntry *)&mbr[MBR_PARTITION_TABLE_OFFSET + + i * MBR_PARTITION_ENTRY_SIZE]; + + if (entry->type =3D=3D PARTITION_TYPE_GPT) { + return find_prep_partition_gpt(blk, offset, size); + } + + if (entry->type =3D=3D PARTITION_TYPE_PREP) { + uint32_t start_lba =3D le32_to_cpu(entry->start_lba); + uint32_t num_sectors =3D le32_to_cpu(entry->num_sectors); + + if (start_lba =3D=3D 0 || num_sectors =3D=3D 0) { + warn_report("MBR: PReP partition entry %d has invalid " + "start_lba=3D%u or num_sectors=3D%u, skipping", + i, start_lba, num_sectors); + continue; + } + *offset =3D (uint64_t)start_lba * SECTOR_SIZE; + *size =3D (uint64_t)num_sectors * SECTOR_SIZE; + return true; + } + } + return false; +} + +bool spapr_vof_find_prep_partition(BlockBackend *blk, + uint64_t *offset, uint64_t *size) +{ + if (!blk) { + return false; + } + return find_prep_partition_mbr(blk, offset, size); +} diff --git a/include/hw/ppc/spapr_vof.h b/include/hw/ppc/spapr_vof.h new file mode 100644 index 0000000000..08787d2aeb --- /dev/null +++ b/include/hw/ppc/spapr_vof.h @@ -0,0 +1,14 @@ +/* + * QEMU PowerPC sPAPR VOF Support + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef HW_SPAPR_VOF_H +#define HW_SPAPR_VOF_H + +typedef struct BlockBackend BlockBackend; + +bool spapr_vof_find_prep_partition(BlockBackend *blk, + uint64_t *offset, uint64_t *size); + +#endif /* HW_SPAPR_VOF_H */ --=20 2.55.0 From nobody Sat Oct 24 00:32:48 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790919001; cv=none; d=zohomail.com; s=zohoarc; b=jMdlTL4/djOEHaRpXytwViRnzhUDaRwvGNJPz7Bobr+yXp5op+8ba+roeeEMkZuUxOjCvyN3n5MMb3T7mp75z9tkT3h/aE17wdl27EwxfQ9NvqIJH7iT1g+LnO0yG9zQdubMW1rQBudSy5CvU0/C5c0cP08wbYxADffl/wx4SFw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790919001; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vmh6QKuY/lU5FOAkc8UrWiEwtDjOqYJ1hg6yzlK9Lmo=; b=Q9eiWOc0OGy12O3QckODahFzQH8L6YX2AzOFQJ1lePdUTF8xW8W+W0D7JHP42uKzua94S9s9XaVeWXeXN4N4j6yr6YNWATVTQ8Ld76XybcwzY4ho2ly/dHbPnylqUl7iWHaZ+7WZYveACNRP2D41qAu5BqDFE3yH1fdDdtSZUNI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790919001011223.13499170009914; Thu, 1 Oct 2026 22:30:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xCVpD-0008U2-Je; Fri, 02 Oct 2026 01:28:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVoB-0008FI-Se; Fri, 02 Oct 2026 01:27:53 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVo6-00081M-Et; Fri, 02 Oct 2026 01:27:44 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6922aEv63548979; Fri, 2 Oct 2026 05:27:35 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx5j5qsa0-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:27:35 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 6922K83L1869033; Fri, 2 Oct 2026 05:27:34 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4h21nu0vc7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:27:34 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 6925RXfV39649554 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Oct 2026 05:27:33 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5A5AF58056; Fri, 2 Oct 2026 05:27:33 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E7FFB58052; Fri, 2 Oct 2026 05:27:24 +0000 (GMT) Received: from li-bd0dea4c-2912-11b2-a85c-e84940f94d2e.ibmuc.com (unknown [9.43.111.176]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 2 Oct 2026 05:27:24 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=vmh6QKuY/lU5FOAkc 8UrWiEwtDjOqYJ1hg6yzlK9Lmo=; b=f60aD/gSFlYPf7vacDea/aHGAjoe73/sO Pv82RGQoVABp4PjDWa33/7ca7hXfB3ceV7q1O/QufmnOUvrUvVJIuhbaF+NzfMNh uHWkGmBTq1XebjSofNNnRgvL8HJAljFjzJHUoXpltgzDh4Cd1tpr5ctcLTbYb/MZ +Q9qXYkiLCKr6U28/GSva/plZlWa446cxewcKehvfc4hqjHt4rmjuhIYnlZiSkXI kp7ZHu//XMGg1203VIrQVWuO57J2K8JgEnWbMIsy24Or7xiom+8HmurjzB0uxEic ilvREoy0JNiqw7WC+8tZxHi9LBLaYXepGud/XsrX1FYHVEHM71tFQ== From: uverma@linux.ibm.com To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, aik@amd.com, nnmlinux@linux.ibm.com, avnish@linux.ibm.com Cc: pbonzini@redhat.com, th.huth@posteo.eu, sbhat@linux.ibm.com, harshpb@linux.ibm.com, amachhiw@linux.ibm.com, rathc@linux.ibm.com, balaton@eik.bme.hu, philmd@linaro.org, npiggin@gmail.com, marcandre.lureau@redhat.com, fam@euphon.net, alex.bennee@linaro.org, richard.henderson@linaro.org, Utkarsh Verma Subject: [RFC PATCH v2 2/8] hw/loader: add load_elf_ram_sym_buf() for in-memory ELF loading Date: Fri, 2 Oct 2026 10:55:41 +0530 Message-ID: <20261002052605.605858-3-uverma@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261002052605.605858-1-uverma@linux.ibm.com> References: <20261002052605.605858-1-uverma@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfXwuiqmhj5z0mK tM+NAg5h76eRASLz4QtoOxgrGaoNHZgFM7AL2qNX5ZnBBJZ/vh4S/RSJwMLxDTG1DKRBmry1zUu 3D38epFo7yUfPSv8FHLflvIi7YRoCKA= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX8OrVaqHSs/SJ ohKNpYLcZCVwcjEytfkdinQJ/nPeXce+yBazcfRSjkBqWnuxSJDWY1mRDMtERk+1GF6q7+PsJ+I 8evfyQKCgz+0x+D8DaevCPGX6UeWBESgiXbhxI39X+mEPwqs9xoK52gzCgf3PZ5BkrmDdxnpLKQ norN/C+UUQrs+ULKrXDHv75nATeN47il8mt2enD8A72wqG6lLqoZl1Gwlel9JQSujZx7U8R47Bo gFyNC45h8bsPWLOCpyIQyvIv7QCVLGCAC3CHidWmojWXyG5qGAY7G/V/Rt33zY6U69Y925jz7G8 z3Nol+qiFAF2Hee3HUAorADL33abovb8TfkEW5qpgaCwlLeYKAGe5tTJgPbmfhqnZnoCE1dJQg0 S1z5UJNGCA1joamUNKQl2g604t5H1olMNp29eUQ0ZS+MrHoNLTsisl6my+Z2cOPeI3wbHG8ZVaZ IRCmn5xiObWNaWfzMTw== X-Proofpoint-GUID: A4sgIvpSKMWSxj3jpNgw68AonSHCVyyB X-Authority-Analysis: v=2.4 cv=RKcmjIi+ c=1 sm=1 tr=0 ts=6abf40c7 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=660iZSQnnn4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=hQ6DQbWgkb2lEq_W8_oA:9 X-Proofpoint-ORIG-GUID: 9O7csGsYa2tYhhOTkW-S_Z6-aXp62dvV X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-10-02_01,2026-10-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1011 priorityscore=1501 spamscore=0 bulkscore=0 impostorscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2610020020 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=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=uverma@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: qemu development 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: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790919002025158500 Content-Type: text/plain; charset="utf-8" From: Utkarsh Verma Add a new public API load_elf_ram_sym_buf() that loads an ELF image from a caller-supplied memory buffer rather than a file path. The implementation creates a temporary file via g_file_open_tmp(), then reuses the existing load_elf32/load_elf64 paths. To support per-segment inspection by callers (e.g. detecting VoF firmware segments), extend the internal load_elf{32,64} template (elf_ops.h.inc) with an optional segment_fn_t callback that is invoked once for every PT_LOAD segment after its load address is resolved. Returning false from the callback aborts the load with ELF_LOAD_FAILED. AI-used-for: code Signed-off-by: Utkarsh Verma Reviewed-by:=C2=A0Avnish=C2=A0Chouhan=C2=A0 --- Chaneglog: v2: - Replaced memfd_create() with g_file_open_tmp() - Replaced write() call with qemu_write_full() --- hw/core/loader.c | 81 +++++++++++++++++++++++++++++++++++++++- include/hw/core/loader.h | 30 +++++++++++++++ include/hw/elf_ops.h.inc | 12 +++++- 3 files changed, 120 insertions(+), 3 deletions(-) diff --git a/hw/core/loader.c b/hw/core/loader.c index 5cbfba0a86..fa04c59ed0 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -510,12 +510,14 @@ ssize_t load_elf_ram_sym(const char *filename, ret =3D load_elf64(filename, fd, elf_note_fn, translate_fn, translate_opaque, must_swab, pentry, lowaddr, highaddr, pflags, elf_machine, - clear_lsb, data_swab, as, load_rom, sym_cb); + clear_lsb, data_swab, as, load_rom, sym_cb, + NULL, NULL); } else { ret =3D load_elf32(filename, fd, elf_note_fn, translate_fn, translate_opaque, must_swab, pentry, lowaddr, highaddr, pflags, elf_machine, - clear_lsb, data_swab, as, load_rom, sym_cb); + clear_lsb, data_swab, as, load_rom, sym_cb, + NULL, NULL); } =20 if (ret > 0) { @@ -527,6 +529,81 @@ ssize_t load_elf_ram_sym(const char *filename, return ret; } =20 +ssize_t load_elf_ram_sym_buf(const uint8_t *buf, size_t buflen, + uint64_t (*elf_note_fn)(void *, void *, bool= ), + uint64_t (*translate_fn)(void *, uint64_t), + void *translate_opaque, uint64_t *pentry, + uint64_t *lowaddr, uint64_t *highaddr, + uint32_t *pflags, int elf_data_order, + int elf_machine, int clear_lsb, int data_swa= b, + AddressSpace *as, bool load_rom, + symbol_fn_t sym_cb, + segment_fn_t segment_fn, void *segment_opaqu= e) +{ + const int host_data_order =3D HOST_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2= LSB; + int fd, must_swab; + ssize_t ret =3D ELF_LOAD_FAILED; + uint8_t e_ident[EI_NIDENT]; + gchar *tmp_path =3D NULL; + GError *gerr =3D NULL; + + fd =3D g_file_open_tmp("qemu-elf-buf-XXXXXX", &tmp_path, &gerr); + if (fd < 0) { + error_report("load_elf_ram_sym_buf: %s", gerr->message); + g_error_free(gerr); + return ELF_LOAD_FAILED; + } + g_unlink(tmp_path); + g_free(tmp_path); + + if (qemu_write_full(fd, buf, buflen) !=3D buflen) { + error_report("load_elf_ram_sym_buf: write: %s", strerror(errno)); + goto fail; + } + + lseek(fd, 0, SEEK_SET); + if (read(fd, e_ident, sizeof(e_ident)) !=3D sizeof(e_ident)) { + goto fail; + } + if (e_ident[0] !=3D ELFMAG0 || + e_ident[1] !=3D ELFMAG1 || + e_ident[2] !=3D ELFMAG2 || + e_ident[3] !=3D ELFMAG3) { + ret =3D ELF_LOAD_NOT_ELF; + goto fail; + } + + if (elf_data_order !=3D ELFDATANONE && elf_data_order !=3D e_ident[EI_= DATA]) { + ret =3D ELF_LOAD_WRONG_ENDIAN; + goto fail; + } + + must_swab =3D host_data_order !=3D e_ident[EI_DATA]; + + lseek(fd, 0, SEEK_SET); + if (e_ident[EI_CLASS] =3D=3D ELFCLASS64) { + ret =3D load_elf64("(buffer)", fd, elf_note_fn, + translate_fn, translate_opaque, must_swab, + pentry, lowaddr, highaddr, pflags, elf_machine, + clear_lsb, data_swab, as, load_rom, sym_cb, + segment_fn, segment_opaque); + } else { + ret =3D load_elf32("(buffer)", fd, elf_note_fn, + translate_fn, translate_opaque, must_swab, + pentry, lowaddr, highaddr, pflags, elf_machine, + clear_lsb, data_swab, as, load_rom, sym_cb, + segment_fn, segment_opaque); + } + + if (ret > 0) { + debuginfo_report_elf("(buffer)", fd, 0); + } + + fail: + close(fd); + return ret; +} + static void bswap_uboot_header(uboot_image_header_t *hdr) { #if !HOST_BIG_ENDIAN diff --git a/include/hw/core/loader.h b/include/hw/core/loader.h index d9431e8a8d..b67b2ca013 100644 --- a/include/hw/core/loader.h +++ b/include/hw/core/loader.h @@ -156,6 +156,36 @@ ssize_t load_elf_ram_sym(const char *filename, int clear_lsb, int data_swab, AddressSpace *as, bool load_rom, symbol_fn_t sym_= cb); =20 +/* + * segment_fn_t: + * Per-PT_LOAD segment callback for load_elf_ram_sym_buf(). + */ +typedef bool (*segment_fn_t)(void *opaque, + uint64_t paddr, uint64_t vaddr, + uint64_t filesz, uint64_t memsz); + +/* + * load_elf_ram_sym_buf: + * @buf: pointer to an in-memory ELF image + * @buflen: size of @buf in bytes + * @segment_fn: optional per-PT_LOAD callback + * @segment_opaque: opaque data passed to @segment_fn + * + * Identical to load_elf_ram_sym() but loads from a caller-supplied + * memory buffer instead of a file. All other parameters have the + * same meaning as load_elf_ram_sym(). + */ +ssize_t load_elf_ram_sym_buf(const uint8_t *buf, size_t buflen, + uint64_t (*elf_note_fn)(void *, void *, bool), + uint64_t (*translate_fn)(void *, uint64_t), + void *translate_opaque, uint64_t *pentry, + uint64_t *lowaddr, uint64_t *highaddr, + uint32_t *pflags, int elf_data_order, + int elf_machine, int clear_lsb, int data_swab, + AddressSpace *as, bool load_rom, + symbol_fn_t sym_cb, + segment_fn_t segment_fn, void *segment_opaque= ); + /** load_elf_as: * Same as load_elf_ram_sym(), but always loads the elf as ROM */ diff --git a/include/hw/elf_ops.h.inc b/include/hw/elf_ops.h.inc index 044e72de2a..a2c9b52bf9 100644 --- a/include/hw/elf_ops.h.inc +++ b/include/hw/elf_ops.h.inc @@ -321,7 +321,9 @@ static ssize_t glue(load_elf, SZ)(const char *name, int= fd, uint32_t *pflags, int elf_machine, int clear_lsb, int data_swab, AddressSpace *as, bool load_rom, - symbol_fn_t sym_cb) + symbol_fn_t sym_cb, + segment_fn_t segment_fn, + void *segment_opaque) { struct elfhdr ehdr; struct elf_phdr *phdr =3D NULL, *ph; @@ -504,6 +506,14 @@ static ssize_t glue(load_elf, SZ)(const char *name, in= t fd, addr =3D ph->p_paddr; } =20 + if (segment_fn) { + if (!segment_fn(segment_opaque, addr, ph->p_vaddr, + file_size, mem_size)) { + ret =3D ELF_LOAD_FAILED; + goto fail; + } + } + if (data_swab) { elf_word j; for (j =3D 0; j < file_size; j +=3D (1 << data_swab)) { --=20 2.55.0 From nobody Sat Oct 24 00:32:48 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790918942; cv=none; d=zohomail.com; s=zohoarc; b=G0KsTxRoYI4ZD4C2uCtcOcAHfKk3pcIALJS/9NHC3b9bJ/Dj78clkth3z3s2MLfcp7sFai+i66Lw9srOyOeLKaCsQdJCuDHhDf+efj6f3x6aK5ViKpC9S89eyGhA6sM5q4mmNN3EsLjlTFdSS701CrgTWQ8wClRzEilJtv9Y82Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790918942; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rGFDGchg20xlJgXEMi6LAfLwxo4549rcy0LzhG9ApYM=; b=F6/uffuFW186g0EF0KSMrQfWSSJyRKgfKzx9Ywm7Gg59Whzm4VROq+I2tisrk/mV0tJPm/e9oeQRU9U94LPxltYNhuz9dq5XnaYH3CUN0jHpgb73gcyvOC61w8Mohnz7trVo9JURuqadh+/RZvnC6j6/dNaEcB9u9xdaGj5RKaw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790918942453859.7872844011631; Thu, 1 Oct 2026 22:29:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xCVpI-00007u-8D; Fri, 02 Oct 2026 01:28:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVoL-0008Ge-0h; Fri, 02 Oct 2026 01:28:00 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVoH-00081e-JQ; Fri, 02 Oct 2026 01:27:55 -0400 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6922ZhiQ3344813; Fri, 2 Oct 2026 05:27:45 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx3fkpp0n-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:27:45 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 6922K7SU1834166; Fri, 2 Oct 2026 05:27:44 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4h1y2dhfhv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:27:44 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 6925Rgbg60424554 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Oct 2026 05:27:43 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BEF9358063; Fri, 2 Oct 2026 05:27:42 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 21D7D5805A; Fri, 2 Oct 2026 05:27:34 +0000 (GMT) Received: from li-bd0dea4c-2912-11b2-a85c-e84940f94d2e.ibmuc.com (unknown [9.43.111.176]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 2 Oct 2026 05:27:33 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=rGFDGchg20xlJgXEM i6LAfLwxo4549rcy0LzhG9ApYM=; b=FcZjwUQZ6haf1P+VFsfIqRvX83ISDaSqh zsgVaKo49gRt7llAez/poyzO4eoUIS7TShpV2fIBBuKcCcU5cP70AcG34CM13EvA OuT7kGi1KZNdUAJuXbHOh79ojneP0SDJfdWhBLcij9rcCyAhIR4zYOGTFpL7pW8e UUgSNEzbOgEEaIP8LYQzRtKvbNT1ttbfTYx0E+OIYHdjqZMYOqplJWHO4I8Bmoz7 N0qC+Zh44m5zTSbddcUzKLRvRuMlpaCf3axFSqND3mKdnEsCSRDs9Ng3SdVGnIE1 HGOFpsAviY1k6ls5E5JrL7ACmMtHpXXXwC0T0yS7Mkr2EACqzSNPg== From: uverma@linux.ibm.com To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, aik@amd.com, nnmlinux@linux.ibm.com, avnish@linux.ibm.com Cc: pbonzini@redhat.com, th.huth@posteo.eu, sbhat@linux.ibm.com, harshpb@linux.ibm.com, amachhiw@linux.ibm.com, rathc@linux.ibm.com, balaton@eik.bme.hu, philmd@linaro.org, npiggin@gmail.com, marcandre.lureau@redhat.com, fam@euphon.net, alex.bennee@linaro.org, richard.henderson@linaro.org, Utkarsh Verma Subject: [RFC PATCH v2 3/8] ppc/spapr: add baseline VOF disk boot support Date: Fri, 2 Oct 2026 10:55:42 +0530 Message-ID: <20261002052605.605858-4-uverma@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261002052605.605858-1-uverma@linux.ibm.com> References: <20261002052605.605858-1-uverma@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: JYRb0Dz7TFlzUWqCWQOUHAgVCbKgR-Q2 X-Proofpoint-GUID: F5iRt29pWE1USwN0TfBB5vXK74FtcCvi X-Proofpoint-Spam-Info: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfXyeN20Gv1A03g wdwEKvIqi5RmKHTP7vdhbupS+mzZdyJUM2esOVqDLdyBWf/00xrkKPhnK60PgnBRerdUA/NV+bY /KdarxtnNZN1LuST+z4POEXDRXi9PfA= X-Authority-Analysis: v=2.4 cv=Vv62kO2n c=1 sm=1 tr=0 ts=6abf40d1 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=660iZSQnnn4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=Ei6tgeEkNT0KFwxEUYUA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfXwwzKLJQ8EdxR DTaHM6vuOhfq2psFkfo2ofWryfkPfMd0xaGtz82AafPvrE4XEO8YTEEifefyEy05vCtfAf3EGym pQfLrfBgLKHgwzvmL8UJvfgwrGDpQcTXGcfAMK4pdCQliPcqq6zbfr+A+oMRbpRXPHy4lyypetf bokLw3ben/dgSI3MXg8oaKAJu66Q2MCV6Nf4E1pvHMOEDfkaJwQIptaT+sBbfZk2rhs7sV61L7o zhNE0lV8saa1y/oxl65BF5mRgpFAdMmtSA6JlIJZl5QIYlS4o5bW+fh6dIk/Ktlmzg6PUfGFDRK /ezRw5lGdwlmttPDEyTtl6s2rdWu0foByIv6kdE2fj52uQiW7ZV/q6o+nVkyeTQI1Rnmg01EWLe /R2tMAhEV8c2RRvGaySNHRPVvvqIqu11smiLSjz5ePtQ2nQxlLinjOvJ5nXZ8kWwuGtNU8/9IdK xJIGKVh66PWZJQ+66nQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-10-02_01,2026-10-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 phishscore=0 bulkscore=0 adultscore=0 priorityscore=1501 malwarescore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2610020020 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=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=uverma@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: qemu development 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: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790918943663158500 Content-Type: text/plain; charset="utf-8" From: Utkarsh Verma Add initial support for disk boot via VOF. Scan all the block devices, and for each device search for PReP partition, load the ELF payload (GRUB), and set the '/chosen' node in FDT with boot ke= rnel and bootpath properties. AI-used-for: code Signed-off-by: Utkarsh Verma Reviewed-by:=C2=A0Avnish=C2=A0Chouhan=C2=A0 --- Chaneglog: v2: - Added bounds checking for partition size before doing g_malloc. - Added a roll back logic for cleaning the memory map FDT for paritial claims. --- hw/ppc/spapr_vof.c | 162 ++++++++++++++++++++++++++++++++++++++++--- hw/ppc/vof.c | 3 + include/hw/ppc/vof.h | 2 + 3 files changed, 159 insertions(+), 8 deletions(-) diff --git a/hw/ppc/spapr_vof.c b/hw/ppc/spapr_vof.c index 46d78756e6..78d5b7d5b5 100644 --- a/hw/ppc/spapr_vof.c +++ b/hw/ppc/spapr_vof.c @@ -10,10 +10,19 @@ #include "hw/ppc/spapr_cpu_core.h" #include "hw/ppc/fdt.h" #include "hw/ppc/vof.h" +#include "hw/ppc/spapr_vof.h" +#include "hw/core/qdev.h" +#include "hw/core/loader.h" #include "system/system.h" +#include "system/block-backend.h" +#include "system/block-backend-global-state.h" #include "qom/qom-qobject.h" +#include "target/ppc/cpu.h" +#include "elf.h" #include "trace.h" =20 +#define SPAPR_VOF_PREP_MAX_SIZE (10 * 1024 * 1024) + target_ulong spapr_h_vof_client(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *_args) { @@ -32,10 +41,10 @@ void spapr_vof_client_dt_finalize(SpaprMachineState *sp= apr, void *fdt) =20 vof_build_dt(fdt, spapr->vof); =20 - if (spapr->vof->bootargs) { - int chosen; + int chosen; + _FDT(chosen =3D fdt_path_offset(fdt, "/chosen")); =20 - _FDT(chosen =3D fdt_path_offset(fdt, "/chosen")); + if (spapr->vof->bootargs) { /* * If the client did not change "bootargs", spapr_dt_chosen() must= have * stored machine->kernel_cmdline in it before getting here. @@ -43,6 +52,22 @@ void spapr_vof_client_dt_finalize(SpaprMachineState *spa= pr, void *fdt) _FDT(fdt_setprop_string(fdt, chosen, "bootargs", spapr->vof->boota= rgs)); } =20 + if (spapr->vof->disk_boot) { + /* + * If disk boot is detected change the "qemu,boot-kernel" to hold + * kernel_addr/kernel_size which contain the GRUB entry point and = size + */ + uint64_t kern[2]; + kern[0] =3D cpu_to_be64(spapr->kernel_addr); + kern[1] =3D cpu_to_be64(spapr->kernel_size); + _FDT(fdt_setprop(fdt, chosen, "qemu,boot-kernel", &kern, sizeof(ke= rn))); + + if (spapr->vof->bootpath) { + _FDT(fdt_setprop_string(fdt, chosen, "bootpath", + spapr->vof->bootpath)); + } + } + /* * SLOF-less setup requires an open instance of stdout for early * kernel printk. By now all phandles are settled so we can open @@ -54,11 +79,116 @@ void spapr_vof_client_dt_finalize(SpaprMachineState *s= papr, void *fdt) } } =20 +static bool vof_elf_segment_cb(void *opaque, + uint64_t paddr, uint64_t vaddr, + uint64_t filesz, uint64_t memsz) +{ + Vof *vof =3D opaque; + + if (memsz =3D=3D 0) { + return true; + } + + if (paddr !=3D vaddr) { + error_report("spapr_vof_load_elf: segment paddr/vaddr mismatch " + "(paddr=3D0x%" PRIx64 " vaddr=3D0x%" PRIx64 ")", + paddr, vaddr); + return false; + } + + if (vof_claim(vof, paddr, memsz, 0) =3D=3D -1) { + error_report("spapr_vof_load_elf: vof_claim failed for " + "paddr=3D0x%" PRIx64 " size=3D0x%" PRIx64, paddr, mem= sz); + return false; + } + + return true; +} + +static bool spapr_vof_try_prep_boot(SpaprMachineState *spapr, Vof *vof) +{ + BlockBackend *blk; + DeviceState *dev; + uint64_t partition_offset; + uint64_t partition_size; + uint8_t *prep_data; + uint64_t entry_point; + uint64_t load_size; + int64_t blk_len; + + for (blk =3D blk_next(NULL); blk; blk =3D blk_next(blk)) { + + if (!blk_is_inserted(blk)) { + continue; + } + + partition_offset =3D 0; + partition_size =3D 0; + + if (!spapr_vof_find_prep_partition(blk, &partition_offset, + &partition_size)) { + continue; + } + + blk_len =3D blk_getlength(blk); + if (blk_len < 0 || + partition_size =3D=3D 0 || + partition_size > SPAPR_VOF_PREP_MAX_SIZE || + partition_offset > (uint64_t)blk_len || + partition_size > (uint64_t)blk_len - partition_offset) { + continue; + } + + prep_data =3D g_malloc(partition_size); + if (blk_pread(blk, partition_offset, partition_size, + prep_data, 0) < 0) { + g_free(prep_data); + continue; + } + + guint saved_claimed_len =3D vof->claimed->len; + uint64_t saved_claimed_base =3D vof->claimed_base; + + uint64_t lowaddr =3D UINT64_MAX, highaddr =3D 0; + entry_point =3D 0; + ssize_t ret =3D load_elf_ram_sym_buf(prep_data, partition_size, + NULL, NULL, NULL, + &entry_point, &lowaddr, &highad= dr, + NULL, ELFDATA2MSB, + PPC_ELF_MACHINE, 0, 0, + NULL, false, NULL, + vof_elf_segment_cb, vof); + if (ret <=3D 0) { + error_report("spapr_vof_try_prep_boot: %s", load_elf_strerror(= ret)); + /* Roll back any partial claims made during the failed load. */ + g_array_set_size(vof->claimed, saved_claimed_len); + vof->claimed_base =3D saved_claimed_base; + g_free(prep_data); + continue; + } + load_size =3D highaddr - lowaddr; + + g_free(prep_data); + + spapr->kernel_addr =3D entry_point; + spapr->kernel_size =3D load_size; + + vof->disk_boot =3D true; + dev =3D blk_get_attached_dev(blk); + if (dev) { + vof->bootpath =3D qdev_get_fw_dev_path(dev); + } + return true; + } + return false; +} + void spapr_vof_reset(SpaprMachineState *spapr, void *fdt, Error **errp) { target_ulong stack_ptr; Vof *vof =3D spapr->vof; PowerPCCPU *first_ppc_cpu =3D POWERPC_CPU(first_cpu); + MachineState *machine =3D MACHINE(spapr); =20 vof_init(vof, spapr->rma_size, errp); =20 @@ -70,7 +200,7 @@ void spapr_vof_reset(SpaprMachineState *spapr, void *fdt= , Error **errp) /* Stack grows downwards plus reserve space for the minimum stack fram= e */ stack_ptr +=3D VOF_STACK_SIZE - 0x20; =20 - if (spapr->kernel_size && + if (machine->kernel_filename && spapr->kernel_size && vof_claim(vof, spapr->kernel_addr, spapr->kernel_size, 0) =3D=3D -= 1) { error_setg(errp, "Memory for kernel is in use"); return; @@ -82,6 +212,14 @@ void spapr_vof_reset(SpaprMachineState *spapr, void *fd= t, Error **errp) return; } =20 + /* + * Disk boot: load GRUB from the PReP boot partition on the block devi= ce, if + * no kernel/initrd are provided + */ + if (!machine->kernel_filename) { + spapr_vof_try_prep_boot(spapr, vof); + } + spapr_vof_client_dt_finalize(spapr, fdt); =20 spapr_cpu_set_entry_state(first_ppc_cpu, SPAPR_ENTRY_POINT, @@ -91,10 +229,18 @@ void spapr_vof_reset(SpaprMachineState *spapr, void *f= dt, Error **errp) /* * At this point the expected allocation map is: * - * 0..c38 - the initial firmware - * 8000..10000 - stack - * 400000.. - kernel - * 3ea0000.. - initramdisk + * Kernel + initrd boot: + * 0..d80 - the initial firmware + * 8000..10000 - stack + * 10000..20000 - vscsi-report-luns table (up to 64 KB, if needed) + * 400000.. - kernel + * 3ea0000.. - initramdisk + * + * Disk (GRUB) boot: + * 0..d80 - the initial firmware + * 8000..10000 - stack + * 10000..20000 - vscsi-report-luns table (up to 64 KB, if needed) + * 400000.. - GRUB (loaded from PReP partition) * * We skip writing FDT as nothing expects it; OF client interface is * going to be used for reading the device tree. diff --git a/hw/ppc/vof.c b/hw/ppc/vof.c index 873e967f1e..9ad1aa7626 100644 --- a/hw/ppc/vof.c +++ b/hw/ppc/vof.c @@ -1042,6 +1042,9 @@ void vof_cleanup(Vof *vof) vof->of_instances =3D NULL; vof->of_instance_last =3D 0; vof->claimed_base =3D 0; + g_free(vof->bootpath); + vof->bootpath =3D NULL; + vof->disk_boot =3D false; } =20 void vof_build_dt(void *fdt, Vof *vof) diff --git a/include/hw/ppc/vof.h b/include/hw/ppc/vof.h index 3a0fbffe54..e17779ee8a 100644 --- a/include/hw/ppc/vof.h +++ b/include/hw/ppc/vof.h @@ -18,6 +18,8 @@ typedef struct Vof { GHashTable *of_instances; /* ihandle -> SpaprOfInstance */ uint32_t of_instance_last; char *bootargs; + char *bootpath; + bool disk_boot; long fw_size; } Vof; =20 --=20 2.55.0 From nobody Sat Oct 24 00:32:48 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790918984; cv=none; d=zohomail.com; s=zohoarc; b=JL3H76VzeSYGeixnpmHobnjaFltkbrl7C43OgxduTy8Yz7zrk4YeWkWYG9/DjrZ1+hs4ivvyek08Nwxxs/YtCzdO/WU+ErTwLZ8M+agwWev+Y6NsrfbTMxlXRd70B4CB+S2CmP7d+ZcBCKIoGlA+q/JVC3ynUpx+ftjRiSiUgJk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790918984; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=pKW69llRPjvNfawX68bCaiVT8YQXNTvAEwYS9v8HB3E=; b=kJXqN2SrJ0J5euZT5HZ6BXsCSlm32FW1bGSLFD0e4YerxBHx1bRYT0In0U3qclnQeSD5ndUnm7EPXNyi4r+nxuT9NMWC8cTMMcPrOi/uyE0X24SW7VhCi2LZjHUsub37gvdmSZbBY+PCCQcQg2E8Izu/wHKRqvPmHudkyOZC1hs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790918984336922.756236364773; Thu, 1 Oct 2026 22:29:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xCVpJ-00008x-2X; Fri, 02 Oct 2026 01:28:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVof-0008L4-H0; Fri, 02 Oct 2026 01:28:25 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVob-00082H-VY; Fri, 02 Oct 2026 01:28:15 -0400 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6922Ztvb1681085; Fri, 2 Oct 2026 05:27:56 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx5qrqm05-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:27:55 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 6922K8cR1897644; Fri, 2 Oct 2026 05:27:54 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4h1aa7xhf2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:27:54 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 6925RqQ857672128 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Oct 2026 05:27:52 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8537058064; Fri, 2 Oct 2026 05:27:52 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 93D105805A; Fri, 2 Oct 2026 05:27:43 +0000 (GMT) Received: from li-bd0dea4c-2912-11b2-a85c-e84940f94d2e.ibmuc.com (unknown [9.43.111.176]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 2 Oct 2026 05:27:43 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=pKW69llRPjvNfawX6 8bCaiVT8YQXNTvAEwYS9v8HB3E=; b=W1B4xnG0axxyCwz2BpJKvoWhbHURZ/cLU YIaEs4ZGWCiSW+Dnga8hvbMiFnxNj+6cEQO6r3in1Wel1uHUEVUtuflbQjehQGat dc+4RVN7q97t7QO3pbcZceFaJxrGcTBzvBX1T9SovsboTF+ppUVcs0Emog8mHTyz Kwv4aABjVvrdscac7SHY/xFVBp62mkQ5SaYgEgCMkfwTd5T8jKOgwadcKd/eAvY6 vme3iFpGb9H55Ph730kg5XSx0OJ+ZrrByBQF5iMp8Ra8sVUpaxf2YAb1emCeHLdh gYhj+ClXzx1ou4qtMNeRYVdDQUG6Bc50B/aw9FyY85JglrYmYGb9Q== From: uverma@linux.ibm.com To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, aik@amd.com, nnmlinux@linux.ibm.com, avnish@linux.ibm.com Cc: pbonzini@redhat.com, th.huth@posteo.eu, sbhat@linux.ibm.com, harshpb@linux.ibm.com, amachhiw@linux.ibm.com, rathc@linux.ibm.com, balaton@eik.bme.hu, philmd@linaro.org, npiggin@gmail.com, marcandre.lureau@redhat.com, fam@euphon.net, alex.bennee@linaro.org, richard.henderson@linaro.org, Utkarsh Verma Subject: [RFC PATCH v2 4/8] ppc/spapr: add VTY backend support to OF read/write/open services Date: Fri, 2 Oct 2026 10:55:43 +0530 Message-ID: <20261002052605.605858-5-uverma@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261002052605.605858-1-uverma@linux.ibm.com> References: <20261002052605.605858-1-uverma@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX95S6msiyyhYD 7neTDHI6p+do7tVBVM/0/h8V/NCpKOHdjK3s2kygyArpSunqxd8AG/AIHrS4hdfaqO4K/KcLBvl 9IWL9ZreTGBwzCB+1URM6gYdi1zSXWA/wkNBg7qT9Of94dPtGBVF+gKnRm43gVnDAVRrCZbCtev 21CSAxzdW1pR+wAM07zfEJSAEZgaVzKysXcrblGReMcoeX/TYIz+2BEsncpDsF+G+36jtasOLuz /L47z68jMcEHG7Co32ner2bwaIKKQt0hK/KWW6c3GaBIhPOYX10AS+Jns/iILwRPm1Js8ooOr/1 He+TSojzpmw0ONchT5WGyj6j4qco5PUp0FWPJiMhO2hFK450Z1nWrfQhbRqYkUyNEq3FHmj7aDX wM4S7CptdhEfjtVjsHVWcAZuVo+YQCmYILoMlzrUU72yOitCaKLX8tHQ6RStE1ueSffA6l29JQH 9obJUXwk3PsFkOCsiVg== X-Authority-Analysis: v=2.4 cv=SPbXx+vH c=1 sm=1 tr=0 ts=6abf40db cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=660iZSQnnn4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=P1mcZCzRt2f-fA_eBAMA:9 X-Proofpoint-ORIG-GUID: DRN-kCGFLv5DHOHWZSGLsvZybKyO9Js2 X-Proofpoint-Spam-Info: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfXwtQJVCwlHdZE nJKnJ25vLJ4aA27ivM1RoceVVkzgzJe3i5NRQt3ABBJsB3RSeV2Gsz/mqNFTeTRtlMz2MqAzl9t Msh2OFFMsvUQAOWootw2obnLIe5neR8= X-Proofpoint-GUID: L-G-MbOmTSfNtPwRbmJcuRhLGHGtFbyZ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-10-02_01,2026-10-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 clxscore=1015 spamscore=0 lowpriorityscore=0 malwarescore=0 adultscore=0 bulkscore=0 impostorscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2610020020 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=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=uverma@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: qemu development 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: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790918985958158500 Content-Type: text/plain; charset="utf-8" From: Utkarsh Verma Extend the VOF client interface to support console I/O through the sPAPR VTY device, which is needed by bootloaders such as GRUB during disk boot. Add vof_read() to implement the OpenFirmware "read" client service, which w= as previously missing. Route the OF read and write services backed by vty_getchars() and vty_putch= ars() Make vty_getchars() public similar to vty_putchars(). AI-used-for: code Signed-off-by: Utkarsh Verma Reviewed-by:=C2=A0Avnish=C2=A0Chouhan=C2=A0 --- hw/char/spapr_vty.c | 2 +- hw/ppc/spapr_vof.c | 2 + hw/ppc/trace-events | 2 + hw/ppc/vof.c | 84 ++++++++++++++++++++++++++++++++++++++ include/hw/ppc/spapr_vio.h | 1 + 5 files changed, 90 insertions(+), 1 deletion(-) diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c index 1dd9fb155c..2c97e0e027 100644 --- a/hw/char/spapr_vty.c +++ b/hw/char/spapr_vty.c @@ -52,7 +52,7 @@ static void vty_receive(void *opaque, const uint8_t *buf,= int size) } } =20 -static int vty_getchars(SpaprVioDevice *sdev, uint8_t *buf, int max) +int vty_getchars(SpaprVioDevice *sdev, uint8_t *buf, int max) { SpaprVioVty *dev =3D VIO_SPAPR_VTY_DEVICE(sdev); int n =3D 0; diff --git a/hw/ppc/spapr_vof.c b/hw/ppc/spapr_vof.c index 78d5b7d5b5..3195c859a4 100644 --- a/hw/ppc/spapr_vof.c +++ b/hw/ppc/spapr_vof.c @@ -76,6 +76,8 @@ void spapr_vof_client_dt_finalize(SpaprMachineState *spap= r, void *fdt) if (stdout_path) { _FDT(vof_client_open_store(fdt, spapr->vof, "/chosen", "stdout", stdout_path)); + _FDT(vof_client_open_store(fdt, spapr->vof, "/chosen", "stdin", + stdout_path)); } } =20 diff --git a/hw/ppc/trace-events b/hw/ppc/trace-events index 1f125ce841..dbdcfada26 100644 --- a/hw/ppc/trace-events +++ b/hw/ppc/trace-events @@ -79,6 +79,7 @@ vof_error_unknown_method(const char *method) "\"%s\"" vof_error_unknown_ihandle_close(uint32_t ih) "ih=3D0x%x" vof_error_unknown_path(const char *path) "\"%s\"" vof_error_write(uint32_t ih) "ih=3D0x%x" +vof_error_read(uint32_t ih) "ih=3D0x%x" vof_finddevice(const char *path, uint32_t ph) "\"%s\" =3D> ph=3D0x%x" vof_claim(uint32_t virt, uint32_t size, uint32_t align, uint32_t ret) "vir= t=3D0x%x size=3D0x%x align=3D0x%x =3D> 0x%x" vof_release(uint32_t virt, uint32_t size, uint32_t ret) "virt=3D0x%x size= =3D0x%x =3D> 0x%x" @@ -92,6 +93,7 @@ vof_package_to_path(uint32_t ph, const char *tmp, int ret= ) "ph=3D0x%x =3D> %s len=3D%d vof_instance_to_path(uint32_t ih, uint32_t ph, const char *tmp, int ret) "= ih=3D0x%x ph=3D0x%x =3D> %s len=3D%d" vof_instance_to_package(uint32_t ih, uint32_t ph) "ih=3D0x%x =3D> ph=3D0x%= x" vof_write(uint32_t ih, unsigned cb, const char *msg) "ih=3D0x%x [%u] \"%s\= "" +vof_read(uint32_t ih, unsigned cb, const char *msg) "ih=3D0x%x [%u] \"%s\"" vof_avail(uint64_t start, uint64_t end, uint64_t size) "0x%"PRIx64"..0x%"P= RIx64" size=3D0x%"PRIx64 vof_claimed(uint64_t start, uint64_t end, uint64_t size) "0x%"PRIx64"..0x%= "PRIx64" size=3D0x%"PRIx64 =20 diff --git a/hw/ppc/vof.c b/hw/ppc/vof.c index 9ad1aa7626..6f6d424347 100644 --- a/hw/ppc/vof.c +++ b/hw/ppc/vof.c @@ -9,6 +9,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ =20 +#include CONFIG_DEVICES /* CONFIG_PSERIES */ #include "qemu/osdep.h" #include "qemu/ctype.h" #include "qemu/timer.h" @@ -23,6 +24,7 @@ #include "qom/qom-qobject.h" #include "trace.h" =20 +#include "hw/ppc/spapr_vio.h" #include =20 /* @@ -45,6 +47,7 @@ typedef struct { typedef struct { char *path; /* the path used to open the instance */ uint32_t phandle; + void *vty; } OfInstance; =20 static int readstr(hwaddr pa, char *buf, int size) @@ -459,6 +462,28 @@ static uint32_t vof_do_open(void *fdt, Vof *vof, int o= ffset, const char *path) ++vof->of_instance_last; =20 inst->path =3D g_strdup(path); + inst->vty =3D NULL; + +#ifdef CONFIG_PSERIES + const char *node_name =3D fdt_get_name(fdt, offset, NULL); + if (node_name && strncmp(node_name, "vty", 3) =3D=3D 0) { + uint8_t discard_buf[VOF_VTY_BUF_SIZE]; + MachineState *ms =3D MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(ms); + + if (spapr && spapr->vio_bus) { + inst->vty =3D spapr_vty_get_default(spapr->vio_bus); + if (inst->vty) { + /* Flush any stale data from the VTY input buffer */ + while (vty_getchars(inst->vty, discard_buf, + sizeof(discard_buf)) > 0) { + /* discard */ + } + } + } + } +#endif + g_hash_table_insert(vof->of_instances, GINT_TO_POINTER(vof->of_instance_last), inst); @@ -577,6 +602,23 @@ static uint32_t vof_write(Vof *vof, uint32_t ihandle, = uint32_t buf, return PROM_ERROR; } =20 +#ifdef CONFIG_PSERIES + if (inst->vty) { + uint32_t total_written =3D 0; + + for ( ; len > 0; len -=3D cb) { + cb =3D MIN(len, sizeof(tmp)); + if (VOF_MEM_READ(buf, tmp, cb) !=3D MEMTX_OK) { + return PROM_ERROR; + } + vty_putchars(inst->vty, (uint8_t *)tmp, cb); + buf +=3D cb; + total_written +=3D cb; + } + return total_written; + } +#endif + for ( ; len > 0; len -=3D cb) { cb =3D MIN(len, sizeof(tmp) - 1); if (VOF_MEM_READ(buf, tmp, cb) !=3D MEMTX_OK) { @@ -594,6 +636,46 @@ static uint32_t vof_write(Vof *vof, uint32_t ihandle, = uint32_t buf, return len; } =20 +static uint32_t vof_read(Vof *vof, uint32_t ihandle, uint32_t buf, + uint32_t len) +{ + OfInstance *inst =3D (OfInstance *) + g_hash_table_lookup(vof->of_instances, GINT_TO_POINTER(ihandle)); + + if (!inst) { + trace_vof_error_read(ihandle); + return PROM_ERROR; + } + +#ifdef CONFIG_PSERIES + if (inst->vty) { + uint8_t tmp[VOF_VTY_BUF_SIZE]; + unsigned cb =3D MIN(len, sizeof(tmp)); + uint32_t bytes_read =3D vty_getchars(inst->vty, tmp, cb); + if (bytes_read > 0) { + if (VOF_MEM_WRITE(buf, tmp, bytes_read) !=3D MEMTX_OK) { + trace_vof_error_read(ihandle); + return PROM_ERROR; + } + } + if (trace_event_get_state(TRACE_VOF_READ) && + qemu_loglevel_mask(LOG_TRACE)) { + char trace_buf[VOF_VTY_BUF_SIZE + 1]; + memcpy(trace_buf, tmp, bytes_read); + trace_buf[bytes_read] =3D '\0'; + trace_vof_read(ihandle, bytes_read, trace_buf); + } + return bytes_read; + } +#endif + + /* + * For other devices, return 0 to indicate no data available. + * This allows GRUB to continue without blocking on input. + */ + return 0; +} + static void vof_claimed_dump(GArray *claimed) { int i; @@ -906,6 +988,8 @@ static uint32_t vof_client_handle(MachineState *ms, voi= d *fdt, Vof *vof, ret =3D vof_instance_to_path(fdt, vof, args[0], args[1], args[2]); } else if (cmpserv("write", 3, 1)) { ret =3D vof_write(vof, args[0], args[1], args[2]); + } else if (cmpserv("read", 3, 1)) { + ret =3D vof_read(vof, args[0], args[1], args[2]); } else if (cmpserv("claim", 3, 1)) { uint64_t ret64 =3D vof_claim(vof, args[0], args[1], args[2]); =20 diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h index 0ea0dbae8b..81e7c0b91b 100644 --- a/include/hw/ppc/spapr_vio.h +++ b/include/hw/ppc/spapr_vio.h @@ -136,6 +136,7 @@ static inline int spapr_vio_dma_set(SpaprVioDevice *dev= , uint64_t taddr, int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq); =20 SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg); +int vty_getchars(SpaprVioDevice *sdev, uint8_t *buf, int max); void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len); void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev); void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd); --=20 2.55.0 From nobody Sat Oct 24 00:32:48 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790918997; cv=none; d=zohomail.com; s=zohoarc; b=FZmvz5//II5z5MzugM7JtxrflSkK5bFzcKqv/LyDCc5a4c4iGm1b5E0rrydA+L7XrNGOZ3rZV5AeWLr9Y4ZsSVsVL1NDsL01clzZyzZDuBUmFSLmHPQfKk8QbRTzMEA+N5S5JRtOaUEFztFde39qypeo6u2Izxhvw/nnSv8r0bY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790918997; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=LQuhzk3+SlnJVJ+TYy3QZqVA4Au11GVYP11q3OYC0R8=; b=XQ6nfP+o+uBkXzldZvX0SkWTP6Y6Zo/WvAT9nAKey0FlESeFU4bdtswyf9cIY8vGhVGbfM965/dc9lptB8O3qxBWCe7keurTjdWKTIbfTED+oCo6G7ZMMFUbpaeWYl5ZnA8hbj/g0ptt2r+Vl4uBHEgMK7JcFv1YN3ypthPbKZk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790918997281521.5950059082048; Thu, 1 Oct 2026 22:29:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xCVpK-0000CV-Ro; Fri, 02 Oct 2026 01:28:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVoc-0008Ko-DT; Fri, 02 Oct 2026 01:28:19 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVoZ-00082A-Pl; Fri, 02 Oct 2026 01:28:13 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6922ZW0H3513067; Fri, 2 Oct 2026 05:28:05 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx5ptp7nh-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:28:04 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 6922KE0w1834610; Fri, 2 Oct 2026 05:28:03 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4h1y2dhfjd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:28:03 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 6925S2ng27656746 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Oct 2026 05:28:02 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 49B425805A; Fri, 2 Oct 2026 05:28:02 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7A4D558056; Fri, 2 Oct 2026 05:27:53 +0000 (GMT) Received: from li-bd0dea4c-2912-11b2-a85c-e84940f94d2e.ibmuc.com (unknown [9.43.111.176]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 2 Oct 2026 05:27:53 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=LQuhzk3+SlnJVJ+TY y3QZqVA4Au11GVYP11q3OYC0R8=; b=nPXMMzNFeyZ+PMGPRHoDBVmi5g1OnDyfb LIJ0/YBHjrUyYNAMxVEfaiDlY6IEr8dHIFPuqaWf8wSxGdNuPQaLn+AeENjecs6V 2Z0ExEXfSel6ktBVz7aM6iPkgzR2WM0/J2rZQ4gqEnzSIavcWaQCOgnYLcJfpIwi skca+vjQGAnPFthjBgAEkXu3+GC7+6w4BiZy8ds3wU0NbNcNl3V32MceaRrOkhXi 1u8BkqZU9tepJs5hHUCirHiTOjvQcZztn7dzbMqvMBjNTqp/QD/jGzoEf5iuTXLO 2msAaY+vH29antWAv8BvX1cXxVCmhJsn8jVrzuylUlZB8YhHzE/Sw== From: uverma@linux.ibm.com To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, aik@amd.com, nnmlinux@linux.ibm.com, avnish@linux.ibm.com Cc: pbonzini@redhat.com, th.huth@posteo.eu, sbhat@linux.ibm.com, harshpb@linux.ibm.com, amachhiw@linux.ibm.com, rathc@linux.ibm.com, balaton@eik.bme.hu, philmd@linaro.org, npiggin@gmail.com, marcandre.lureau@redhat.com, fam@euphon.net, alex.bennee@linaro.org, richard.henderson@linaro.org, Utkarsh Verma Subject: [RFC PATCH v2 5/8] ppc/spapr: add block device backend to VOF open/read/write/seek services Date: Fri, 2 Oct 2026 10:55:44 +0530 Message-ID: <20261002052605.605858-6-uverma@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261002052605.605858-1-uverma@linux.ibm.com> References: <20261002052605.605858-1-uverma@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-ORIG-GUID: -w_-X_KHlF4I5218ZQ_6fMeyVv15mVbL X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX7pslFDuaHX/P rwXys4X2Q3s/NNvDz7DW4yIUZmlHzKk7Jo9s09UQEc0R9mOd0An3V0N1vDJRXNLMcHOBPm27Lq4 MkzPwm7gee3IZH97V2UQTFxQ2mXtugAx48NzfU5QifHvFQS1iVc9XxQWNzNXRpnv4IdXSGJIbvM UTyzv6YGEf01FvYmU1Wbtyrn/og/SUKM0CmwBs9ZqaUwgFhAOKU1ux8EMHJ5GYjYEoUDpAB93q2 pMyaiSnkN8+qlPcYUkLM5SKR/OH/l/Q8R4II8aUGxkxHHKt1xQ8obY6nmxprm8m4w2PcNS+0fbj PQmEGWcDN5dRCl/y4rlQD3oPZbC+oirtr/SQGYZc4wa/neqLB+0G0Q36wzMKd2JE/sFPtCtMKm4 zDEQSoA6BhcBUEOck0hR3nq20kHlIEYXXERjrURSCsrg0mHfmdYVCypDosHJdWemcqfr6i1zcgX 2cLXA3GvinVvxhMmHAA== X-Proofpoint-Spam-Info: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfXyenq383Z/2Qq zcshQXLortgsgnrGBYObeQ9tAooxcXs7O6CEkvrlXwBrqpxWq+ssOW+Z4RX3p8sXPks6NwNXI74 25FmoES0PWqy0Xy7DnOewVnceNgHny8= X-Authority-Analysis: v=2.4 cv=EY5d0/mC c=1 sm=1 tr=0 ts=6abf40e4 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=660iZSQnnn4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=gEfo2CItAAAA:8 a=VnNF1IyMAAAA:8 a=WDcW98JQBSw0CRIMMy4A:9 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-GUID: gvn7uCj8J7gYzRK3mDFpi4w_IPhKDiWh X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-10-02_01,2026-10-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 suspectscore=0 adultscore=0 clxscore=1015 malwarescore=0 impostorscore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2610020020 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=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=uverma@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: qemu development 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: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790918997934158500 Content-Type: text/plain; charset="utf-8" From: Utkarsh Verma Extend the VOF client interface to support block device I/O through the sPAPR SCSI disk, which is needed by bootloaders such as GRUB during VOF disk boot. Add BlockBackend and position tracking fields to OfInstance and use them in vof_seek(), vof_write() and vof_read() to extend their functionality to handle block devices as well. In vof_do_open(), detect "disk" FDT nodes, extract the SRP LUN from the path string, and use scsi_device_find() + blk_by_dev() to obtain the matching BlockBackend. Add vof_seek() to implement the OpenFirmware "seek" client service, which was previously missing. AI-used-for: code Signed-off-by: Utkarsh Verma Reviewed-by:=C2=A0Avnish=C2=A0Chouhan=C2=A0 --- Changelog: v2: - vof_do_open(): replaced brute force blk_next() loop with vof_find_vscsi_bus() + scsi_device_find() + blk_by_dev() for a SCSI disk discovery. - vof_write() block path: capped I/O to VOF_BLK_BUF_SIZE (64 KB) per iteration, checked blk_flush() return value, added bdrv_is_read_only() guard before any write attempt. - vof_write() serial path: fixed an existing bug, which did not advance the buffer after each iteration and returned the remaining len instead of bytes written. - vof_read() block path: added the same loop pattern as vof_write(), advancing buf and position correctly per iteration. - path_offset(): added wildcard fallback so "disk@" paths resolve to the parent's generic "disk" FDT subnode. --- hw/ppc/trace-events | 2 + hw/ppc/vof.c | 217 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 215 insertions(+), 4 deletions(-) diff --git a/hw/ppc/trace-events b/hw/ppc/trace-events index dbdcfada26..a61398ecb2 100644 --- a/hw/ppc/trace-events +++ b/hw/ppc/trace-events @@ -78,6 +78,7 @@ vof_error_unknown_service(const char *service, int nargs,= int nret) "\"%s\" args vof_error_unknown_method(const char *method) "\"%s\"" vof_error_unknown_ihandle_close(uint32_t ih) "ih=3D0x%x" vof_error_unknown_path(const char *path) "\"%s\"" +vof_error_seek(uint32_t ih) "ih=3D0x%x" vof_error_write(uint32_t ih) "ih=3D0x%x" vof_error_read(uint32_t ih) "ih=3D0x%x" vof_finddevice(const char *path, uint32_t ph) "\"%s\" =3D> ph=3D0x%x" @@ -92,6 +93,7 @@ vof_interpret(const char *cmd, uint32_t param1, uint32_t = param2, uint32_t ret, u vof_package_to_path(uint32_t ph, const char *tmp, int ret) "ph=3D0x%x =3D>= %s len=3D%d" vof_instance_to_path(uint32_t ih, uint32_t ph, const char *tmp, int ret) "= ih=3D0x%x ph=3D0x%x =3D> %s len=3D%d" vof_instance_to_package(uint32_t ih, uint32_t ph) "ih=3D0x%x =3D> ph=3D0x%= x" +vof_seek(uint32_t ih, uint64_t pos) "ih=3D0x%x pos=3D0x%"PRIx64 vof_write(uint32_t ih, unsigned cb, const char *msg) "ih=3D0x%x [%u] \"%s\= "" vof_read(uint32_t ih, unsigned cb, const char *msg) "ih=3D0x%x [%u] \"%s\"" vof_avail(uint64_t start, uint64_t end, uint64_t size) "0x%"PRIx64"..0x%"P= RIx64" size=3D0x%"PRIx64 diff --git a/hw/ppc/vof.c b/hw/ppc/vof.c index 6f6d424347..d4b57b3b46 100644 --- a/hw/ppc/vof.c +++ b/hw/ppc/vof.c @@ -11,6 +11,7 @@ =20 #include CONFIG_DEVICES /* CONFIG_PSERIES */ #include "qemu/osdep.h" +#include "qemu/cutils.h" #include "qemu/ctype.h" #include "qemu/timer.h" #include "qemu/range.h" @@ -25,6 +26,9 @@ #include "trace.h" =20 #include "hw/ppc/spapr_vio.h" +#include "hw/scsi/scsi.h" +#include "system/block-backend.h" +#include "block/block-io.h" #include =20 /* @@ -38,6 +42,7 @@ #define VOF_MAX_METHODLEN 256 #define VOF_MAX_FORTHCODE 256 #define VOF_VTY_BUF_SIZE 256 +#define VOF_BLK_BUF_SIZE (64 * 1024) =20 typedef struct { uint64_t start; @@ -47,6 +52,8 @@ typedef struct { typedef struct { char *path; /* the path used to open the instance */ uint32_t phandle; + BlockBackend *blk; + uint64_t pos; /* current position for seek operations */ void *vty; } OfInstance; =20 @@ -138,6 +145,8 @@ static int path_offset(const void *fdt, const char *pat= h) { g_autofree char *p =3D NULL; char *at; + char *last_slash; + int offset; =20 /* * https://www.devicetree.org/open-firmware/bindings/ppc/release/ppc-2= _1.html#HDR16 @@ -156,7 +165,76 @@ static int path_offset(const void *fdt, const char *pa= th) } } =20 - return fdt_path_offset(fdt, p); + offset =3D fdt_path_offset(fdt, p); + if (offset >=3D 0) { + return offset; + } + + /* + * Apply the OF wildcard rule for vSCSI disk paths. A path ending in + * disk@ has no per-LUN FDT node, instead the FDT contains a = single + * generic "disk" child (no srp-lun appended to the path). The phandle= is + * shared by all LUNs on the adapter, matching the Open Firmware behav= iour. + */ + last_slash =3D strrchr(p, '/'); + if (last_slash && strncmp(last_slash + 1, "disk@", 5) =3D=3D 0) { + int parent_off; + + *last_slash =3D '\0'; + parent_off =3D fdt_path_offset(fdt, p); + if (parent_off >=3D 0) { + int child_off =3D fdt_subnode_offset(fdt, parent_off, "disk"); + if (child_off >=3D 0) { + return child_off; + } + } + } + + return offset; +} + +/* + * Return the SCSIBus for a v-scsi@ path, or NULL if not found. + */ +static SCSIBus *vof_find_vscsi_bus(MachineState *ms, const char *path) +{ +#ifdef CONFIG_PSERIES + SpaprMachineState *spapr =3D SPAPR_MACHINE(ms); + const char *at; + const char *endptr; + unsigned long reg; + SpaprVioDevice *vdev; + BusState *bus; + + if (!spapr || !spapr->vio_bus) { + return NULL; + } + + at =3D strstr(path, "v-scsi@"); + if (!at) { + return NULL; + } + at =3D strchr(at, '@'); + if (!at) { + return NULL; + } + + if (qemu_strtoul(at + 1, &endptr, 16, ®) || endptr =3D=3D at + 1) { + return NULL; + } + + vdev =3D spapr_vio_find_by_reg(spapr->vio_bus, (uint32_t)reg); + if (!vdev) { + return NULL; + } + + QLIST_FOREACH(bus, &vdev->qdev.child_bus, sibling) { + if (object_dynamic_cast(OBJECT(bus), TYPE_SCSI_BUS)) { + return SCSI_BUS(bus); + } + } +#endif /* CONFIG_PSERIES */ + return NULL; } =20 static uint32_t vof_finddevice(const void *fdt, uint32_t nodeaddr) @@ -450,6 +528,8 @@ static uint32_t vof_do_open(void *fdt, Vof *vof, int of= fset, const char *path) { uint32_t ret =3D PROM_ERROR; OfInstance *inst =3D NULL; + const char *node_name; + MachineState *ms =3D MACHINE(qdev_get_machine()); =20 if (vof->of_instance_last =3D=3D 0xFFFFFFFF) { /* We do not recycle ihandles yet */ @@ -462,13 +542,43 @@ static uint32_t vof_do_open(void *fdt, Vof *vof, int = offset, const char *path) ++vof->of_instance_last; =20 inst->path =3D g_strdup(path); + inst->blk =3D NULL; + inst->pos =3D 0; inst->vty =3D NULL; =20 + node_name =3D fdt_get_name(fdt, offset, NULL); + + /* + * vSCSI disk open. The FDT contains only a generic "disk" child node= (no + * srp-lun appended to the path), matching Open Firmware behaviour. + * Extract the LUN from the "disk@" component of the path string + * and use it to find the corresponding QEMU block backend. + */ + if (node_name && strcmp(node_name, "disk") =3D=3D 0) { + const char *disk_at =3D strstr(path, "/disk@"); + const char *endptr; + uint64_t srp_lun; + + if (disk_at && + qemu_strtou64(disk_at + 6, &endptr, 16, &srp_lun) =3D=3D 0) { + SCSIBus *sbus =3D vof_find_vscsi_bus(ms, path); + + if (sbus) { + uint32_t target =3D (srp_lun >> 56) & 0x3f; + uint32_t channel =3D (srp_lun >> 53) & 0x7; + uint32_t lun =3D (srp_lun >> 48) & 0x1f; + SCSIDevice *sdev =3D scsi_device_find(sbus, (int)channel, + (int)target, (int)lun); + if (sdev) { + inst->blk =3D blk_by_dev(sdev); + } + } + } + } + #ifdef CONFIG_PSERIES - const char *node_name =3D fdt_get_name(fdt, offset, NULL); if (node_name && strncmp(node_name, "vty", 3) =3D=3D 0) { uint8_t discard_buf[VOF_VTY_BUF_SIZE]; - MachineState *ms =3D MACHINE(qdev_get_machine()); SpaprMachineState *spapr =3D SPAPR_MACHINE(ms); =20 if (spapr && spapr->vio_bus) { @@ -602,6 +712,38 @@ static uint32_t vof_write(Vof *vof, uint32_t ihandle, = uint32_t buf, return PROM_ERROR; } =20 + if (inst->blk) { + if (bdrv_is_read_only(blk_bs(inst->blk))) { + trace_vof_error_write(ihandle); + return PROM_ERROR; + } + + g_autofree uint8_t *blkbuf =3D g_malloc(MIN(len, (uint32_t)VOF_BLK= _BUF_SIZE)); + uint32_t total =3D 0; + + while (len > 0) { + cb =3D MIN(len, (uint32_t)VOF_BLK_BUF_SIZE); + if (VOF_MEM_READ(buf, blkbuf, cb) !=3D MEMTX_OK) { + trace_vof_error_write(ihandle); + return PROM_ERROR; + } + if (blk_pwrite(inst->blk, inst->pos, cb, blkbuf, 0) < 0) { + trace_vof_error_write(ihandle); + return PROM_ERROR; + } + inst->pos +=3D cb; + buf +=3D cb; + len -=3D cb; + total +=3D cb; + } + if (blk_flush(inst->blk) < 0) { + trace_vof_error_write(ihandle); + return PROM_ERROR; + } + trace_vof_write(ihandle, total, "(disk)"); + return total; + } + #ifdef CONFIG_PSERIES if (inst->vty) { uint32_t total_written =3D 0; @@ -619,6 +761,7 @@ static uint32_t vof_write(Vof *vof, uint32_t ihandle, u= int32_t buf, } #endif =20 + uint32_t total_traced =3D 0; for ( ; len > 0; len -=3D cb) { cb =3D MIN(len, sizeof(tmp) - 1); if (VOF_MEM_READ(buf, tmp, cb) !=3D MEMTX_OK) { @@ -631,9 +774,11 @@ static uint32_t vof_write(Vof *vof, uint32_t ihandle, = uint32_t buf, tmp[cb] =3D '\0'; trace_vof_write(ihandle, cb, tmp); } + buf +=3D cb; + total_traced +=3D cb; } =20 - return len; + return total_traced; } =20 static uint32_t vof_read(Vof *vof, uint32_t ihandle, uint32_t buf, @@ -647,6 +792,33 @@ static uint32_t vof_read(Vof *vof, uint32_t ihandle, u= int32_t buf, return PROM_ERROR; } =20 + if (inst->blk) { + g_autofree uint8_t *tmp =3D g_malloc(MIN(len, (uint32_t)VOF_BLK_BU= F_SIZE)); + uint32_t total =3D 0; + + while (len > 0) { + unsigned cb =3D MIN(len, (uint32_t)VOF_BLK_BUF_SIZE); + int ret =3D blk_pread(inst->blk, inst->pos, cb, tmp, 0); + if (ret < 0) { + trace_vof_error_read(ihandle); + return PROM_ERROR; + } + + if (VOF_MEM_WRITE(buf, tmp, cb) !=3D MEMTX_OK) { + trace_vof_error_read(ihandle); + return PROM_ERROR; + } + + inst->pos +=3D cb; + buf +=3D cb; + len -=3D cb; + total +=3D cb; + } + + trace_vof_read(ihandle, total, "(disk)"); + return total; + } + #ifdef CONFIG_PSERIES if (inst->vty) { uint8_t tmp[VOF_VTY_BUF_SIZE]; @@ -676,6 +848,41 @@ static uint32_t vof_read(Vof *vof, uint32_t ihandle, u= int32_t buf, return 0; } =20 +static uint32_t vof_seek(Vof *vof, uint32_t ihandle, uint32_t pos_hi, + uint32_t pos_lo) +{ + OfInstance *inst =3D (OfInstance *) + g_hash_table_lookup(vof->of_instances, GINT_TO_POINTER(ihandle)); + uint64_t pos =3D ((uint64_t)pos_hi << 32) | pos_lo; + + if (!inst) { + trace_vof_error_seek(ihandle); + return PROM_ERROR; + } + + if (inst->blk) { + int64_t size =3D blk_getlength(inst->blk); + + if (size < 0) { + trace_vof_error_seek(ihandle); + return PROM_ERROR; + } + + if (pos > (uint64_t)size) { + trace_vof_error_seek(ihandle); + return PROM_ERROR; + } + + inst->pos =3D pos; + trace_vof_seek(ihandle, pos); + return 0; + } + + /* VTY and other devices don't support seek */ + trace_vof_error_seek(ihandle); + return PROM_ERROR; +} + static void vof_claimed_dump(GArray *claimed) { int i; @@ -986,6 +1193,8 @@ static uint32_t vof_client_handle(MachineState *ms, vo= id *fdt, Vof *vof, ret =3D vof_package_to_path(fdt, args[0], args[1], args[2]); } else if (cmpserv("instance-to-path", 3, 1)) { ret =3D vof_instance_to_path(fdt, vof, args[0], args[1], args[2]); + } else if (cmpserv("seek", 3, 1)) { + ret =3D vof_seek(vof, args[0], args[1], args[2]); } else if (cmpserv("write", 3, 1)) { ret =3D vof_write(vof, args[0], args[1], args[2]); } else if (cmpserv("read", 3, 1)) { --=20 2.55.0 From nobody Sat Oct 24 00:32:48 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790918985; cv=none; d=zohomail.com; s=zohoarc; b=I74Xz73oQizljomco2OzD6GkLfpajgOeOFOE2c53g+6PhTLwMeWhlUCeRifgZqM5CCtPLv07Lxsruu45EGlil10RFTTaRQJJQciWOdd1LhOlKhdq32uCrJnyYwhSLcrhjFQu/cznFJn2etMkAMSpa6xmpM5EtdyraXmsGFW5uck= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790918985; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JT40iS79Lu/ZoEx094ResrwlVg2k3uwBm9aqvdugAUQ=; b=SWQNNvnDIoyZu1+WMQZUqAyC454Q1yIyindO/16EJvP93D9lheCaOIz8Pj11TEFFLiizztNhVCXQuJEsJI19vgrk7YjAXJ7goPvpEEE5CZcaNxGQtmTJzFcbEGKPYtuD4gNcvntoTKnoqL7OT5uTHGCPyqs4LbaeMw6jFVY2FSg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790918985243559.3378964431621; Thu, 1 Oct 2026 22:29:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xCVpM-0000GA-TU; Fri, 02 Oct 2026 01:29:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVok-0008OS-S5; Fri, 02 Oct 2026 01:28:28 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVoj-00082Z-34; Fri, 02 Oct 2026 01:28:22 -0400 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6922ZScb1680352; Fri, 2 Oct 2026 05:28:14 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx5qrqm0x-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:28:14 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 6922KATR587032; Fri, 2 Oct 2026 05:28:13 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4h0q4pjyyt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:28:13 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 6925SCms27722366 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Oct 2026 05:28:12 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 23F975805A; Fri, 2 Oct 2026 05:28:12 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 189E758056; Fri, 2 Oct 2026 05:28:03 +0000 (GMT) Received: from li-bd0dea4c-2912-11b2-a85c-e84940f94d2e.ibmuc.com (unknown [9.43.111.176]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 2 Oct 2026 05:28:02 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=JT40iS79Lu/ZoEx09 4ResrwlVg2k3uwBm9aqvdugAUQ=; b=i2DD6iWrpMlPayoSiENhE7glpBsYQmGod xm0dSzjTTKCPTbQMKS/U1q/ZbOyX+gO9iQJeVDW9SdJITIG/u/3axbUYVtJHnUgo rwuLi40HP50CNadzbEMWXm2XOMmR8+GDfW3tmvzvbb2I0YGVpv6fIHUSPLr9NxNb L4X9Zd7DUEM6xxkClRNLxjpXjKleACasjNYUojCtFsISMxBC1bucRvIFVh5wjfJ/ rFpb8tKlbBbo0AQh071Lgg6cjL3Vb2d5GigtEbN+egsY3Oej965hKHchYwYKWOTw bIKqPExLeeyAKKI5SwJrILzriTBzzLkDFiGK2ToBFfnghpvY73qnA== From: uverma@linux.ibm.com To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, aik@amd.com, nnmlinux@linux.ibm.com, avnish@linux.ibm.com Cc: pbonzini@redhat.com, th.huth@posteo.eu, sbhat@linux.ibm.com, harshpb@linux.ibm.com, amachhiw@linux.ibm.com, rathc@linux.ibm.com, balaton@eik.bme.hu, philmd@linaro.org, npiggin@gmail.com, marcandre.lureau@redhat.com, fam@euphon.net, alex.bennee@linaro.org, richard.henderson@linaro.org, Utkarsh Verma Subject: [RFC PATCH v2 6/8] spapr_vscsi: add VOF disk nodes to the device tree Date: Fri, 2 Oct 2026 10:55:45 +0530 Message-ID: <20261002052605.605858-7-uverma@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261002052605.605858-1-uverma@linux.ibm.com> References: <20261002052605.605858-1-uverma@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX3bEqjour4qgz uBHGsm/O8KbOfW5tWry5qZh8OGErhPyKJ4k7Q1I21r6zOlK4PcL0iBbnrEQvho8TONv6aiKFJ0D VJyUIaC9Fh+WcZDKWFYbl4z5Bs92PD6v4S/xvmxk6/OYHnoAXWdaFyQTbYt24kkIvzUTM676tjp GQu/kqT7UEfGEA13VNz+OmjYzO5j3PRk+FuFK1kzn+zrfuCP9dVOptGo198WwSF4Rr+ywHgz5mA /hPxO5mFaprlSV3YnY1mza4sPbgfFbBg5ADRMTHjpm+OdkVSU8v9jek7KzeySQsOl+xwmGCiphq JqREQznqfCT5N+ZQpI6jlOG/mlY3UwyqwuZzj8D01QwGZ9DyD3FydYcGIItr9RwLTY5Zt9Hv5nR nkOz/1TWnTHGHBbwDgkuHMHrdTV4FOFAF1O1Ri8sZgdBspPzTeDUweafLVVVgq25DNHXnwh/uJK TLwX3ETroJZWIpHkyHQ== X-Authority-Analysis: v=2.4 cv=SPbXx+vH c=1 sm=1 tr=0 ts=6abf40ee cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=660iZSQnnn4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=gihry9JuEvR3qkE0AycA:9 X-Proofpoint-ORIG-GUID: mIlqppF98i2ca4OMeFKVkdC2KSnDuGAB X-Proofpoint-Spam-Info: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX4K3ZhYuh1j6o sKjF3bYWVYAze2RBSIBTUzhWbAhK44x289vZnX3Fwu7+/ehLdqzrOKE6kmh6rqX0dI8kZ3fDQ0/ 8oPArVIA0x5Z0LCSKs7pGifF36GR0lo= X-Proofpoint-GUID: ogfiHKEjdJNNssuDVojUuFznpKOK8Ea2 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-10-02_01,2026-10-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 clxscore=1015 spamscore=0 lowpriorityscore=0 malwarescore=0 adultscore=0 bulkscore=0 impostorscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2610020020 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=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=uverma@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: qemu development 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: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790918985885158500 Content-Type: text/plain; charset="utf-8" From: Utkarsh Verma In VOF mode, add a single generic "disk" child node under the vSCSI FDT node instead of one node per attached LUN, matching the Open Firmware behaviour. The node carries device_type =3D "block" and a name property. The path_offset() wildcard fallback introduced alongside this change resolves any "disk@" open request to this shared node, from which vof_do_open() extracts the LUN from the path string at runtime. AI-used-for: code Signed-off-by: Utkarsh Verma Reviewed-by:=C2=A0Avnish=C2=A0Chouhan=C2=A0 --- Changelog: v2: - Replaced one FDT child node per attached LUN ("disk@" with reg + device_type) with a single generic "disk" wildcard node shared by all LUNs, matching the Open Firmware behaviour. --- hw/scsi/spapr_vscsi.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index b4c8f94d22..a799181d0f 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -1255,6 +1255,29 @@ static int spapr_vscsi_devnode(SpaprVioDevice *dev, = void *fdt, int node_off) return ret; } =20 + /* + * In VOF mode add a generic "disk" wildcard child node without append= ing + * srp-lun to it's path name, matching the actual Open Firmware behavi= our. + * Its phandle and device_type covers any disk@ path. + */ + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + if (spapr->vof) { + int disk_off =3D fdt_add_subnode(fdt, node_off, "disk"); + if (disk_off < 0) { + return disk_off; + } + + ret =3D fdt_setprop_string(fdt, disk_off, "name", "disk"); + if (ret < 0) { + return ret; + } + + ret =3D fdt_setprop_string(fdt, disk_off, "device_type", "block"); + if (ret < 0) { + return ret; + } + } + return 0; } =20 --=20 2.55.0 From nobody Sat Oct 24 00:32:48 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790918989; cv=none; d=zohomail.com; s=zohoarc; b=atHu8JZ5OVLm6Td7iXxJzZB64NKDFahx3W01StmoVgCizoJsEwQo7zuqKjbiYl4sU04tor1N+eHs94j8nuoDSASXqppkXaPEynoa3l0J+j5SUrsAlzP/YfP1YgvroQKZLlnCLYsLSWwOclGBFsOkEv6ECJMe30lSkPYKY+sYnF4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790918989; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=UjaDBl3aAWup+nFCgC7djZBfi0f+vNkd4Lcrii64EVg=; b=HNu9eYzwTKsxJ809FaeeHfAcZwvfnVHP5KhGsAFhkLan6S67c5H/AsEB0QGHzBSbH9i4P0SmwvLvPeysXBOmS/qXyBqxKDb8ypuY+oBf2TxQKYAAe5HcudBQlI+D8m8ujDQhi6OzenukW4bkaZ8XSOx81j4kDm74o9VQpi34rdM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790918989447106.48529324557296; Thu, 1 Oct 2026 22:29:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xCVpQ-0000L6-Ps; Fri, 02 Oct 2026 01:29:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVow-0008Rc-7L; Fri, 02 Oct 2026 01:28:37 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVot-000831-U6; Fri, 02 Oct 2026 01:28:33 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6922ZYww2274814; Fri, 2 Oct 2026 05:28:24 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx4fepafa-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:28:23 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 6922KBUT1897679; Fri, 2 Oct 2026 05:28:23 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4h1aa7xhfw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:28:23 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 6925SLka32047740 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Oct 2026 05:28:22 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A427858062; Fri, 2 Oct 2026 05:28:21 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E30B258056; Fri, 2 Oct 2026 05:28:12 +0000 (GMT) Received: from li-bd0dea4c-2912-11b2-a85c-e84940f94d2e.ibmuc.com (unknown [9.43.111.176]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 2 Oct 2026 05:28:12 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=UjaDBl 3aAWup+nFCgC7djZBfi0f+vNkd4Lcrii64EVg=; b=YrV6uU6OgrcJh4nVesFEto 0kNCxnU44sM2LBIITEOQSrsjXzh9t1ZWEBcby4BxcSrJ3ry8OR2i3y2t49gBlA79 32eiol90m2DngLYf4VYzF+M8FRTudsKup+L8YytlDe2BB2vOJ+xkFHTfe3Fhk00K YnTBrmxiFKVTGdNxLgZiADb1DkpXQXGbtnuufwT/pK3gTUIQkq19l8GUm2qkWgue LLtbAnf8CbojW/LX/WaBUW3zLXfGPebrn7sa2NvrnCoMKdT5l/QpK7ofeDTAOzS/ CaEv3EHkMNz03oa+Ifx4RPzY1zRcy4LXO0Noxfmfqcd62OliRfDa7g7BTnS1ShYA == From: uverma@linux.ibm.com To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, aik@amd.com, nnmlinux@linux.ibm.com, avnish@linux.ibm.com Cc: pbonzini@redhat.com, th.huth@posteo.eu, sbhat@linux.ibm.com, harshpb@linux.ibm.com, amachhiw@linux.ibm.com, rathc@linux.ibm.com, balaton@eik.bme.hu, philmd@linaro.org, npiggin@gmail.com, marcandre.lureau@redhat.com, fam@euphon.net, alex.bennee@linaro.org, richard.henderson@linaro.org, Utkarsh Verma Subject: [RFC PATCH v2 7/8] ppc/spapr: strip OF path argument suffix in path_offset Date: Fri, 2 Oct 2026 10:55:46 +0530 Message-ID: <20261002052605.605858-8-uverma@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261002052605.605858-1-uverma@linux.ibm.com> References: <20261002052605.605858-1-uverma@linux.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Authority-Analysis: v=2.4 cv=FYWiV5+6 c=1 sm=1 tr=0 ts=6abf40f8 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=IkcTkHD0fZMA:10 a=660iZSQnnn4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=pqpSryZqIyZLl4xueesA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfXxzGL4to0KZFN 9UWARA72hnoyepaBylcC0sKYDoVWTw9qHqMO8jm811/18vmem5XDZSlk8OoKK2G5g57nIJ7yn3M 1irZAYkyAgTnWF7hw9WbZ4nnIAh6VzY= X-Proofpoint-ORIG-GUID: f2y8GdRwNo0UuoalH2jcpb3R4cfUDO5o X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX+i6jaizvYM+b G0P8sByA3KCKAsBQqY83eUKXcqkb1QzFHG1oe7SuzNuZSsC1T+3II4XW4nv4WiZxt+s2f+auxpd 3r5gyHVjfCFiLyOwKKUnk+cqS/gIJNdOofvIaEfwdXXKokwI2IeXGW2hTI75XlB7DKJr0iQqUnl muGSjWA/4pg86SOQjPdv4AT6SUORFPWvU3jccOaWEdzLXfmtQjXuapuYQ4h5ieLaknCwmYd0KdO fkxFYrox571geKaYEzztOeadGi4fgWos+KRDnnz0ZngbsXv0m3baWQA7RejJWAAgpxaN0G2X+EB leuFaNi5N5NfbHrW/sQ/ja/wgdiE3AsYLpdMinLcNGN361Ei1uyR3w9HglYrLNpA1QfsR+T1eJn 6IcQ4iiXJw33T6KDrwwjvuH1OqFfHK9qzZG8+paM0boL7jRv+1zF+1HnUKXMpn7sCsexyTBQoXj BnVvgzbCai3b59k+QLA== X-Proofpoint-GUID: gY34ceRdIJiGdwh4eYCVHduA0NGRt51E X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-10-02_01,2026-10-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 clxscore=1015 impostorscore=0 spamscore=0 phishscore=0 priorityscore=1501 malwarescore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2610020020 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=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=uverma@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: qemu development 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: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790918989666158500 From: Utkarsh Verma OF paths can include a ":argument" suffix on the last component (e.g. "disk@8000000000000000:0"), which is an OF path argument such as a partition number. This is not part of the FDT node name and causes fdt_path_offset() to fail. Strip any ":" from the last path component only, leaving intermediate components untouched. AI-used-for: code Signed-off-by: Utkarsh Verma Reviewed-by:=C2=A0Avnish=C2=A0Chouhan=C2=A0 --- hw/ppc/vof.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hw/ppc/vof.c b/hw/ppc/vof.c index d4b57b3b46..75b2398ae7 100644 --- a/hw/ppc/vof.c +++ b/hw/ppc/vof.c @@ -146,6 +146,7 @@ static int path_offset(const void *fdt, const char *pat= h) g_autofree char *p =3D NULL; char *at; char *last_slash; + char *colon; int offset; =20 /* @@ -156,6 +157,20 @@ static int path_offset(const void *fdt, const char *pa= th) * suppressing leading zeros". */ p =3D g_strdup(path); + + /* + * Strip any ":argument" suffix from the last path component (e.g. + * "disk@8000000000000000:0") =E2=80=94 it is an OF path argument, not= part of + * the FDT node name. + */ + last_slash =3D strrchr(p, '/'); + if (last_slash) { + colon =3D strchr(last_slash, ':'); + if (colon) { + *colon =3D '\0'; + } + } + for (at =3D strchr(p, '@'); at && *at; ) { if (*at =3D=3D '/') { at =3D strchr(at, '@'); --=20 2.55.0 From nobody Sat Oct 24 00:32:48 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1790919001; cv=none; d=zohomail.com; s=zohoarc; b=PFmE9rFnjH1mIfNj2nYb14tp0yccIAlCpJIW3qqgLC0uX5c1tjd3HYgbpHeXvBZ/lTfMPnCXc83+ByHVcKl4XGu3kzHWln02QkQ5tRZAkYxRHJpi+ZCwtEARrvk1Rpq4ijcYvZD09c/WHUr5RCpXq84q81jF1hiv8RT/lZMOi5g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1790919001; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=QEduXLn7dwHyWUBEfUgLbXehXDjJUzjg1tc7yCdBCag=; b=FDF8gCpiVNQQMFvd6ic12IvOaJVsM/O6lrKHIqdII6MohOaJAj/R5FiVC93SzJVQNqZJNqvMA08bPC5OEMgjT5h9dK0AZ40bqS3ZVakkioA21JDhkgqakTArIE2VIO/TTJGIP+LH8dPNifu6F92PD4/3yhOQzmB/8Bi+PTNlOfo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1790919001374418.37086956533494; Thu, 1 Oct 2026 22:30:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1xCVpX-0000Vu-2k; Fri, 02 Oct 2026 01:29:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVp6-0008Su-0O; Fri, 02 Oct 2026 01:28:48 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1xCVp3-00083Z-Vs; Fri, 02 Oct 2026 01:28:43 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6922aEvA3548979; Fri, 2 Oct 2026 05:28:34 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gx5j5qsc4-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:28:33 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 6922Z6Qv1855161; Fri, 2 Oct 2026 05:28:32 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4h0xcshhpf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 02 Oct 2026 05:28:32 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 6925SVKR4719454 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 2 Oct 2026 05:28:31 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0C27958052; Fri, 2 Oct 2026 05:28:31 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 717035805A; Fri, 2 Oct 2026 05:28:22 +0000 (GMT) Received: from li-bd0dea4c-2912-11b2-a85c-e84940f94d2e.ibmuc.com (unknown [9.43.111.176]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 2 Oct 2026 05:28:22 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=QEduXL n7dwHyWUBEfUgLbXehXDjJUzjg1tc7yCdBCag=; b=hlVuPi8W02RJssHiKXuYe0 btSpmCa68mlAVs/LkyiXyRybssKNgZOKjUoUQjgtkiO8c6rcqovsqr76LyljdBlI BL2WQQT2pT64HEctnsmT6PHEm3DiODnHeNqpKHlRT7rRwasyqClKiAegg9egMqTx e7ANyG54PqGIcMMpVWZJQSp5KhEbmf7L0G6qdSp0OBDEcCUpXNAMwwUR2cJ39+z0 eH2SwAao4dy8P6JO7dokD8Z6gOj87SvDDtIxWLpEZ9AkyqtT0uLdp6jgCIa4lgtd sraTL1g1ZXTt/WJBInIeV7g45p00GMV/ezTJRmd2dyrl2DeP85jWS893iBqXf4Cg == From: uverma@linux.ibm.com To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, aik@amd.com, nnmlinux@linux.ibm.com, avnish@linux.ibm.com Cc: pbonzini@redhat.com, th.huth@posteo.eu, sbhat@linux.ibm.com, harshpb@linux.ibm.com, amachhiw@linux.ibm.com, rathc@linux.ibm.com, balaton@eik.bme.hu, philmd@linaro.org, npiggin@gmail.com, marcandre.lureau@redhat.com, fam@euphon.net, alex.bennee@linaro.org, richard.henderson@linaro.org, Utkarsh Verma Subject: [RFC PATCH v2 8/8] ppc/spapr: implement vscsi-report-luns call-method for PAPR vSCSI Date: Fri, 2 Oct 2026 10:55:47 +0530 Message-ID: <20261002052605.605858-9-uverma@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20261002052605.605858-1-uverma@linux.ibm.com> References: <20261002052605.605858-1-uverma@linux.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfXwMTItTxOF5ZT l+SDIdLIAMQmZUM02sVi0Wx7xdSwJjVk27ce1rzKR9LOBHgAsuechH0UC22j5G6Z0ncZTUbq4vp pXJvuplYM6D0CSHiCmN8GKuim6nSc0Q= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYxMDAyMDAyMCBTYWx0ZWRfX6KNA/vSx5369 qhexwBSmqg8FiWHsMBKYuR40fzy2RqJP1wobCENa62D1b3Y7/xY889qz+oaOwJ0px1OaSu5uEu5 4XK9jmjqbDsD13dqSdNyOFkUUOeByUXBZUbzLvkGWvjT3jciqmjxRHiE+03UEi4LBElzdbsGSga dXVZ3NlqVdR438r0Q8Dd3tZhD5Fm6lGJpcq1EvH0g7GrqewCZyXNbVU4+ZGWi+wbHPGD+gdl+SR J35SjTdroVStNvTqpph78sG8PagGje4B8QspNPGAgJLsC4gKf853wZ5ypt9OxLOtmCp/XMpFzgU 27Swk+Ne6H/JwOU+QkqEBDxKQqx5gam4vKjWqi0oJ352Veh0h1mD0roda1hjbIm1FPUFi4m6LMn F4W2N+5mlInvl40by/tu94RYOIzCgpkQQ0XxijXuCOrAPiYFiCZOR6nz4mYtexCkHa+K0SHiDMP zjdrEsr2lK+8lPNBn9w== X-Proofpoint-GUID: mK_NmP2l7t_mTjGtwc741rHRqGK78EY2 X-Authority-Analysis: v=2.4 cv=RKcmjIi+ c=1 sm=1 tr=0 ts=6abf4102 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=IkcTkHD0fZMA:10 a=660iZSQnnn4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=QkoNu6Jh_I66vS5nlkIA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: 9hP5X5HAbK7xFKRD2ouksdX2CgqCoc5I X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-10-02_01,2026-10-01_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 spamscore=0 bulkscore=0 impostorscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2610020020 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=lists1p.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=uverma@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: qemu development 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: pass (identity @ibm.com) X-ZM-MESSAGEID: 1790919002003158500 From: Utkarsh Verma GRUB (grub-core/disk/ieee1275/ofdisk.c) calls "vscsi-report-luns" on any PAPR virtual SCSI controller ihandle to enumerate attached LUNs before attempting to boot from disk. Without this method VOF returns PROM_ERROR and GRUB cannot find vSCSI disks. Add vof_vscsi_report_luns() to build the LUN response table in guest memory and wire it into vof_call_method(). Place the table at a fixed address VSCSI_TABLE_BASE (0x10000), in the free gap between the OF stack top and KERNEL_LOAD_ADDR, and cap its size at VSCSI_TABLE_MAXSZ (64 KB). The table layout and SRP LUN encoding follow SLOF (vio-vscsi.fs dev-generate-srplun) each entry is an 8-byte big-endian cell whose low 4 bytes hold a guest pointer to a null-terminated list of SRP LUNs for that target; GRUB reads the pointer at offset table + 4 + 8*i. AI-used-for: code Signed-off-by: Utkarsh Verma Reviewed-by:=C2=A0Avnish=C2=A0Chouhan=C2=A0 --- Chaneglog: v2: - vof_find_vscsi_bus() moved to patch 5/8; this patch reuses it. - Table placement changed from the VOF firmware region to the free gap between the OF stack top and KERNEL_LOAD_ADDR. Added VSCSI_TABLE_MAXSZ (64 KB) cap for table size. - Rewritten the SRP LUN encoding in simplified manner. --- hw/ppc/vof.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/hw/ppc/vof.c b/hw/ppc/vof.c index 75b2398ae7..6fb39d62a9 100644 --- a/hw/ppc/vof.c +++ b/hw/ppc/vof.c @@ -31,6 +31,9 @@ #include "block/block-io.h" #include =20 +#define VSCSI_TABLE_BASE 0x10000U +#define VSCSI_TABLE_MAXSZ 0x10000U + /* * OF 1275 "nextprop" description suggests is it 32 bytes max but * LoPAPR defines "ibm,query-interrupt-source-number" which is 33 chars lo= ng. @@ -1086,6 +1089,143 @@ static void vof_instantiate_rtas(Error **errp) error_setg(errp, "The firmware should have instantiated RTAS"); } =20 +#ifdef CONFIG_PSERIES +/* Combined (channel<<6)|id index space, matches SLOF dev-max-target. */ +#define VSCSI_MAX_TARGETS 512 + +/* + * Build the vscsi-report-luns response in guest memory. + * + * Returns catch_result (0 =3D success). On success, *nentries_out and + * *table_addr_out describe the result table written into the free gap + * between the stack top (0x10000) and KERNEL_LOAD_ADDR (0x400000). + * + * Table layout (big-endian, 8 bytes per entry): + * [table_addr + 8*i + 0..3] : 0x00000000 + * [table_addr + 8*i + 4..7] : guest pointer to null-terminated SRP LUN = list + * + * GRUB reads each pointer as: *(uint32_t *)(table + 4 + 8 * i) + */ +static uint32_t vof_vscsi_report_luns(SCSIBus *sbus, + uint32_t *nentries_out, + uint32_t *table_addr_out) +{ + uint64_t *lun_lists[VSCSI_MAX_TARGETS]; + int lun_counts[VSCSI_MAX_TARGETS]; + uint32_t ptr_table_size; + uint32_t lun_data_size; + uint32_t total_size; + uint32_t base_addr; + uint32_t lun_data_base; + uint32_t lun_data_off; + uint32_t table_idx; + uint32_t table_addr; + BusChild *kid; + int nentries =3D 0; + int t; + + memset(lun_lists, 0, sizeof(lun_lists)); + memset(lun_counts, 0, sizeof(lun_counts)); + + QTAILQ_FOREACH(kid, &sbus->qbus.children, sibling) { + SCSIDevice *dev =3D SCSI_DEVICE(kid->child); + int combined_target; + uint64_t srplun; + int cnt; + + combined_target =3D ((dev->channel & 0x7) << 6) | (dev->id & 0x3f); + + /* SRP LUN: 0x8000 | (id << 8) | (channel << 5) | lun, in top 16 b= its */ + srplun =3D (0x8000ULL | ((dev->id & 0x3fULL) << 8) + | ((dev->channel & 0x7ULL) << 5) + | (dev->lun & 0x1fULL)) << 48; + + cnt =3D lun_counts[combined_target]; + lun_lists[combined_target] =3D g_realloc(lun_lists[combined_target= ], + (cnt + 2) * sizeof(uint64_t= )); + lun_lists[combined_target][cnt] =3D cpu_to_be64(srplun); + lun_lists[combined_target][cnt + 1] =3D 0; + lun_counts[combined_target]++; + if (cnt =3D=3D 0) { + nentries++; + } + } + + if (nentries =3D=3D 0) { + *nentries_out =3D 0; + *table_addr_out =3D 0; + return 0; + } + + ptr_table_size =3D nentries * sizeof(uint64_t); + lun_data_size =3D 0; + for (t =3D 0; t < VSCSI_MAX_TARGETS; t++) { + if (lun_lists[t]) { + lun_data_size +=3D (lun_counts[t] + 1) * sizeof(uint64_t); + } + } + total_size =3D ptr_table_size + lun_data_size; + + /* + * Max table size capped at 64 KB, which comfortably covers + * 512 targets =C3=97 ~16 LUNs each. + */ + if (total_size > VSCSI_TABLE_MAXSZ) { + for (t =3D 0; t < VSCSI_MAX_TARGETS; t++) { + g_free(lun_lists[t]); + } + return PROM_ERROR; + } + base_addr =3D VSCSI_TABLE_BASE; + + table_addr =3D base_addr; + lun_data_base =3D base_addr + ptr_table_size; + lun_data_off =3D 0; + table_idx =3D 0; + + for (t =3D 0; t < VSCSI_MAX_TARGETS; t++) { + uint32_t lun_buf_size; + uint32_t lun_buf_addr; + uint64_t cell_be64; + + if (!lun_lists[t]) { + continue; + } + + lun_buf_size =3D (lun_counts[t] + 1) * sizeof(uint64_t); + lun_buf_addr =3D lun_data_base + lun_data_off; + + if (VOF_MEM_WRITE(lun_buf_addr, lun_lists[t], lun_buf_size) + !=3D MEMTX_OK) { + goto write_err; + } + + cell_be64 =3D cpu_to_be64((uint64_t)lun_buf_addr); + if (VOF_MEM_WRITE(table_addr + table_idx * sizeof(uint64_t), + &cell_be64, sizeof(cell_be64)) !=3D MEMTX_OK) { + goto write_err; + } + + lun_data_off +=3D lun_buf_size; + table_idx++; + } + + *nentries_out =3D table_idx; + *table_addr_out =3D table_addr; + + for (t =3D 0; t < VSCSI_MAX_TARGETS; t++) { + g_free(lun_lists[t]); + } + return 0; + +write_err: + for (t =3D 0; t < VSCSI_MAX_TARGETS; t++) { + g_free(lun_lists[t]); + } + return PROM_ERROR; +} +#endif /* CONFIG_PSERIES */ + static uint32_t vof_call_method(MachineState *ms, Vof *vof, uint32_t metho= daddr, uint32_t ihandle, uint32_t param1, uint32_t param2, uint32_t param3, @@ -1109,6 +1249,26 @@ static uint32_t vof_call_method(MachineState *ms, Vo= f *vof, uint32_t methodaddr, goto trace_exit; } =20 +#ifdef CONFIG_PSERIES + /* vscsi-report-luns: enumerate LUNs for GRUB */ + if (strcmp(method, "vscsi-report-luns") =3D=3D 0) { + SCSIBus *sbus =3D vof_find_vscsi_bus(ms, inst->path); + + if (sbus) { + uint32_t nentries =3D 0, table_addr =3D 0; + ret =3D vof_vscsi_report_luns(sbus, &nentries, &table_addr); + ret2[0] =3D nentries; + ret2[1] =3D table_addr; + } else { + ret =3D 1; + ret2[0] =3D 0; + ret2[1] =3D 0; + } + trace_vof_method(ihandle, method, param1, ret, ret2[0]); + goto trace_exit; + } +#endif /* CONFIG_PSERIES */ + if (strcmp(inst->path, "/") =3D=3D 0) { if (strcmp(method, "ibm,client-architecture-support") =3D=3D 0) { Object *vmo =3D object_dynamic_cast(OBJECT(ms), TYPE_VOF_MACHI= NE_IF); --=20 2.55.0