All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: afaerber@suse.de, Anthony Liguori <anthony@codemonkey.ws>
Subject: [Qemu-devel] [PATCH v4 05/23] fw_cfg: interface to trigger callback on read
Date: Sun, 22 Sep 2013 16:37:17 +0300	[thread overview]
Message-ID: <1379857006-17451-6-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1379857006-17451-1-git-send-email-mst@redhat.com>

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/nvram/fw_cfg.h |  4 ++++
 hw/nvram/fw_cfg.c         | 33 ++++++++++++++++++++++++++++-----
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/include/hw/nvram/fw_cfg.h b/include/hw/nvram/fw_cfg.h
index f60dd67..2ab0fc2 100644
--- a/include/hw/nvram/fw_cfg.h
+++ b/include/hw/nvram/fw_cfg.h
@@ -60,6 +60,7 @@ typedef struct FWCfgFiles {
 } FWCfgFiles;
 
 typedef void (*FWCfgCallback)(void *opaque, uint8_t *data);
+typedef void (*FWCfgReadCallback)(void *opaque, uint32_t offset);
 
 void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len);
 void fw_cfg_add_string(FWCfgState *s, uint16_t key, const char *value);
@@ -70,6 +71,9 @@ void fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
                          void *callback_opaque, void *data, size_t len);
 void fw_cfg_add_file(FWCfgState *s, const char *filename, void *data,
                      size_t len);
+void fw_cfg_add_file_callback(FWCfgState *s, const char *filename,
+                              FWCfgReadCallback callback, void *callback_opaque,
+                              void *data, size_t len);
 FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
                         hwaddr crl_addr, hwaddr data_addr);
 
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index d0820e5..f5dc3ea 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -42,6 +42,7 @@ typedef struct FWCfgEntry {
     uint8_t *data;
     void *callback_opaque;
     FWCfgCallback callback;
+    FWCfgReadCallback read_callback;
 } FWCfgEntry;
 
 struct FWCfgState {
@@ -249,8 +250,12 @@ static uint8_t fw_cfg_read(FWCfgState *s)
 
     if (s->cur_entry == FW_CFG_INVALID || !e->data || s->cur_offset >= e->len)
         ret = 0;
-    else
+    else {
+        if (e->read_callback) {
+            e->read_callback(e->callback_opaque, s->cur_offset);
+        }
         ret = e->data[s->cur_offset++];
+    }
 
     trace_fw_cfg_read(s, ret);
     return ret;
@@ -381,7 +386,10 @@ static const VMStateDescription vmstate_fw_cfg = {
     }
 };
 
-void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len)
+static void fw_cfg_add_bytes_read_callback(FWCfgState *s, uint16_t key,
+                                           FWCfgReadCallback callback,
+                                           void *callback_opaque,
+                                           void *data, size_t len)
 {
     int arch = !!(key & FW_CFG_ARCH_LOCAL);
 
@@ -391,6 +399,13 @@ void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len)
 
     s->entries[arch][key].data = data;
     s->entries[arch][key].len = (uint32_t)len;
+    s->entries[arch][key].read_callback = callback;
+    s->entries[arch][key].callback_opaque = callback_opaque;
+}
+
+void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len)
+{
+    fw_cfg_add_bytes_read_callback(s, key, NULL, NULL, data, len);
 }
 
 void fw_cfg_add_string(FWCfgState *s, uint16_t key, const char *value)
@@ -444,8 +459,9 @@ void fw_cfg_add_callback(FWCfgState *s, uint16_t key, FWCfgCallback callback,
     s->entries[arch][key].callback = callback;
 }
 
