From nobody Sat May 4 01:19:40 2024 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 1487649417995254.35673278796457; Mon, 20 Feb 2017 19:56:57 -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 1cg1Z7-0000qK-IB; Tue, 21 Feb 2017 04:56:37 +0100 Received: from mail-oi0-f41.google.com ([209.85.218.41]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.86_2) (envelope-from ) id 1cg1Yw-0000pa-NY for seabios@seabios.org; Tue, 21 Feb 2017 04:56:35 +0100 Received: by mail-oi0-f41.google.com with SMTP id y140so31830567oie.1 for ; Mon, 20 Feb 2017 19:56:26 -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 r129sm1164838oih.31.2017.02.20.19.56.23 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 20 Feb 2017 19:56:23 -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=pMfrbkrmXZgY7n6eGAVZqkpNzo59sogyAIrQsvhnWPY=; b=X0h3lw6l0i07q6SMhNhQw7dUkTSPFTnT5/Ls0zeOkbxU5z5y8TFePOTJBJCyRGb8ch AnnLSaaVg6dVpy7wIDYY4jLX/T5OJyXkyOB9TNlMURSn9Gxg7B+YqqqyljFFyI9e7fyt ZsMOF96JSI5oxQBrfdESQpyEdP8qieHpxnXUU= 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=pMfrbkrmXZgY7n6eGAVZqkpNzo59sogyAIrQsvhnWPY=; b=fn+aURSGJ9JtAnMvMHvSgQdE3dhHwmheVrDMd4YoQ7DFAdd8wsLOfAdc2FEIB9xq1N VN+E3J4CYx/fO/qr2SWsT/BODINQXOiS5Fxe+hIAXNoJt4iL3jg6EEQ9Cg2499BWxgGy 2t1X1SngDS6e8afQDtHeXyHETv7rccaEXYQtuok3M/6Dw2Tgk6eCEPLfv3/T7AHVFonE vWG3ioK4UO0nxr/2GsYw4butqrkiPXqpjSmxUWbANpYtU1Mx/dZ1NL95KGhDQdvLHbrT ggJl7U0JNePxP8wjNXEDR4cZutIb4gfdHB5K+IQ5VEsGYd4di4HxUAcrap2UCeecuqC2 ejvQ== X-Gm-Message-State: AMke39m6fV2DT5vzOABvO1I1z/nkUx9t7ROMdZNquC4XmirMZvfgBJ0yXKcY4EvxmyFFZjfY X-Received: by 10.202.68.10 with SMTP id r10mr13157056oia.181.1487649384451; Mon, 20 Feb 2017 19:56:24 -0800 (PST) From: ben@skyportsystems.com To: seabios@seabios.org Date: Mon, 20 Feb 2017 19:56:15 -0800 Message-Id: <1f6180ad0e564401797258f6f8acf5847125dd72.1487648787.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: -2.7 (--) Subject: [SeaBIOS] [PATCH v7 1/5] QEMU DMA: Add DMA write capability 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 allows BIOS to write data back to QEMU using the DMA interface and provides a higher-level abstraction to write to a fw_cfg file Signed-off-by: Ben Warren Reviewed-by: Laszlo Ersek Reviewed-by: Igor Mammedov Tested-by: Igor Mammedov --- src/fw/paravirt.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/fw/paravirt.h | 3 +++ 2 files changed, 52 insertions(+) diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c index 6de70f6..4618647 100644 --- a/src/fw/paravirt.c +++ b/src/fw/paravirt.c @@ -253,6 +253,20 @@ qemu_cfg_read(void *buf, int len) } =20 static void +qemu_cfg_write(void *buf, int len) +{ + if (len =3D=3D 0) { + return; + } + + if (qemu_cfg_dma_enabled()) { + qemu_cfg_dma_transfer(buf, len, QEMU_CFG_DMA_CTL_WRITE); + } else { + warn_internalerror(); + } +} + +static void qemu_cfg_skip(int len) { if (len =3D=3D 0) { @@ -280,6 +294,18 @@ qemu_cfg_read_entry(void *buf, int e, int len) } } =20 +static void +qemu_cfg_write_entry(void *buf, int e, int len) +{ + if (qemu_cfg_dma_enabled()) { + u32 control =3D (e << 16) | QEMU_CFG_DMA_CTL_SELECT + | QEMU_CFG_DMA_CTL_WRITE; + qemu_cfg_dma_transfer(buf, len, control); + } else { + warn_internalerror(); + } +} + struct qemu_romfile_s { struct romfile_s file; int select, skip; @@ -303,6 +329,29 @@ qemu_cfg_read_file(struct romfile_s *file, void *dst, = u32 maxlen) return file->size; } =20 +int +qemu_cfg_write_file(void *src, struct romfile_s *file, u32 offset, u32 len) +{ + if ((offset + len) > file->size) + return -1; + + if (!qemu_cfg_dma_enabled() || (file->copy !=3D qemu_cfg_read_file)) { + warn_internalerror(); + return -1; + } + struct qemu_romfile_s *qfile; + qfile =3D container_of(file, struct qemu_romfile_s, file); + if (offset =3D=3D 0) { + /* Do it in one transfer */ + qemu_cfg_write_entry(src, qfile->select, len); + } else { + qemu_cfg_select(qfile->select); + qemu_cfg_skip(offset); + qemu_cfg_write(src, len); + } + return len; +} + static void qemu_romfile_add(char *name, int select, int skip, int size) { diff --git a/src/fw/paravirt.h b/src/fw/paravirt.h index d8eb7c4..fb220d8 100644 --- a/src/fw/paravirt.h +++ b/src/fw/paravirt.h @@ -3,6 +3,7 @@ =20 #include "config.h" // CONFIG_* #include "biosvar.h" // GET_GLOBAL +#include "romfile.h" // struct romfile_s =20 // Types of paravirtualized platforms. #define PF_QEMU (1<<0) @@ -43,6 +44,7 @@ static inline int runningOnKVM(void) { #define QEMU_CFG_DMA_CTL_READ 0x02 #define QEMU_CFG_DMA_CTL_SKIP 0x04 #define QEMU_CFG_DMA_CTL_SELECT 0x08 +#define QEMU_CFG_DMA_CTL_WRITE 0x10 =20 // QEMU_CFG_DMA ID bit #define QEMU_CFG_VERSION_DMA 2 @@ -53,5 +55,6 @@ void qemu_platform_setup(void); void qemu_cfg_init(void); =20 u16 qemu_get_present_cpus_count(void); +int qemu_cfg_write_file(void *src, struct romfile_s *file, u32 offset, u32= len); =20 #endif --=20 2.7.4 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://www.coreboot.org/mailman/listinfo/seabios From nobody Sat May 4 01:19:40 2024 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 1487649423316144.14928010833694; Mon, 20 Feb 2017 19:57:03 -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 1cg1ZO-0000t4-Nn; Tue, 21 Feb 2017 04:56:54 +0100 Received: from mail-oi0-f51.google.com ([209.85.218.51]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.86_2) (envelope-from ) id 1cg1Yy-0000pc-3z for seabios@seabios.org; Tue, 21 Feb 2017 04:56:45 +0100 Received: by mail-oi0-f51.google.com with SMTP id y140so31830708oie.1 for ; Mon, 20 Feb 2017 19:56:28 -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 r129sm1164838oih.31.2017.02.20.19.56.24 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 20 Feb 2017 19:56:25 -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=/iJOfzXcl9Q1b8tggZ96DjIRfWp47SKOCym093jF/7E=; b=MxMPfjxtwnXBI+kFNN1ynlfjDRaHcXXb1W43OJQScgAjAm+zU+7sASVizCZ75SqC9H zqC0oQhD1D7rUKHqlPXGgwIi/T/kVLFgKLeh4uZCXY79q7zzxEqw52B+f4s9YmDa0O7t T2b4PvXvM3B/lMKhIQoEL9x+MbSg1d6L+m4iQ= 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=/iJOfzXcl9Q1b8tggZ96DjIRfWp47SKOCym093jF/7E=; b=QNB77hOpvsiF05b3beCGgRGdqr1zXkRl4+kguaec73m+Xcs15KXUm8VP/Oz93xLFEm JoTGQzXU/RL3EQP6ioz7d0mO0Rc3HdFij8b2T9mEFg7S6D9/R9u16/3sPsSpsX7xynJc mGa2SiSuVVYsOHnTxCYpDxPVVpFzVrM0ziqmZ3AraiV4u6a5HA6+T778Vv9FvTv35SBW tUlsZHP8pNFvDYokcHu+FMQE2IupplPg2mag4K9sm9TkwphoQvpgSpTaqQQNmEE8h5IY F0ta8nMaCtnoj3X9wU0UjbOIqbPZSneoLX0nq30o9uv8uu7SIBwjsttcB9XRkUoSjIxn mK1Q== X-Gm-Message-State: AMke39kJLpOfDpsB9azMWy8Lk78cNaYDXYlwZofHPNDK3FWU6uKsJH3Zj5a6kIchmdlUTzIc X-Received: by 10.202.114.77 with SMTP id p74mr2767741oic.44.1487649385819; Mon, 20 Feb 2017 19:56:25 -0800 (PST) From: ben@skyportsystems.com To: seabios@seabios.org Date: Mon, 20 Feb 2017 19:56:16 -0800 Message-Id: X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: References: In-Reply-To: References: X-Spam-Score: -1.8 (-) Subject: [SeaBIOS] [PATCH v7 2/5] romfile-loader: Switch to using named structs 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 is a little cleaner and matches how the command structures are defined in QEMU. Signed-off-by: Ben Warren Reviewed-by: Laszlo Ersek Reviewed-by: Igor Mammedov Tested-by: Igor Mammedov --- src/fw/romfile_loader.c | 34 +++++++++++++++++----------------- src/fw/romfile_loader.h | 40 ++++++++++++++++++++-------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/fw/romfile_loader.c b/src/fw/romfile_loader.c index f4b17ff..7737453 100644 --- a/src/fw/romfile_loader.c +++ b/src/fw/romfile_loader.c @@ -35,12 +35,12 @@ static void romfile_loader_allocate(struct romfile_load= er_entry_s *entry, struct romfile_loader_file *file =3D &files->files[files->nfiles]; void *data; int ret; - unsigned alloc_align =3D le32_to_cpu(entry->alloc_align); + unsigned alloc_align =3D le32_to_cpu(entry->alloc.align); =20 if (alloc_align & (alloc_align - 1)) goto err; =20 - switch (entry->alloc_zone) { + switch (entry->alloc.zone) { case ROMFILE_LOADER_ALLOC_ZONE_HIGH: zone =3D &ZoneHigh; break; @@ -52,9 +52,9 @@ static void romfile_loader_allocate(struct romfile_loader= _entry_s *entry, } if (alloc_align < MALLOC_MIN_ALIGN) alloc_align =3D MALLOC_MIN_ALIGN; - if (entry->alloc_file[ROMFILE_LOADER_FILESZ - 1]) + if (entry->alloc.file[ROMFILE_LOADER_FILESZ - 1]) goto err; - file->file =3D romfile_find(entry->alloc_file); + file->file =3D romfile_find(entry->alloc.file); if (!file->file || !file->file->size) return; data =3D _malloc(zone, file->file->size, alloc_align); @@ -80,24 +80,24 @@ static void romfile_loader_add_pointer(struct romfile_l= oader_entry_s *entry, { struct romfile_loader_file *dest_file; struct romfile_loader_file *src_file; - unsigned offset =3D le32_to_cpu(entry->pointer_offset); + unsigned offset =3D le32_to_cpu(entry->pointer.offset); u64 pointer =3D 0; =20 - dest_file =3D romfile_loader_find(entry->pointer_dest_file, files); - src_file =3D romfile_loader_find(entry->pointer_src_file, files); + dest_file =3D romfile_loader_find(entry->pointer.dest_file, files); + src_file =3D romfile_loader_find(entry->pointer.src_file, files); =20 if (!dest_file || !src_file || !dest_file->data || !src_file->data || - offset + entry->pointer_size < offset || - offset + entry->pointer_size > dest_file->file->size || - entry->pointer_size < 1 || entry->pointer_size > 8 || - entry->pointer_size & (entry->pointer_size - 1)) + offset + entry->pointer.size < offset || + offset + entry->pointer.size > dest_file->file->size || + entry->pointer.size < 1 || entry->pointer.size > 8 || + entry->pointer.size & (entry->pointer.size - 1)) goto err; =20 - memcpy(&pointer, dest_file->data + offset, entry->pointer_size); + memcpy(&pointer, dest_file->data + offset, entry->pointer.size); pointer =3D le64_to_cpu(pointer); pointer +=3D (unsigned long)src_file->data; pointer =3D cpu_to_le64(pointer); - memcpy(dest_file->data + offset, &pointer, entry->pointer_size); + memcpy(dest_file->data + offset, &pointer, entry->pointer.size); =20 return; err: @@ -108,12 +108,12 @@ static void romfile_loader_add_checksum(struct romfil= e_loader_entry_s *entry, struct romfile_loader_files *files) { struct romfile_loader_file *file; - unsigned offset =3D le32_to_cpu(entry->cksum_offset); - unsigned start =3D le32_to_cpu(entry->cksum_start); - unsigned len =3D le32_to_cpu(entry->cksum_length); + unsigned offset =3D le32_to_cpu(entry->cksum.offset); + unsigned start =3D le32_to_cpu(entry->cksum.start); + unsigned len =3D le32_to_cpu(entry->cksum.length); u8 *data; =20 - file =3D romfile_loader_find(entry->cksum_file, files); + file =3D romfile_loader_find(entry->cksum.file, files); =20 if (!file || !file->data || offset >=3D file->file->size || start + len < start || start + len > file->file->size) diff --git a/src/fw/romfile_loader.h b/src/fw/romfile_loader.h index 15eab2a..bce3719 100644 --- a/src/fw/romfile_loader.h +++ b/src/fw/romfile_loader.h @@ -11,45 +11,45 @@ struct romfile_loader_entry_s { u32 command; union { /* - * COMMAND_ALLOCATE - allocate a table from @alloc_file - * subject to @alloc_align alignment (must be power of 2) - * and @alloc_zone (can be HIGH or FSEG) requirements. + * COMMAND_ALLOCATE - allocate a table from @alloc.file + * subject to @alloc.align alignment (must be power of 2) + * and @alloc.zone (can be HIGH or FSEG) requirements. * * Must appear exactly once for each file, and before * this file is referenced by any other command. */ struct { - char alloc_file[ROMFILE_LOADER_FILESZ]; - u32 alloc_align; - u8 alloc_zone; - }; + char file[ROMFILE_LOADER_FILESZ]; + u32 align; + u8 zone; + } alloc; =20 /* * COMMAND_ADD_POINTER - patch the table (originating from - * @dest_file) at @pointer_offset, by adding a pointer to the table + * @dest_file) at @pointer.offset, by adding a pointer to the table * originating from @src_file. 1,2,4 or 8 byte unsigned - * addition is used depending on @pointer_size. + * addition is used depending on @pointer.size. */ struct { - char pointer_dest_file[ROMFILE_LOADER_FILESZ]; - char pointer_src_file[ROMFILE_LOADER_FILESZ]; - u32 pointer_offset; - u8 pointer_size; - }; + char dest_file[ROMFILE_LOADER_FILESZ]; + char src_file[ROMFILE_LOADER_FILESZ]; + u32 offset; + u8 size; + } pointer; =20 /* * COMMAND_ADD_CHECKSUM - calculate checksum of the range specifie= d by - * @cksum_start and @cksum_length fields, + * @cksum.start and @cksum.length fields, * and then add the value at @cksum_offset. * Checksum simply sums -X for each byte X in the range * using 8-bit math. */ struct { - char cksum_file[ROMFILE_LOADER_FILESZ]; - u32 cksum_offset; - u32 cksum_start; - u32 cksum_length; - }; + char file[ROMFILE_LOADER_FILESZ]; + u32 offset; + u32 start; + u32 length; + } cksum; =20 /* padding */ char pad[124]; --=20 2.7.4 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://www.coreboot.org/mailman/listinfo/seabios From nobody Sat May 4 01:19:40 2024 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 1487649431167764.365998329286; Mon, 20 Feb 2017 19:57:11 -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 1cg1ZP-0000tV-Jt; Tue, 21 Feb 2017 04:56:55 +0100 Received: from mail-oi0-f54.google.com ([209.85.218.54]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.86_2) (envelope-from ) id 1cg1Yz-0000pe-Ee for seabios@seabios.org; Tue, 21 Feb 2017 04:56:45 +0100 Received: by mail-oi0-f54.google.com with SMTP id 62so47824913oih.2 for ; Mon, 20 Feb 2017 19:56:29 -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 r129sm1164838oih.31.2017.02.20.19.56.26 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 20 Feb 2017 19:56:26 -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=UkcwaWTna/m1Tk8bR19T/WQHNz/dr7809trEab6Bw7CEXGYHn3fwNb59ms7fWcO6Vh QCHjv1g4/c+NtVoPHsrJ4C+DOAOl3DScgRUmarhAExG1tzQcO4qw498a7fRRZtJh1Ucl wPKEGi/UKQLrPLcgTu3GwkNk/qGciMviB+14A= 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=bna4iM6tB5jfVc+0e1w2RXoN0nPnD72tKaWOXpnrinazwxWkkLyhRJld8tkecEnewf VIywj+HWV+cWrcFkjhZENPHcCVJAlR8D2Vw4gmvYvMqzFNsU0WCJ/HTko4y9SpXjm/yt t4Kg31g7LHr2NT2fMCIHt7t79rgDzLn4viPmfi683/nn8WERR/Y9KMs8ezopoEw7/6H2 pR7PckZAgTriaJj4tQtv93B7VZrMjefEEqU6UUoWIB4UIdPyjLh49QVuLyhWLybybwYm sPRbheLZhk9MUDorJq4nxie2eyn1V8p6zuV+TWUs8+Llq6qUpvtzBkLLJyEf6S+bQuqU LVqg== X-Gm-Message-State: AMke39np3+T1P9ZB4qYpeEKS0p/48Qwz8DjAkB0K7zKKhN4BQUkKiuaG2CPiWmefKwlOWxvF X-Received: by 10.202.77.12 with SMTP id a12mr5537654oib.137.1487649387183; Mon, 20 Feb 2017 19:56:27 -0800 (PST) From: ben@skyportsystems.com To: seabios@seabios.org Date: Mon, 20 Feb 2017 19:56:17 -0800 Message-Id: <794357c9b839720434b8a8388e40d034b7796e25.1487648787.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: -3.7 (---) Subject: [SeaBIOS] [PATCH v7 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 Tested-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 From nobody Sat May 4 01:19:40 2024 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 148764941706960.28574798812383; Mon, 20 Feb 2017 19:56:57 -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 1cg1ZF-0000rG-9I; Tue, 21 Feb 2017 04:56:45 +0100 Received: from mail-ot0-f174.google.com ([74.125.82.174]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.86_2) (envelope-from ) id 1cg1Z0-0000ph-Ie for seabios@seabios.org; Tue, 21 Feb 2017 04:56:42 +0100 Received: by mail-ot0-f174.google.com with SMTP id x10so41402695otb.1 for ; Mon, 20 Feb 2017 19:56:30 -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 r129sm1164838oih.31.2017.02.20.19.56.27 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 20 Feb 2017 19:56:27 -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=4gdOtWJH9Fhr5of29y42xXNI2XorpLcqL4LtqRw2tIM=; b=PHiC8jdMBFf3Jn5vXy/vZhyf9dzk14V2yzVawIF62R5xyDMoXuIcPr1l8YPJ87WUDR dQKNPkjUj/TMbX6SsdtDtMA38ZwNpUqMAu2oXg6qb549JeKZtaaoUOkb2Ag+/UQEOOU3 s1oGj4wI8i4n3sbt0EazpCTaQTBBsmnXPY01k= 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=4gdOtWJH9Fhr5of29y42xXNI2XorpLcqL4LtqRw2tIM=; b=tzYSljZSpSmVA32xhoEKukVfgAEWKAxmND8+xVSscQ3Q2jNgrjzPnzfFO0pZ8Q1EJO Rm3HqRLY4lHY4QvkwSm67mCf7wakCi9ibUZup1fz/CEtgqcMi9z/DtiITeIbS7+Jtn+s K3O9EUrZnoy/Q+XtXKCx9X8XJv31xD3BapY3l224XHK9xIjTGUgy4WOpjN0lv1wy1TX2 G/6FKzgcjH4w7t8+virj0S28imMYtPiwHISNjwOCkOXuxE1Jn4gkeg2jAwHZgYUZGl0x pkM1+PCV3+2tzV6Lpo2PL5Tqc0u2FyfkqSSr+K8thVuy+EPEA5KFfHESDruxe8LzJRRC R7wQ== X-Gm-Message-State: AMke39npj5r2NyGGNoFssKEcbYjjI4CGLay7x9C2TG6+eTKkuf0b+k7QKMX0x9L5+NIUmtxB X-Received: by 10.157.14.166 with SMTP id 35mr12650072otj.136.1487649388256; Mon, 20 Feb 2017 19:56:28 -0800 (PST) From: ben@skyportsystems.com To: seabios@seabios.org Date: Mon, 20 Feb 2017 19:56:18 -0800 Message-Id: <174fe258bf664a0c14cae93f3c953f85743db88f.1487648787.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: -2.7 (--) Subject: [SeaBIOS] [PATCH v7 4/5] QEMU fw_cfg: Add functions for accessing files by key 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 Due to memory contraints, when resuming from S3 the fw_cfg "files" API isn't available. This adds a simple API to get a file 'key', and to write to the file using the key as a reference. Signed-off-by: Ben Warren Reviewed-by: Igor Mammedov Reviewed-by: Laszlo Ersek Tested-by: Igor Mammedov --- src/fw/paravirt.c | 41 ++++++++++++++++++++++++++++++----------- src/fw/paravirt.h | 2 ++ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c index 4618647..707502d 100644 --- a/src/fw/paravirt.c +++ b/src/fw/paravirt.c @@ -329,6 +329,22 @@ qemu_cfg_read_file(struct romfile_s *file, void *dst, = u32 maxlen) return file->size; } =20 +// Bare-bones function for writing a file knowing only its unique +// identifying key (select) +int +qemu_cfg_write_file_simple(void *src, u16 key, u32 offset, u32 len) +{ + if (offset =3D=3D 0) { + /* Do it in one transfer */ + qemu_cfg_write_entry(src, key, len); + } else { + qemu_cfg_select(key); + qemu_cfg_skip(offset); + qemu_cfg_write(src, len); + } + return len; +} + int qemu_cfg_write_file(void *src, struct romfile_s *file, u32 offset, u32 len) { @@ -339,17 +355,8 @@ qemu_cfg_write_file(void *src, struct romfile_s *file,= u32 offset, u32 len) warn_internalerror(); return -1; } - struct qemu_romfile_s *qfile; - qfile =3D container_of(file, struct qemu_romfile_s, file); - if (offset =3D=3D 0) { - /* Do it in one transfer */ - qemu_cfg_write_entry(src, qfile->select, len); - } else { - qemu_cfg_select(qfile->select); - qemu_cfg_skip(offset); - qemu_cfg_write(src, len); - } - return len; + return qemu_cfg_write_file_simple(src, qemu_get_romfile_key(file), + offset, len); } =20 static void @@ -370,6 +377,18 @@ qemu_romfile_add(char *name, int select, int skip, int= size) } =20 u16 +qemu_get_romfile_key(struct romfile_s *file) +{ + struct qemu_romfile_s *qfile; + if (file->copy !=3D qemu_cfg_read_file) { + warn_internalerror(); + return 0; + } + qfile =3D container_of(file, struct qemu_romfile_s, file); + return qfile->select; +} + +u16 qemu_get_present_cpus_count(void) { u16 smp_count =3D 0; diff --git a/src/fw/paravirt.h b/src/fw/paravirt.h index fb220d8..16f3d9a 100644 --- a/src/fw/paravirt.h +++ b/src/fw/paravirt.h @@ -56,5 +56,7 @@ void qemu_cfg_init(void); =20 u16 qemu_get_present_cpus_count(void); int qemu_cfg_write_file(void *src, struct romfile_s *file, u32 offset, u32= len); +int qemu_cfg_write_file_simple(void *src, u16 key, u32 offset, u32 len); +u16 qemu_get_romfile_key(struct romfile_s *file); =20 #endif --=20 2.7.4 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://www.coreboot.org/mailman/listinfo/seabios From nobody Sat May 4 01:19:40 2024 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 1487649421788681.7949724386102; Mon, 20 Feb 2017 19:57:01 -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 1cg1ZO-0000rT-0Y; Tue, 21 Feb 2017 04:56:54 +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 1cg1Z1-0000pk-KG for seabios@seabios.org; Tue, 21 Feb 2017 04:56:44 +0100 Received: by mail-ot0-f179.google.com with SMTP id 32so81249687oth.3 for ; Mon, 20 Feb 2017 19:56:31 -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 r129sm1164838oih.31.2017.02.20.19.56.28 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 20 Feb 2017 19:56:28 -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=cvJvQIOD5ZhsyoqZ2g39jGX0/tXhjhch6IQGVGupztU=; b=oncXmwIGi8i4xMl5Y1pwA+qiyhZoe4eLGtX7SRi+A5EsAxRrjbzYNE1mZIgql3A83l TbrLtIeYHzH8YS52qmoaxp4eXyBFmFuKbfMdb9yloSFVZLBa4u65ZVZ8CNlHW62g/Hle /61U0ZMnOEicKO7Hj5UKuoT/ywQ7G5oQNt8W4= 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=cvJvQIOD5ZhsyoqZ2g39jGX0/tXhjhch6IQGVGupztU=; b=jmtH+VbPjwBsTRZG1nLquVRFDuYLdILVe4JLGMub7/SJpgpf0t5+FMl6kOXtrrf3tr Q9TREskvJTohMqvSm+n0CITNrz6R9SooAuIJXDNF3SxG/KnYXLzxhK6ZFHnXvnkj+9kU h4CK/tkjt6J8qFHIYwVdsXJEWB/i9IaeCg0+6u8QDC/jHGA8eX7mrlf2h+P9aFWcq0Dp 2hbm0qWi55bjR9Pn5pzaupufIH4eFTQ9xFV8yZMdR/6GFLptxzin3To9uITpqTeWL5zv Jg4GR9P4LMUhKhMbm7IYxQm5sQRULwzOF+s2oXH5rIwDk6zMQa9sEMF2Eq2Lzxnnx6Fm PqCw== X-Gm-Message-State: AMke39l6kGTH5yBj0pxxkeelYhTQq8n4ZSg5gZn8M62vkgplFYADMGCCMxC7xrYKP5pVvNEe X-Received: by 10.157.10.42 with SMTP id 39mr14062789otg.276.1487649389395; Mon, 20 Feb 2017 19:56:29 -0800 (PST) From: ben@skyportsystems.com To: seabios@seabios.org Date: Mon, 20 Feb 2017 19:56:19 -0800 Message-Id: X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: References: In-Reply-To: References: X-Spam-Score: -0.3 (/) Subject: [SeaBIOS] [PATCH v7 5/5] QEMU fw_cfg: Write fw_cfg back on S3 resume 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 Any pointers to BIOS-allocated memory that were written back to QEMU fw_cfg files are replayed when resuming from S3 sleep. Signed-off-by: Ben Warren Reviewed-by: Laszlo Ersek Reviewed-by: Igor Mammedov Tested-by: Igor Mammedov --- src/fw/romfile_loader.c | 33 +++++++++++++++++++++++++++++++++ src/fw/romfile_loader.h | 2 ++ src/resume.c | 4 ++++ 3 files changed, 39 insertions(+) diff --git a/src/fw/romfile_loader.c b/src/fw/romfile_loader.c index 30e7b58..14bc908 100644 --- a/src/fw/romfile_loader.c +++ b/src/fw/romfile_loader.c @@ -4,6 +4,7 @@ #include "string.h" // strcmp #include "romfile.h" // struct romfile_s #include "malloc.h" // Zone*, _malloc +#include "list.h" // struct hlist_node #include "output.h" // warn_* #include "paravirt.h" // qemu_cfg_write_file =20 @@ -16,6 +17,16 @@ struct romfile_loader_files { struct romfile_loader_file files[]; }; =20 +// Data structures for storing "write pointer" entries for possible replay +struct romfile_wr_pointer_entry { + u64 pointer; + u32 offset; + u16 key; + u8 ptr_size; + struct hlist_node node; +}; +static struct hlist_head romfile_pointer_list; + static struct romfile_loader_file * romfile_loader_find(const char *name, struct romfile_loader_files *files) @@ -29,6 +40,19 @@ romfile_loader_find(const char *name, return NULL; } =20 +// Replay "write pointer" entries back to QEMU +void romfile_fw_cfg_resume(void) +{ + if (!CONFIG_QEMU) + return; + + struct romfile_wr_pointer_entry *entry; + hlist_for_each_entry(entry, &romfile_pointer_list, node) { + qemu_cfg_write_file_simple(&entry->pointer, entry->key, + entry->offset, entry->ptr_size); + } +} + static void romfile_loader_allocate(struct romfile_loader_entry_s *entry, struct romfile_loader_files *files) { @@ -163,6 +187,15 @@ static void romfile_loader_write_pointer(struct romfil= e_loader_entry_s *entry, entry->wr_pointer.size) !=3D entry->wr_pointer= .size) { goto err; } + + /* Store the info so it can replayed later if necessary */ + struct romfile_wr_pointer_entry *store =3D malloc_high(sizeof(*store)); + store->pointer =3D pointer; + store->key =3D qemu_get_romfile_key(dest_file); + store->offset =3D dst_offset; + store->ptr_size =3D entry->wr_pointer.size; + hlist_add_head(&store->node, &romfile_pointer_list); + return; err: warn_internalerror(); diff --git a/src/fw/romfile_loader.h b/src/fw/romfile_loader.h index 4dc50ab..fcd4ab2 100644 --- a/src/fw/romfile_loader.h +++ b/src/fw/romfile_loader.h @@ -86,4 +86,6 @@ enum { =20 int romfile_loader_execute(const char *name); =20 +void romfile_fw_cfg_resume(void); + #endif diff --git a/src/resume.c b/src/resume.c index e67cfce..99fa34f 100644 --- a/src/resume.c +++ b/src/resume.c @@ -17,6 +17,7 @@ #include "string.h" // memset #include "util.h" // dma_setup #include "tcgbios.h" // tpm_s3_resume +#include "fw/romfile_loader.h" // romfile_fw_cfg_resume =20 // Handler for post calls that look like a resume. void VISIBLE16 @@ -105,6 +106,9 @@ s3_resume(void) tpm_s3_resume(); s3_resume_vga(); =20 + /* Replay any fw_cfg entries that go back to the host */ + romfile_fw_cfg_resume(); + make_bios_readonly(); =20 // Invoke the resume vector. --=20 2.7.4 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://www.coreboot.org/mailman/listinfo/seabios