From 69b88bf1276d2cb0309e2fc96df9d33a893138e3 Mon Sep 17 00:00:00 2001 From: Sol Boucher Date: Thu, 26 Feb 2015 11:47:19 -0800 Subject: fmaptool: Introduce the fmd ("flashmap descriptor") language and compiler This adds a compiler for a language whose textual representation of flashmap regions will be used to describe the layout of flash chips that contain more than just a single CBFS. Direct integration with cbfstool (via a new command-line switch for the create action) is forthcoming but will be added separately. BUG=chromium:461875 TEST=Use Chromium OS's cros_bundle_firmware script on the fmap.dts file for panther. Using the latter file as a reference, write a corresponding fmap.fmd file and feed it through fmaptool. Run both binary output files though the flashmap project's own flashmap_decode utility. Observe only the expected differences. BRANCH=None Change-Id: I06b32d138dbef0a4e5ed43c81bd31c796fd5d669 Signed-off-by: Sol Boucher Original-Commit-Id: 005ab67eb594e21489cf31036aedaea87e0c7142 Original-Change-Id: Ia08f28688efdbbfc70c255916b8eb7eb0eb07fb2 Original-Signed-off-by: Sol Boucher Original-Reviewed-on: https://chromium-review.googlesource.com/255031 Original-Reviewed-by: Julius Werner Original-Reviewed-by: Stefan Reinauer Reviewed-on: http://review.coreboot.org/9942 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- util/cbfstool/fmd_scanner.l | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 util/cbfstool/fmd_scanner.l (limited to 'util/cbfstool/fmd_scanner.l') diff --git a/util/cbfstool/fmd_scanner.l b/util/cbfstool/fmd_scanner.l new file mode 100644 index 0000000000..d2cc43d04c --- /dev/null +++ b/util/cbfstool/fmd_scanner.l @@ -0,0 +1,78 @@ +/* + * fmd_scanner.l, scanner generator for flashmap descriptor language + * + * 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 "fmd_parser.h" + +#include +#include + +int parse_integer(char *input, int base); +int copy_string(const char *input); +%} + +%option noyywrap + +MULTIPLIER [KMG] + +%% + +[[:space:]]+ /* Eat whitespace. */ +#.*$ /* Eat comments. */ +0{MULTIPLIER}? | +[1-9][0-9]*{MULTIPLIER}? return parse_integer(yytext, 10); +0[0-9]+{MULTIPLIER}? return OCTAL; +0[xX][0-9a-f]+{MULTIPLIER}? return parse_integer(yytext + 2, 16); +[^#@{}()[:space:]]* return copy_string(yytext); +. return *yytext; + +%% + +int parse_integer(char *input, int base) +{ + char *multiplier = NULL; + unsigned val = strtoul(input, &multiplier, base); + + if (*multiplier) { + switch(*multiplier) { + case 'K': + val *= 1024; + break; + case 'M': + val *= 1024*1024; + break; + case 'G': + val *= 1024*1024*1024; + break; + default: + // If we ever get here, the MULTIPLIER regex is allowing + // multiplier suffixes not handled by this code. + assert(false); + } + } + + yylval.intval = val; + return INTEGER; +} + +int copy_string(const char *input) +{ + yylval.strval = strdup(input); + return STRING; +} -- cgit v1.2.3