-void fw_cfg_add_file(FWCfgState *s,  const char *filename,
-                     void *data, size_t len)
+void fw_cfg_add_file_callback(FWCfgState *s,  const char *filename,
+                              FWCfgReadCallback callback, void *callback_opaque,
+                              void *data, size_t len)
 {
     int i, index;
     size_t dsize;
@@ -459,7 +475,8 @@ void fw_cfg_add_file(FWCfgState *s,  const char *filename,
     index = be32_to_cpu(s->files->count);
     assert(index < FW_CFG_FILE_SLOTS);
 
-    fw_cfg_add_bytes(s, FW_CFG_FILE_FIRST + index, data, len);
+    fw_cfg_add_bytes_read_callback(s, FW_CFG_FILE_FIRST + index,
+                                   callback, callback_opaque, data, len);
 
     pstrcpy(s->files->f[index].name, sizeof(s->files->f[index].name),
             filename);
@@ -477,6 +494,12 @@ void fw_cfg_add_file(FWCfgState *s,  const char *filename,
     s->files->count = cpu_to_be32(index+1);
 }
 
+void fw_cfg_add_file(FWCfgState *s,  const char *filename,
+                     void *data, size_t len)
+{
+    fw_cfg_add_file_callback(s, filename, NULL, NULL, data, len);
+}
+
 static void fw_cfg_machine_ready(struct Notifier *n, void *data)
 {
     size_t len;
-- 
MST

  parent reply	other threads:[~2013-09-22 13:35 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-22 13:37 [Qemu-devel] [PATCH v4 00/23] qemu: generate acpi tables for the guest Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 01/23] qemu: add Error to typedefs Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 02/23] qom: pull in qemu/typedefs Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 03/23] qom: cleanup struct Error references Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 04/23] qom: add pointer to int property helpers Michael S. Tsirkin
2013-09-22 13:37 ` Michael S. Tsirkin [this message]
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 06/23] loader: support for unmapped ROM blobs Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 07/23] pcie_host: expose UNMAPPED macro Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 08/23] pcie_host: expose address format Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 09/23] q35: use macro for MCFG property name Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 10/23] q35: expose mmcfg size as a property Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 11/23] i386: add ACPI table files from seabios Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 12/23] acpi: add rules to compile ASL source Michael S. Tsirkin
2013-09-23 12:36   ` Paolo Bonzini
2013-09-23 13:39     ` Michael S. Tsirkin
2013-09-23 13:44       ` Laszlo Ersek
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 13/23] acpi: pre-compiled ASL files Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 14/23] loader: use file path size from fw_cfg.h Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 15/23] i386: add bios linker/loader Michael S. Tsirkin
2013-09-23 12:48   ` Paolo Bonzini
2013-09-23 13:36     ` Michael S. Tsirkin
2013-09-23 13:39       ` Paolo Bonzini
2013-09-23 13:47         ` Michael S. Tsirkin
2013-09-23 13:52           ` Paolo Bonzini
2013-09-23 19:08             ` Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 16/23] loader: allow adding ROMs in done callbacks Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 17/23] i386: define pc guest info Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 18/23] acpi/piix: add macros for acpi property names Michael S. Tsirkin
2013-09-22 13:37 ` [Qemu-devel] [PATCH v4 19/23] piix: APIs for pc guest info Michael S. Tsirkin
2013-09-23  9:27   ` Igor Mammedov
2013-09-23 10:10     ` Michael S. Tsirkin
2013-09-23 11:14       ` Igor Mammedov
2013-09-23 11:28         ` Michael S. Tsirkin
2013-09-22 13:38 ` [Qemu-devel] [PATCH v4 20/23] ich9: " Michael S. Tsirkin
2013-09-22 13:38 ` [Qemu-devel] [PATCH v4 21/23] pvpanic: add API to access io port Michael S. Tsirkin
2013-09-22 13:38 ` [Qemu-devel] [PATCH v4 22/23] hpet: add API to find it Michael S. Tsirkin
2013-09-22 19:22   ` Paolo Bonzini
2013-09-22 19:58     ` Michael S. Tsirkin
2013-09-22 13:38 ` [Qemu-devel] [PATCH v4 23/23] i386: ACPI table generation code from seabios Michael S. Tsirkin
2013-09-24  9:23 ` [Qemu-devel] [PATCH v4 00/23] qemu: generate acpi tables for the guest Gerd Hoffmann
2013-09-24 21:45   ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1379857006-17451-6-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=afaerber@suse.de \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.