aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2017-09-18 10:47:21 +0200
committerKevin O'Connor <kevin@koconnor.net>2017-09-22 11:13:22 -0400
commit1bda724cc5671f067d564d1ad18bba34384ff8f5 (patch)
treed5e235eb8e7f47f4631a62f0d37777c05b4d601d
parent90fa511527146dc098c39612478e61cdd3e1dc82 (diff)
downloadseabios-1bda724cc5671f067d564d1ad18bba34384ff8f5.tar.gz
romfile: add support for constant files.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--src/romfile.c46
-rw-r--r--src/romfile.h2
2 files changed, 48 insertions, 0 deletions
diff --git a/src/romfile.c b/src/romfile.c
index 42261a62..b598274e 100644
--- a/src/romfile.c
+++ b/src/romfile.c
@@ -98,3 +98,49 @@ romfile_loadint(const char *name, u64 defval)
return defval;
return val;
}
+
+struct const_romfile_s {
+ struct romfile_s file;
+ void *data;
+};
+
+static int
+const_read_file(struct romfile_s *file, void *dst, u32 maxlen)
+{
+ if (file->size > maxlen)
+ return -1;
+ struct const_romfile_s *cfile;
+ cfile = container_of(file, struct const_romfile_s, file);
+ if (maxlen > file->size)
+ maxlen = file->size;
+ memcpy(dst, cfile->data, maxlen);
+ return file->size;
+}
+
+static void
+const_romfile_add(char *name, void *data, int size)
+{
+ struct const_romfile_s *cfile = malloc_tmp(sizeof(*cfile));
+ if (!cfile) {
+ warn_noalloc();
+ return;
+ }
+ memset(cfile, 0, sizeof(*cfile));
+ strtcpy(cfile->file.name, name, sizeof(cfile->file.name));
+ cfile->file.size = size;
+ cfile->file.copy = const_read_file;
+ cfile->data = data;
+ romfile_add(&cfile->file);
+}
+
+void
+const_romfile_add_int(char *name, u32 value)
+{
+ u32 *data = malloc_tmp(sizeof(*data));
+ if (!data) {
+ warn_noalloc();
+ return;
+ }
+ *data = value;
+ const_romfile_add(name, data, sizeof(*data));
+}
diff --git a/src/romfile.h b/src/romfile.h
index c6d62a1d..3e0f8200 100644
--- a/src/romfile.h
+++ b/src/romfile.h
@@ -16,4 +16,6 @@ struct romfile_s *romfile_find(const char *name);
void *romfile_loadfile(const char *name, int *psize);
u64 romfile_loadint(const char *name, u64 defval);
+void const_romfile_add_int(char *name, u32 value);
+
#endif // romfile.h