aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Warren <ben@skyportsystems.com>2017-02-20 19:56:18 -0800
committerGerd Hoffmann <kraxel@redhat.com>2017-02-24 15:01:20 +0100
commitc45ca702322e6ffa030aca54ca131b264b5cec85 (patch)
tree3b3dfa9e7489cb4b9958988a923dc4ccdec1e383
parent31b6229da2d00e5202692669887e4e82f8354735 (diff)
downloadseabios-c45ca702322e6ffa030aca54ca131b264b5cec85.zip
seabios-c45ca702322e6ffa030aca54ca131b264b5cec85.tar.gz
seabios-c45ca702322e6ffa030aca54ca131b264b5cec85.tar.bz2
QEMU fw_cfg: Add functions for accessing files by key
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> (cherry picked from commit 336b60bb10196adf287489cca4fd17092d9fac5e)
-rw-r--r--src/fw/paravirt.c41
-rw-r--r--src/fw/paravirt.h2
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;
}
+// 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
@@ -370,6 +377,18 @@ qemu_romfile_add(char *name, int select, int skip, int size)
}
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)
{
u16 smp_count = 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);
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