diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2017-09-18 10:47:21 +0200 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2017-09-22 11:13:22 -0400 |
commit | 1bda724cc5671f067d564d1ad18bba34384ff8f5 (patch) | |
tree | d5e235eb8e7f47f4631a62f0d37777c05b4d601d | |
parent | 90fa511527146dc098c39612478e61cdd3e1dc82 (diff) | |
download | seabios-1bda724cc5671f067d564d1ad18bba34384ff8f5.tar.gz |
romfile: add support for constant files.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | src/romfile.c | 46 | ||||
-rw-r--r-- | src/romfile.h | 2 |
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 |