From nobody Sat May 10 08:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zoho.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org; Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1487621748494881.216846336521; Mon, 20 Feb 2017 12:15:48 -0800 (PST) Received: from [127.0.0.1] (helo=ra.coresystems.de) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1cfuMq-0008Af-4x; Mon, 20 Feb 2017 21:15:28 +0100 Received: from mail-ot0-f179.google.com ([74.125.82.179]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.86_2) (envelope-from ) id 1cfuMU-00082N-0O for seabios@seabios.org; Mon, 20 Feb 2017 21:15:22 +0100 Received: by mail-ot0-f179.google.com with SMTP id x10so36002134otb.1 for ; Mon, 20 Feb 2017 12:15:05 -0800 (PST) Received: from Arrow.corp.skyportsystems.com (76-236-31-201.lightspeed.sntcca.sbcglobal.net. [76.236.31.201]) by smtp.gmail.com with ESMTPSA id b138sm2626246oih.14.2017.02.20.12.15.02 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 20 Feb 2017 12:15:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=skyportsystems.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=gArCWzB1Hy7shn/89ngwEUSKTKYXrftNrzAylaKk9yo=; b=dPOspvMkMXA+4l11/IHq1kVW691iMmZx8cMs7uEap8Nc+AH1YOYZn5M4GBvsAI5pyR swVzoAlaI6dKU0ig1FPXTKeRouWw8F4Q25Ck6EjcbxVbK6F6AjcFIljPKNNas8f4lz8B BT2Xr9rsiRsIkHCMjbjEBhCeim7R58Csw7SHI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=gArCWzB1Hy7shn/89ngwEUSKTKYXrftNrzAylaKk9yo=; b=n/mJXZQU+Qq8Co53CFrJ2Hq71ZJAiBd6GU1X2JBwe/vG3ZMX3Zycu8ZKCl27io/uGP Qqk8wjY5QJami7xPHOds/HWMnpVlKEIYaQH0Biuz6xzAjzSohYheOfi8aEUkPsWqt8T9 7dysq0cl9mtt9ycfSVXT4ac4eZyzplhOL/98nk18egWi4rC5bxCrN9xn8d6iKbijkR1S /LLeTCcToXwdcA55U6xmmQ17kpaAD2gzGEofVxYGSyGCyu2nE84IQxLBo8r01hepbdka 9ZQeGJ/tXEK1CCofRVaCWKDH8NB5A2RmuUaH5JRvgGzGEWbZpkKBoQV6l07hqr4MH0GS rG0Q== X-Gm-Message-State: AMke39kKocVFXk0AybQ3tMUIMRI8kGP/B3ADsd4XOr2+BgjYw5HbowjJdkz0DKrDNJQFxh5S X-Received: by 10.157.33.49 with SMTP id i46mr5466064otb.106.1487621703721; Mon, 20 Feb 2017 12:15:03 -0800 (PST) From: ben@skyportsystems.com To: seabios@seabios.org Date: Mon, 20 Feb 2017 12:14:55 -0800 Message-Id: <794357c9b839720434b8a8388e40d034b7796e25.1487621478.git.ben@skyportsystems.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: References: In-Reply-To: References: X-Spam-Score: -5.7 (-----) Subject: [SeaBIOS] [PATCH v6 3/5] QEMU fw_cfg: Add command to write back address of file X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lersek@redhat.com, mst@redhat.com MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Ben Warren This command is similar to ADD_POINTER, but instead of patching memory, it writes the pointer back to QEMU over the DMA interface. Signed-off-by: Ben Warren Reviewed-by: Laszlo Ersek Reviewed-by: Igor Mammedov --- src/fw/romfile_loader.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/fw/romfile_loader.h | 23 ++++++++++++++++++++--- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/fw/romfile_loader.c b/src/fw/romfile_loader.c index 7737453..30e7b58 100644 --- a/src/fw/romfile_loader.c +++ b/src/fw/romfile_loader.c @@ -5,6 +5,7 @@ #include "romfile.h" // struct romfile_s #include "malloc.h" // Zone*, _malloc #include "output.h" // warn_* +#include "paravirt.h" // qemu_cfg_write_file =20 struct romfile_loader_file { struct romfile_s *file; @@ -127,6 +128,46 @@ err: warn_internalerror(); } =20 +static void romfile_loader_write_pointer(struct romfile_loader_entry_s *en= try, + struct romfile_loader_files *file= s) +{ + struct romfile_s *dest_file; + struct romfile_loader_file *src_file; + unsigned dst_offset =3D le32_to_cpu(entry->wr_pointer.dst_offset); + unsigned src_offset =3D le32_to_cpu(entry->wr_pointer.src_offset); + u64 pointer =3D 0; + + /* Writing back to a file that may not be loaded in RAM */ + dest_file =3D romfile_find(entry->wr_pointer.dest_file); + src_file =3D romfile_loader_find(entry->wr_pointer.src_file, files); + + if (!dest_file || !src_file || !src_file->data || + dst_offset + entry->wr_pointer.size < dst_offset || + dst_offset + entry->wr_pointer.size > dest_file->size || + src_offset >=3D src_file->file->size || + entry->wr_pointer.size < 1 || entry->wr_pointer.size > 8 || + entry->wr_pointer.size & (entry->wr_pointer.size - 1)) { + goto err; + } + + pointer =3D (unsigned long)src_file->data + src_offset; + /* Make sure the pointer fits within wr_pointer.size */ + if ((entry->wr_pointer.size !=3D sizeof(u64)) && + ((pointer >> (entry->wr_pointer.size * 8)) > 0)) { + goto err; + } + pointer =3D cpu_to_le64(pointer); + + /* Only supported on QEMU */ + if (qemu_cfg_write_file(&pointer, dest_file, dst_offset, + entry->wr_pointer.size) !=3D entry->wr_pointer= .size) { + goto err; + } + return; + err: + warn_internalerror(); +} + int romfile_loader_execute(const char *name) { struct romfile_loader_entry_s *entry; @@ -161,6 +202,10 @@ int romfile_loader_execute(const char *name) break; case ROMFILE_LOADER_COMMAND_ADD_CHECKSUM: romfile_loader_add_checksum(entry, files); + break; + case ROMFILE_LOADER_COMMAND_WRITE_POINTER: + romfile_loader_write_pointer(entry, files); + break; default: /* Skip commands that we don't recognize. */ break; diff --git a/src/fw/romfile_loader.h b/src/fw/romfile_loader.h index bce3719..4dc50ab 100644 --- a/src/fw/romfile_loader.h +++ b/src/fw/romfile_loader.h @@ -51,15 +51,32 @@ struct romfile_loader_entry_s { u32 length; } cksum; =20 + /* + * COMMAND_WRITE_POINTER - Write back to a host file via DMA, + * @wr_pointer.dest_file at offset @wr_pointer.dst_offset, a point= er + * to the table originating from @wr_pointer.src_file at offset + * @wr_pointer.src_offset. + * 1,2,4 or 8 byte unsigned addition is used depending on + * @wr_pointer.size. + */ + struct { + char dest_file[ROMFILE_LOADER_FILESZ]; + char src_file[ROMFILE_LOADER_FILESZ]; + u32 dst_offset; + u32 src_offset; + u8 size; + } wr_pointer; + /* padding */ char pad[124]; }; }; =20 enum { - ROMFILE_LOADER_COMMAND_ALLOCATE =3D 0x1, - ROMFILE_LOADER_COMMAND_ADD_POINTER =3D 0x2, - ROMFILE_LOADER_COMMAND_ADD_CHECKSUM =3D 0x3, + ROMFILE_LOADER_COMMAND_ALLOCATE =3D 0x1, + ROMFILE_LOADER_COMMAND_ADD_POINTER =3D 0x2, + ROMFILE_LOADER_COMMAND_ADD_CHECKSUM =3D 0x3, + ROMFILE_LOADER_COMMAND_WRITE_POINTER =3D 0x4, }; =20 enum { --=20 2.7.4 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://www.coreboot.org/mailman/listinfo/seabios