From nobody Sat May 10 08:24:45 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 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 --- 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