summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--layout.c106
-rw-r--r--layout.h11
-rw-r--r--libflashrom.c5
3 files changed, 51 insertions, 71 deletions
diff --git a/layout.c b/layout.c
index 11df15cf8..8047a93a3 100644
--- a/layout.c
+++ b/layout.c
@@ -25,12 +25,17 @@
#include "programmer.h"
#include "layout.h"
-static struct romentry entries[MAX_ROMLAYOUT];
-static struct flashrom_layout global_layout = { entries, MAX_ROMLAYOUT, 0 };
+struct flashrom_layout {
+ struct romentry *head;
+};
+
+static struct flashrom_layout *global_layout;
struct flashrom_layout *get_global_layout(void)
{
- return &global_layout;
+ if (!global_layout)
+ flashrom_layout_new(&global_layout, 0);
+ return global_layout;
}
const struct flashrom_layout *get_default_layout(const struct flashrom_flashctx *const flashctx)
@@ -40,7 +45,7 @@ const struct flashrom_layout *get_default_layout(const struct flashrom_flashctx
const struct flashrom_layout *get_layout(const struct flashrom_flashctx *const flashctx)
{
- if (flashctx->layout && flashctx->layout->num_entries)
+ if (flashctx->layout)
return flashctx->layout;
else
return get_default_layout(flashctx);
@@ -49,16 +54,7 @@ const struct flashrom_layout *get_layout(const struct flashrom_flashctx *const f
static struct romentry *mutable_layout_next(
const struct flashrom_layout *const layout, struct romentry *iterator)
{
- const struct romentry *const end = layout->entries + layout->num_entries;
-
- if (iterator)
- ++iterator;
- else
- iterator = &layout->entries[0];
-
- if (iterator < end)
- return iterator;
- return NULL;
+ return iterator ? iterator->next : layout->head;
}
static struct romentry *_layout_entry_by_name(
@@ -91,11 +87,6 @@ int read_romlayout(const char *name)
while (!feof(romlayout)) {
char *tstr1, *tstr2;
- if (layout->num_entries >= layout->capacity) {
- msg_gerr("Maximum number of ROM images (%zu) in layout "
- "file reached.\n", layout->capacity);
- goto _close_ret;
- }
if (2 != fscanf(romlayout, "%255s %255s\n", tempstr, tempname))
continue;
#if 0
@@ -186,7 +177,7 @@ static int include_region(struct flashrom_layout *const l, const char *name,
/* returns -1 if an entry is not found, 0 if found. */
static int find_romentry(struct flashrom_layout *const l, char *name, char *file)
{
- if (l->num_entries == 0)
+ if (!l->head)
return -1;
msg_gspew("Looking for region \"%s\"... ", name);
@@ -222,7 +213,7 @@ int process_include_args(struct flashrom_layout *l, const struct layout_include_
return 0;
/* User has specified an include argument, but no layout is loaded. */
- if (l->num_entries == 0) {
+ if (!l->head) {
msg_gerr("Region requested (with -i \"%s\"), "
"but no layout data is available.\n",
args->name);
@@ -287,7 +278,6 @@ int included_regions_overlap(const struct flashrom_layout *const l)
void layout_cleanup(struct layout_include_args **args)
{
struct flashrom_layout *const layout = get_global_layout();
- unsigned int i;
struct layout_include_args *tmp;
while (*args) {
@@ -298,12 +288,8 @@ void layout_cleanup(struct layout_include_args **args)
*args = tmp;
}
- for (i = 0; i < layout->num_entries; i++) {
- free(layout->entries[i].name);
- free(layout->entries[i].file);
- layout->entries[i].included = false;
- }
- layout->num_entries = 0;
+ global_layout = NULL;
+ flashrom_layout_release(layout);
}
/* Validate and - if needed - normalize layout entries. */
@@ -380,7 +366,7 @@ const struct romentry *layout_next_included(
const struct romentry *layout_next(
const struct flashrom_layout *const layout, const struct romentry *iterator)
{
- return mutable_layout_next(layout, (struct romentry *)iterator);
+ return iterator ? iterator->next : layout->head;
}
/**
@@ -399,17 +385,13 @@ const struct romentry *layout_next(
*/
int flashrom_layout_new(struct flashrom_layout **const layout, const unsigned int count)
{
- *layout = malloc(sizeof(**layout) + count * sizeof(struct romentry));
+ *layout = malloc(sizeof(**layout));
if (!*layout) {
msg_gerr("Error creating layout: %s\n", strerror(errno));
return 1;
}
- const struct flashrom_layout tmp = {
- .entries = (void *)((char *)*layout + sizeof(**layout)),
- .capacity = count,
- .num_entries = 0,
- };
+ const struct flashrom_layout tmp = { 0 };
**layout = tmp;
return 0;
}
@@ -423,32 +405,36 @@ int flashrom_layout_new(struct flashrom_layout **const layout, const unsigned in
* @param name Name of the region.
*
* @return 0 on success,
- * 1 if out of memory,
- * 2 if the layout is full already.
+ * 1 if out of memory.
*/
int flashrom_layout_add_region(
struct flashrom_layout *const layout,
const size_t start, const size_t end, const char *const name)
{
- if (layout->num_entries >= layout->capacity) {
- msg_gerr("Error adding layout entry: No space left\n");
- return 2;
- }
-
- struct romentry *const entry = &layout->entries[layout->num_entries];
- entry->start = start;
- entry->end = end;
- entry->included = false;
- entry->name = strdup(name);
- entry->file = NULL;
- if (!entry->name) {
- msg_gerr("Error adding layout entry: %s\n", strerror(errno));
- return 1;
- }
+ struct romentry *const entry = malloc(sizeof(*entry));
+ if (!entry)
+ goto _err_ret;
+
+ const struct romentry tmp = {
+ .next = layout->head,
+ .start = start,
+ .end = end,
+ .included = false,
+ .name = strdup(name),
+ .file = NULL,
+ };
+ *entry = tmp;
+ if (!entry->name)
+ goto _err_ret;
msg_gdbg("Added layout entry %08zx - %08zx named %s\n", start, end, name);
- ++layout->num_entries;
+ layout->head = entry;
return 0;
+
+_err_ret:
+ msg_gerr("Error adding layout entry: %s\n", strerror(errno));
+ free(entry);
+ return 1;
}
/**
@@ -472,14 +458,18 @@ int flashrom_layout_include_region(struct flashrom_layout *const layout, const c
*/
void flashrom_layout_release(struct flashrom_layout *const layout)
{
- unsigned int i;
+ if (layout == global_layout)
+ return;
- if (!layout || layout == get_global_layout())
+ if (!layout)
return;
- for (i = 0; i < layout->num_entries; ++i) {
- free(layout->entries[i].name);
- free(layout->entries[i].file);
+ while (layout->head) {
+ struct romentry *const entry = layout->head;
+ layout->head = entry->next;
+ free(entry->file);
+ free(entry->name);
+ free(entry);
}
free(layout);
}
diff --git a/layout.h b/layout.h
index 49c1a1371..bf183a670 100644
--- a/layout.h
+++ b/layout.h
@@ -36,6 +36,8 @@ typedef uint32_t chipsize_t; /* Able to store the number of bytes of any support
#define MAX_ROMLAYOUT 128
struct romentry {
+ struct romentry *next;
+
chipoff_t start;
chipoff_t end;
bool included;
@@ -43,14 +45,7 @@ struct romentry {
char *file;
};
-struct flashrom_layout {
- /* entries store the entries specified in a layout file and associated run-time data */
- struct romentry *entries;
- /* the maximum number of entries */
- size_t capacity;
- /* the number of successfully parsed entries */
- size_t num_entries;
-};
+struct flashrom_layout;
struct layout_include_args {
char *name;
diff --git a/libflashrom.c b/libflashrom.c
index dd5cb002e..cb0d47026 100644
--- a/libflashrom.c
+++ b/libflashrom.c
@@ -505,11 +505,6 @@ static int flashrom_layout_parse_fmap(struct flashrom_layout **layout,
if (!fmap || !l)
return 1;
- if (l->num_entries + fmap->nareas > l->capacity) {
- msg_gerr("Cannot add fmap entries to layout - Too many entries.\n");
- return 1;
- }
-
for (i = 0, area = fmap->areas; i < fmap->nareas; i++, area++) {
snprintf(name, sizeof(name), "%s", area->name);
if (flashrom_layout_add_region(l, area->offset, area->offset + area->size - 1, name))