a73b93157f
It encourages users from writing to the FSF without giving an address. Linux also prefers to drop that and their checkpatch.pl (that we imported) looks out for that. This is the result of util/scripts/no-fsf-addresses.sh with no further editing. Change-Id: Ie96faea295fe001911d77dbc51e9a6789558fbd6 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Reviewed-on: http://review.coreboot.org/11888 Tested-by: build bot (Jenkins) Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
118 lines
2.7 KiB
C
118 lines
2.7 KiB
C
/*
|
|
* fmap_sections.c, track which sections of the image will contain CBFSes
|
|
*
|
|
* Copyright (C) 2015 Google, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#include "cbfs_sections.h"
|
|
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
struct descriptor_node {
|
|
const struct flashmap_descriptor *val;
|
|
struct descriptor_node *next;
|
|
};
|
|
|
|
static struct descriptor_list {
|
|
struct descriptor_node *head;
|
|
struct descriptor_node *tail;
|
|
} cbfs_sections;
|
|
|
|
static bool seen_primary_section = false;
|
|
|
|
static void descriptor_list_prepend(struct descriptor_list *list,
|
|
struct descriptor_node *new_head)
|
|
{
|
|
assert(list);
|
|
assert(new_head);
|
|
|
|
new_head->next = list->head;
|
|
list->head = new_head;
|
|
if (!list->tail)
|
|
list->tail = new_head;
|
|
}
|
|
|
|
static void descriptor_list_append(struct descriptor_list *list,
|
|
struct descriptor_node *new_tail)
|
|
{
|
|
assert(list);
|
|
assert(new_tail);
|
|
|
|
if (list->tail)
|
|
list->tail->next = new_tail;
|
|
list->tail = new_tail;
|
|
if (!list->head)
|
|
list->head = new_tail;
|
|
}
|
|
|
|
/* Implementation of cbfs module's callback; invoked during fmd file parsing */
|
|
bool fmd_process_annotation_impl(const struct flashmap_descriptor *node,
|
|
const char *annotation)
|
|
{
|
|
if (strcmp(annotation, SECTION_ANNOTATION_CBFS) == 0 &&
|
|
node->list_len == 0) {
|
|
struct descriptor_node *list_node = malloc(sizeof(*list_node));
|
|
list_node->val = node;
|
|
list_node->next = NULL;
|
|
|
|
if (strcmp(node->name, SECTION_NAME_PRIMARY_CBFS) == 0) {
|
|
descriptor_list_prepend(&cbfs_sections, list_node);
|
|
seen_primary_section = true;
|
|
} else {
|
|
descriptor_list_append(&cbfs_sections, list_node);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
cbfs_section_iterator_t cbfs_sections_iterator(void)
|
|
{
|
|
return cbfs_sections.head;
|
|
}
|
|
|
|
bool cbfs_sections_iterator_advance(cbfs_section_iterator_t *it)
|
|
{
|
|
assert(it);
|
|
if (!*it)
|
|
return false;
|
|
|
|
*it = (*it)->next;
|
|
return true;
|
|
}
|
|
|
|
const struct flashmap_descriptor *cbfs_sections_iterator_deref(
|
|
cbfs_section_iterator_t it)
|
|
{
|
|
assert(it);
|
|
return it->val;
|
|
}
|
|
|
|
bool cbfs_sections_primary_cbfs_accounted_for(void)
|
|
{
|
|
return seen_primary_section;
|
|
}
|
|
|
|
void cbfs_sections_cleanup(void)
|
|
{
|
|
for (struct descriptor_node *cur = cbfs_sections.head, *next = NULL;
|
|
cur; cur = next) {
|
|
next = cur->next;
|
|
free(cur);
|
|
}
|
|
cbfs_sections.head = NULL;
|
|
cbfs_sections.tail = NULL;
|
|
}
|