coreboot-kgpe-d16/util/cbfstool/cbfs_sections.c

123 lines
2.9 KiB
C
Raw Normal View History

fmaptool: Add listing of annotated CBFS sections and generate header The fmd compiler now processes "(CBFS)" annotations, distilling them into a comma-separated list of the names of sections containing CBFSes. This list is the only thing printed to standard output to enable easy capture and machine consumption by other tools. Additionally, the ability to generate a tiny header with a define for the primary CBFS's size is implemented and can be requested via a new command-line switch. Here's an example of how to use the new features: $ ./fmaptool -h layout.h layout_arm_8192.fmd layout.fmap 2>/dev/null FW_MAIN_A,FW_MAIN_B,COREBOOT The hypothetical fmd file contains three sections annotated as (CBFS), the names of which are printed to standard output. As before, a binary FMAP file named layout.fmap is created; however, because the command was invoked with -h, a header #define ing the offset of its FMAP section (i.e. where it will be relative to the base of flash once the boot image is assembled) is also generated. BUG=chromium:470407 TEST=Verify that fmd files without a "COREBOOT" section or with one that isn't annotated as "(CBFS)" are not accepted. Ensure that the list of CBFS sections matches the descriptor file's annotations and is led by the "COREBOOT" section. Invoke with the header generation switch and check that output file for reasonableness. BRANCH=None Change-Id: I496dd937f69467bfd9233c28df59c7608e89538f Signed-off-by: Sol Boucher <solb@chromium.org> Original-Commit-Id: 9227698adecf675770b2983380eb570676c2b5d2 Original-Change-Id: I8b32f6ef19cabe2f6760106e676683c4565bbaad Original-Signed-off-by: Sol Boucher <solb@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/262956 Original-Reviewed-by: Duncan Laurie <dlaurie@chromium.org> Original-Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-on: http://review.coreboot.org/9967 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
2015-03-18 18:13:48 +01:00
/*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
*/
#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;
}