summaryrefslogtreecommitdiff
path: root/util/smmstoretool/storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/smmstoretool/storage.c')
-rw-r--r--util/smmstoretool/storage.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/util/smmstoretool/storage.c b/util/smmstoretool/storage.c
index abc6840b67..8a02384108 100644
--- a/util/smmstoretool/storage.c
+++ b/util/smmstoretool/storage.c
@@ -5,6 +5,9 @@
#include <assert.h>
#include <stdio.h>
+#include "commonlib/bsd/compiler.h"
+#include "fmap.h"
+
#include "fv.h"
#include "utils.h"
@@ -19,8 +22,27 @@ bool storage_open(const char store_file[], struct storage_t *storage, bool rw)
return false;
}
+ /* If we won't find FMAP with SMMSTORE, use the whole file, but fail if
+ * FMAP is there without SMMSTORE. */
+ storage->region = storage->file;
+
+ long fmap_offset = fmap_find(storage->file.start, storage->file.length);
+ if (fmap_offset >= 0) {
+ struct fmap *fmap = (void *)(storage->file.start + fmap_offset);
+ const struct fmap_area *area = fmap_find_area(fmap, "SMMSTORE");
+ if (area == NULL) {
+ fprintf(stderr,
+ "Found FMAP without SMMSTORE in \"%s\"\n",
+ store_file);
+ return false;
+ }
+
+ storage->region.start += area->offset;
+ storage->region.length = area->size;
+ }
+
bool auth_vars;
- if (!fv_parse(storage->file, &storage->store_area, &auth_vars)) {
+ if (!fv_parse(storage->region, &storage->store_area, &auth_vars)) {
if (!rw) {
fprintf(stderr,
"Failed to find variable store in \"%s\"\n",
@@ -28,14 +50,14 @@ bool storage_open(const char store_file[], struct storage_t *storage, bool rw)
goto error;
}
- if (!fv_init(storage->file)) {
+ if (!fv_init(storage->region)) {
fprintf(stderr,
"Failed to create variable store in \"%s\"\n",
store_file);
goto error;
}
- if (!fv_parse(storage->file, &storage->store_area, &auth_vars)) {
+ if (!fv_parse(storage->region, &storage->store_area, &auth_vars)) {
fprintf(stderr,
"Failed to parse newly formatted store in \"%s\"\n",
store_file);