]> xenbits.xensource.com Git - seabios.git/commitdiff
QEMU fw_cfg: Add functions for accessing files by key
authorBen Warren <ben@skyportsystems.com>
Tue, 21 Feb 2017 03:56:18 +0000 (19:56 -0800)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 21 Feb 2017 14:30:15 +0000 (09:30 -0500)
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 <ben@skyportsystems.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
src/fw/paravirt.c
src/fw/paravirt.h

index 4618647f49f6173709b56060428358ac126a6e00..707502da907cb526f18ae9ef2d4669d59e2def83 100644 (file)
@@ -329,6 +329,22 @@ qemu_cfg_read_file(struct romfile_s *file, void *dst, u32 maxlen)
     return file->size;
 }
 
+// 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 == 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 = container_of(file, struct qemu_romfile_s, file);
-    if (offset == 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);
 }
 
 static void
@@ -369,6 +376,18 @@ qemu_romfile_add(char *name, int select, int skip, int size)
     romfile_add(&qfile->file);
 }
 
+u16
+qemu_get_romfile_key(struct romfile_s *file)
+{
+    struct qemu_romfile_s *qfile;
+    if (file->copy != qemu_cfg_read_file) {
+        warn_internalerror();
+        return 0;
+    }
+    qfile = container_of(file, struct qemu_romfile_s, file);
+    return qfile->select;
+}
+
 u16
 qemu_get_present_cpus_count(void)
 {
index fb220d87ff1f37e5d54f158dd0619a92964d43ba..16f3d9a68ad2319889be6b443b2680b898ebb241 100644 (file)
@@ -56,5 +56,7 @@ void qemu_cfg_init(void);
 
 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);
 
 #endif