From nobody Mon Dec 8 06:18:59 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 1487398975294215.32734814400237; Fri, 17 Feb 2017 22:22:55 -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 1ceyPv-0004WP-Sv; Sat, 18 Feb 2017 07:22:47 +0100 Received: from mail-oi0-f47.google.com ([209.85.218.47]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.86_2) (envelope-from ) id 1ceyPk-0004SN-Jo for seabios@seabios.org; Sat, 18 Feb 2017 07:22:44 +0100 Received: by mail-oi0-f47.google.com with SMTP id u143so33451275oif.3 for ; Fri, 17 Feb 2017 22:22:36 -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 v31sm5479134ota.26.2017.02.17.22.22.25 (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 17 Feb 2017 22:22: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=sIHKgMC7/3FQQpHGPbuaJ7TS6liqB7ASNHQKatc3Mtk=; b=qNMCt72bvJkvXgzRpRzhtufcgpGowMrVYHwYM1foVFTOuR/JLMA32SDXIP1NuSwAmO 9c8qDj7CK9Q60Z9nW9/jxLvWQYUGZLvoGgVpd8brxdbCLhJhhFWFDbTkBHyw7HvylM93 Mgn30wqOt/JlkCv+DqWPFdREIkX6u4FuZTVMU= 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=sIHKgMC7/3FQQpHGPbuaJ7TS6liqB7ASNHQKatc3Mtk=; b=Q/ZAgKWXTVO9gY7YNE2enoFYUec0J4aE2TPJb4z17+86FrbH+zoqg8is2txlz56+XZ B4V4H/uWcf1+VS+cNxjDr10n+5sIO2Or1erWXhxWSHf29niZx9D2D16kAzBY0QxRQj9Y Ba2qXIJnqS5vHmYjuJR1DM3f0xO2Sw5zB8Hdrf1krrTwNhNa2JdrafNlMK/JiC80TOXd NUspxAFdxatnfwL11b6o6YpQ/igSS0x0WIQ40gl4EdBpEEYZit1F3hZ5aga1tx61dV8C 9lD95wIVX69pfkpkvQmg6PEJl3SUD/VLdwxSa0DPaz+HhbguCV5OY4/XnJADGoxZwWgo uyAw== X-Gm-Message-State: AMke39kUMKHKYrJqDjGUpikRL4beNPfvlLgK1F/iCDH4a2hzspWzkYt9bkhuyMHy+4/wv2f4 X-Received: by 10.202.241.70 with SMTP id p67mr5463844oih.67.1487398946388; Fri, 17 Feb 2017 22:22:26 -0800 (PST) From: ben@skyportsystems.com To: seabios@seabios.org Date: Fri, 17 Feb 2017 22:21:59 -0800 Message-Id: <603c0dc95cae771416ed6bb7a8e66a3b6103381a.1487398715.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: -0.3 (/) Subject: [SeaBIOS] [PATCH v5 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 --- src/fw/romfile_loader.c | 35 +++++++++++++++++++++++++++++++++++ src/fw/romfile_loader.h | 2 ++ src/resume.c | 4 ++++ 3 files changed, 41 insertions(+) diff --git a/src/fw/romfile_loader.c b/src/fw/romfile_loader.c index 30e7b58..33aaec4 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,16 @@ romfile_loader_find(const char *name, return NULL; } =20 +// Replay "write pointer" entries back to QEMU +void romfile_fw_cfg_resume(void) +{ + 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 +184,20 @@ 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(&ZoneHigh, + sizeof(*store), 4); + struct hlist_node **pprev =3D &romfile_pointer_list.first; + store->pointer =3D pointer; + store->key =3D qemu_get_romfile_key(dest_file); + if (store->key =3D=3D 0) { + goto err; + } + store->offset =3D dst_offset; + store->ptr_size =3D entry->wr_pointer.size; + hlist_add(&store->node, pprev); + 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