5dc628a2ef
In order to more easily process the output of 'cbfstool print' with other tools provide a -k option which spits out the tab-separated header and fields: Name Offset Type Metadata Size Data Size Total Size ALIGN_UP(Offset + Total Size, 64) would be the start of the next entry. Also, one can analzye the overhead and offsets of each file more easily. Example output (note: tabs aren't in here): $ ./coreboot-builds/sharedutils/cbfstool/cbfstool test.serial.bin print -r FW_MAIN_A -k Performing operation on 'FW_MAIN_A' region... Name Offset Type Metadata Size Data Size Total Size cmos_layout.bin 0x0 cmos_layout 0x38 0x48c 0x4c4 dmic-2ch-48khz-16b.bin 0x500 raw 0x48 0xb68 0xbb0 dmic-2ch-48khz-32b.bin 0x10c0 raw 0x48 0xb68 0xbb0 nau88l25-2ch-48khz-24b.bin 0x1c80 raw 0x48 0x54 0x9c ssm4567-render-2ch-48khz-24b.bin 0x1d40 raw 0x58 0x54 0xac ssm4567-capture-4ch-48khz-32b.bin 0x1e00 raw 0x58 0x54 0xac vbt.bin 0x1ec0 optionrom 0x38 0x1000 0x1038 spd.bin 0x2f00 spd 0x38 0x600 0x638 config 0x3540 raw 0x38 0x1ab7 0x1aef revision 0x5040 raw 0x38 0x25e 0x296 font.bin 0x5300 raw 0x38 0x77f 0x7b7 vbgfx.bin 0x5ac0 raw 0x38 0x32f8 0x3330 locales 0x8e00 raw 0x28 0x2 0x2a locale_en.bin 0x8e40 raw 0x38 0x29f6 0x2a2e u-boot.dtb 0xb880 mrc_cache 0x38 0xff1 0x1029 (empty) 0xc8c0 null 0x64 0xadf4 0xae58 fallback/ramstage 0x17740 stage 0x38 0x15238 0x15270 (empty) 0x2c9c0 null 0x64 0xd2c4 0xd328 fallback/payload 0x39d00 payload 0x38 0x12245 0x1227d cpu_microcode_blob.bin 0x4bf80 microcode 0x60 0x17000 0x17060 (empty) 0x63000 null 0x28 0x37cf98 0x37cfc0 Change-Id: I1c5f8c1b5f2f980033d6c954c9840299c6268431 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/13475 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com> |
||
---|---|---|
.. | ||
console | ||
flashmap | ||
lzma | ||
cbfs-mkpayload.c | ||
cbfs-mkstage.c | ||
cbfs-payload-linux.c | ||
cbfs.h | ||
cbfs_hash.c | ||
cbfs_image.c | ||
cbfs_image.h | ||
cbfs_sections.c | ||
cbfs_sections.h | ||
cbfstool.c | ||
coff.h | ||
common.c | ||
common.h | ||
compress.c | ||
default-x86.fmd | ||
default.fmd | ||
elf.h | ||
elfheaders.c | ||
elfparsing.h | ||
EXAMPLE | ||
fit.c | ||
fit.h | ||
flashmap_tests.c | ||
fmap_from_fmd.c | ||
fmap_from_fmd.h | ||
fmaptool.c | ||
fmd.c | ||
fmd.h | ||
fmd_parser.c_shipped | ||
fmd_parser.h_shipped | ||
fmd_parser.y | ||
fmd_scanner.c_shipped | ||
fmd_scanner.h_shipped | ||
fmd_scanner.l | ||
fv.h | ||
linux.h | ||
linux_trampoline.c | ||
linux_trampoline.h | ||
linux_trampoline.S | ||
Makefile | ||
Makefile.inc | ||
option.h | ||
partitioned_file.c | ||
partitioned_file.h | ||
ProcessorBind.h | ||
README.fmaptool | ||
rmodtool.c | ||
rmodule.c | ||
rmodule.h | ||
swab.h | ||
xdr.c |
Flashmap descriptors in coreboot ================================ Flashmap (https://code.google.com/p/flashmap) is a binary format for representing the layout of flash chips. Since coreboot is starting to use a "partition" of this format to describe the flash chip layout---both at runtime and when flashing a new image onto a chip---, the project needed a reasonably expressive plaintext format for representing such sections in the source tree. Our solution is the fmd ("flashmap descriptor") language, and the files in this directory contain a scanner, parser, semantic analyser, and flashmap converter. Here's an informal language description: # <line comment> <image name>[@<memory-mapped address>] <image size> { <section name>[@<offset from start of image>] [<section size>] [{ <subsection name>[@<offset from start of parent section>] [<subsection size>] [{ # Sections can be nested as deeply as desired <subsubsection name>[(CBFS)][@...] [...] [{...}] }] [<subsection name>[(CBFS)][@...] [...] [{...}]] # There can be many subsections at each level of nesting: they will be inserted # sequentially, and although gaps are allowed, any provided offsets are always # relative to the closest parent node's and must be strictly increasing with neither # overlapping nor degenerate-size sections. }] } Note that the above example contains a few symbols that are actually metasyntax, and therefore have neither meaning nor place in a real file. The <.*> s indicate placeholders for parameters: - The names are strings, which are provided as single-word---no whitespace---groups of syntactically unimportant symbols (i.e. everything except @, {, and }): they are not surrounded by quotes or any other form of delimiter. - The other fields are nonnegative integers, which may be given as decimal or hexadecimal; in either case, a K, M, or G may be appended---without intermediate whitespace---as a multiplier. - Comments consist of anything one manages to enter, provided it doesn't start a new line. The [.*] s indicate that a portion of the file could be omitted altogether: - Just because something is noted as optional doesn't mean it is in every case: the answer might actually depend on which other information is---or isn't---provided. - In particular, it is only legal to place a (CBFS) annotation on a leaf section; that is, choosing to add child sections excludes the possibility of putting a CBFS in their parent. Such annotations are only used to decide where CBFS empty file headers should be created, and do not result in the storage of any additional metadata in the resulting FMAP section. Additionally, it's important to note these properties of the overall file and its values: - Other than within would-be strings and numbers, whitespace is ignored. It goes without saying that such power comes with responsibility, which is why this sentence is here. - Although the .*section names must be globally unique, one of them may---but is not required to--- match the image name. - It is a syntax error to supply a number---besides 0---that begins with the character 0, as there is no intention of adding octals to the mix. - The image's memory address should be present on---and only on---layouts for memory-mapped chips. - Although it may be evident from above, all .*section offsets are relative only to the immediate parent. There is no way to include an absolute offset (i.e. from the beginning of flash), which means that it is "safe" to reorder the .*section s within a particular level of nesting, as long as the change doesn't cause their positions and sizes to necessitate overlap or zero sizes. - A .*section with omitted offset is assumed to start at as low a position as possible---with no consideration of alignment---and one with omitted size is assumed to fill the remaining space until the next sibling or before the end of its parent. - It's fine to omit any .*section 's offset, size, or both, provided its position and size are still unambiguous in the context of its *sibling* sections and its parent's *size*. In particular, knowledge of one .*section 's children or the .*section s' common parent's siblings will not be used for this purpose. - Although .*section s are not required to have children, the flash chip as a whole must have at least one. - Though the braces after .*section s may be omitted for those that have no children, if they are present, they must contain at least one child. PL people and sympathizers may wish to examine the formal abstract syntax and context-free grammar, which are located in fmd_scanner.l and fmd_scanner.y, respectively. Those interested in the algorithm used to infer omitted values will feel at home in fmd.c, particularly near the definition of validate_and_complete_info().