2 * fmap_from_fmd.c, tool to distill flashmap descriptors into raw FMAP sections
4 * Copyright (C) 2015 Google, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
16 #include "fmap_from_fmd.h"
23 static bool fmap_append_fmd_node(struct fmap
**flashmap
,
24 const struct flashmap_descriptor
*section
,
25 unsigned absolute_watermark
) {
26 if (strlen(section
->name
) >= FMAP_STRLEN
) {
27 ERROR("Section name ('%s') exceeds %d character FMAP format limit\n",
28 section
->name
, FMAP_STRLEN
- 1);
32 absolute_watermark
+= section
->offset
;
34 if (fmap_append_area(flashmap
, absolute_watermark
, section
->size
,
35 (uint8_t *)section
->name
, 0) < 0) {
36 ERROR("Failed to insert section '%s' into FMAP\n",
41 fmd_foreach_child(subsection
, section
) {
42 if (!fmap_append_fmd_node(flashmap
, subsection
,
50 struct fmap
*fmap_from_fmd(const struct flashmap_descriptor
*desc
)
53 assert(desc
->size_known
);
55 if (strlen(desc
->name
) >= FMAP_STRLEN
) {
56 ERROR("Image name ('%s') exceeds %d character FMAP header limit\n",
57 desc
->name
, FMAP_STRLEN
- 1);
61 struct fmap
*fmap
= fmap_create(desc
->offset_known
? desc
->offset
: 0,
62 desc
->size
, (uint8_t *)desc
->name
);
64 ERROR("Failed to allocate FMAP header\n");
68 fmd_foreach_child(real_section
, desc
) {
69 if (!fmap_append_fmd_node(&fmap
, real_section
, 0)) {