From 9497fcb742cebafb8d47f4cc3f0da796b0490498 Mon Sep 17 00:00:00 2001 From: Hung-Te Lin Date: Mon, 4 Mar 2019 14:28:37 +0800 Subject: cbfstool: Change FMD annotation to flags The idea of "annotation" for firmware sections was pretty flexible, but in future we will want multiple attributes applied to same area. For example, indicate the section must be preserved when updating firmware so serial number or MAC address can be preserved. The solution here is to extend annotation so it can take multiple identifiers (flags) in a row. For example, to declare a 64KB COREBOOT section as CBFS using annotation: COREBOOT(CBFS)@0x0 64k If there's a new flag "PRESERVE" indicating the section must be preserved before update, we can declare it following CBFS flag: COREBOOT(CBFS PRESERVE)@0x0 64k The flags are directly parsed in fmd_parser, and stored in an union flashmap_flags. Output modules can choose to ignore or process the flags. Currently the only supported flag is "CBFS" (for backward compatible with annotation). There will be more new flags in follow up patches. BUG=chromium:936768 TEST=make; boots on x86 "google/eve" and arm "google/kukui" devices Change-Id: Ie2d99f570e6faff6ed3a4344d6af7526a4515fae Signed-off-by: Hung-Te Lin Reviewed-on: https://review.coreboot.org/c/coreboot/+/31706 Reviewed-by: Julius Werner Tested-by: build bot (Jenkins) --- util/cbfstool/README.fmaptool | 12 +- util/cbfstool/cbfs_sections.c | 33 +++-- util/cbfstool/fmd.h | 44 +++--- util/cbfstool/fmd_parser.c_shipped | 221 ++++++++++++++++-------------- util/cbfstool/fmd_parser.h_shipped | 25 ++-- util/cbfstool/fmd_parser.y | 43 +++--- util/cbfstool/fmd_scanner.c_shipped | 266 +++++++++++++++++++----------------- util/cbfstool/fmd_scanner.h_shipped | 39 ++---- util/cbfstool/fmd_scanner.l | 5 +- 9 files changed, 366 insertions(+), 322 deletions(-) (limited to 'util/cbfstool') diff --git a/util/cbfstool/README.fmaptool b/util/cbfstool/README.fmaptool index f806c43d78..86fc3b2192 100644 --- a/util/cbfstool/README.fmaptool +++ b/util/cbfstool/README.fmaptool @@ -9,12 +9,12 @@ scanner, parser, semantic analyser, and flashmap converter. Here's an informal l # [@] { -
[@] [
] [{ +
[(flags)][@] [
] [{ [@] [] [{ # Sections can be nested as deeply as desired - [(CBFS)][@...] [...] [{...}] + [(flags)][@...] [...] [{...}] }] - [[(CBFS)][@...] [...] [{...}]] + [[(flags)][@...] [...] [{...}]] # 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 @@ -33,9 +33,11 @@ neither meaning nor place in a real file. The <.*> s indicate placeholders for p 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 + - The "flag" specifies the attribute or type for given section. The most + important supported flag is "CBFS", which indicates the section will contain a CBFS structure. + - In particular, it is only legal to place a (CBFS) flag 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 + flags 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 diff --git a/util/cbfstool/cbfs_sections.c b/util/cbfstool/cbfs_sections.c index f87b2c8b5a..285725760b 100644 --- a/util/cbfstool/cbfs_sections.c +++ b/util/cbfstool/cbfs_sections.c @@ -57,26 +57,25 @@ static void descriptor_list_append(struct descriptor_list *list, } /* Implementation of cbfs module's callback; invoked during fmd file parsing */ -bool fmd_process_annotation_impl(const struct flashmap_descriptor *node, - const char *annotation) +bool fmd_process_flag_cbfs(const struct flashmap_descriptor *node) { - 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; + struct descriptor_node *list_node; + + if (node->list_len != 0) + return false; + + list_node = (struct descriptor_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 false; + return true; } cbfs_section_iterator_t cbfs_sections_iterator(void) diff --git a/util/cbfstool/fmd.h b/util/cbfstool/fmd.h index a4131c36f5..2d8c57f922 100644 --- a/util/cbfstool/fmd.h +++ b/util/cbfstool/fmd.h @@ -23,6 +23,19 @@ #define FMD_NOTFOUND UINT_MAX +/** + * Flags used by flashmap_descriptor. + * These flags can be set by adding (NAME) after description name. + * For example, declaring a CBFS section named as COREBOOT for 16k: + * COREBOOT(CBFS) 16k + */ +union flashmap_flags { + struct { + int cbfs: 1; /* The section contains a CBFS area. */ + } f; + int v; +}; + struct flashmap_descriptor { char *name; bool offset_known; @@ -40,32 +53,25 @@ struct flashmap_descriptor { /** It is an error to read this field unless size_known is set. */ unsigned size; size_t list_len; + union flashmap_flags flags; /** It is an error to dereference this array if list_len is 0. */ struct flashmap_descriptor **list; }; /** - * **Client-defined** callback. - * This call is used to notify client code that the user has annotated the given - * section node by accompanying it with a string enclosed in parentheses. It is - * only invoked for nodes that have annotations, and then only once per node. - * The annotations' syntactic validity and semantic meaning are not determined - * by the compiler; rather, implementations of this function should use their - * return type to tell the compiler whether the annotation was valid syntax, as - * well as perform whatever actions are necessary given the particular - * annotation. It's worth reiterating that this is only called on section nodes, - * and will never be called with the final, complete flashmap_descriptor because - * it is impossible to annotate the image as a whole. Note that, although the - * node received by this function will be preserved in memory as part of the - * ultimate flashmap_descriptor, the annotation string will only persist during - * this function call: if the implementation needs it longer, it must copy it. + * **Client-defined** callback for flag "CBFS". + * This call is used to notify client code that the user has requested the given + * section node to be flagged with "CBFS". Implementations of this function + * should use their return type to tell the compiler whether the flag can be + * applied and can perform whatever actions are necessary. + * It's worth reiterating that this is only called on section nodes, and will + * never be called with the final, complete flashmap_descriptor because + * it is impossible to set flags for the image as a whole. * - * @param flashmap_descriptor The section node carrying the annotation - * @param annotation What the user wrote (only valid during callback) - * @return Whether this annotation represented valid syntax + * @param flashmap_descriptor The section node with flag set + * @return Whether this flag can be applied */ -bool fmd_process_annotation_impl(const struct flashmap_descriptor *node, - const char *annotation); +bool fmd_process_flag_cbfs(const struct flashmap_descriptor *node); /** * Parse and validate a flashmap descriptor from the specified stream. diff --git a/util/cbfstool/fmd_parser.c_shipped b/util/cbfstool/fmd_parser.c_shipped index d463393256..826a1a0bed 100644 --- a/util/cbfstool/fmd_parser.c_shipped +++ b/util/cbfstool/fmd_parser.c_shipped @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ +/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, 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 @@ -44,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.0.2" +#define YYBISON_VERSION "3.0.4" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -62,7 +62,7 @@ /* Copy the first part of user declarations. */ -#line 20 "fmd_parser.y" /* yacc.c:339 */ +#line 16 "fmd_parser.y" /* yacc.c:339 */ #include "fmd_scanner.h" #include "common.h" @@ -101,7 +101,7 @@ struct flashmap_descriptor *res = NULL; extern int yydebug; #endif /* "%code requires" blocks. */ -#line 37 "fmd_parser.y" /* yacc.c:355 */ +#line 34 "fmd_parser.y" /* yacc.c:355 */ #include "fmd.h" #include "option.h" @@ -121,9 +121,9 @@ struct descriptor_list { extern struct flashmap_descriptor *res; -struct flashmap_descriptor *parse_descriptor(char *name, - struct unsigned_option offset, struct unsigned_option size, - struct descriptor_list children); +struct flashmap_descriptor *parse_descriptor( + char *name, union flashmap_flags flags, struct unsigned_option offset, + struct unsigned_option size, struct descriptor_list children); void yyerror(const char *s); #line 130 "y.tab.c" /* yacc.c:355 */ @@ -135,29 +135,34 @@ void yyerror(const char *s); { INTEGER = 258, OCTAL = 259, - STRING = 260 + STRING = 260, + FLAG_CBFS = 261 }; #endif /* Tokens. */ #define INTEGER 258 #define OCTAL 259 #define STRING 260 +#define FLAG_CBFS 261 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE YYSTYPE; + union YYSTYPE { -#line 29 "fmd_parser.y" /* yacc.c:355 */ +#line 25 "fmd_parser.y" /* yacc.c:355 */ unsigned intval; char *strval; struct unsigned_option maybe_intval; struct flashmap_descriptor *region_ptr; + union flashmap_flags flags; struct descriptor_list region_listhdr; -#line 160 "y.tab.c" /* yacc.c:355 */ +#line 163 "y.tab.c" /* yacc.c:355 */ }; + +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif @@ -171,7 +176,7 @@ int yyparse (void); /* Copy the second part of user declarations. */ -#line 175 "y.tab.c" /* yacc.c:358 */ +#line 180 "y.tab.c" /* yacc.c:358 */ #ifdef short # undef short @@ -416,18 +421,18 @@ union yyalloc #define YYLAST 17 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 11 +#define YYNTOKENS 12 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 13 +#define YYNNTS 14 /* YYNRULES -- Number of rules. */ -#define YYNRULES 18 +#define YYNRULES 20 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 28 +#define YYNSTATES 30 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 260 +#define YYMAXUTOK 261 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -440,15 +445,15 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 9, 2, 10, 2, 2, 2, 2, + 2, 2, 2, 10, 2, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -462,15 +467,16 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5 + 5, 6 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 80, 80, 85, 102, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 119, 123, 124, 125, 136 + 0, 79, 79, 85, 99, 106, 107, 108, 108, 109, + 110, 111, 112, 113, 114, 115, 117, 121, 122, 123, + 134 }; #endif @@ -479,11 +485,11 @@ static const yytype_uint8 yyrline[] = First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "$end", "error", "$undefined", "INTEGER", "OCTAL", "STRING", "'('", - "')'", "'@'", "'{'", "'}'", "$accept", "flash_chip", "flash_region", - "region_name", "region_annotation_opt", "region_annotation", - "region_offset_opt", "region_offset", "region_size_opt", "region_size", - "region_list_opt", "region_list", "region_list_entries", YY_NULLPTR + "$end", "error", "$undefined", "INTEGER", "OCTAL", "STRING", + "FLAG_CBFS", "'('", "')'", "'@'", "'{'", "'}'", "$accept", "flash_chip", + "flash_region", "region_name", "region_flags_opt", "region_flags", + "region_flag", "region_offset_opt", "region_offset", "region_size_opt", + "region_size", "region_list_opt", "region_list", "region_list_entries", YY_NULLPTR }; #endif @@ -492,15 +498,15 @@ static const char *const yytname[] = (internal) symbol number NUM (which must be that of a token). */ static const yytype_uint16 yytoknum[] = { - 0, 256, 257, 258, 259, 260, 40, 41, 64, 123, - 125 + 0, 256, 257, 258, 259, 260, 261, 40, 41, 64, + 123, 125 }; # endif -#define YYPACT_NINF -10 +#define YYPACT_NINF -12 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-10))) + (!!((Yystate) == (-12))) #define YYTABLE_NINF -1 @@ -511,9 +517,9 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int8 yypact[] = { - -4, -10, 2, -2, -10, 0, 1, -10, -10, -10, - -1, -4, -10, -10, 3, -5, 5, -2, -10, -10, - -10, 4, 1, -10, -1, -10, -10, -10 + -4, -12, 2, -6, -12, 1, 4, -12, -12, -12, + -2, -4, -12, -12, 3, -5, -1, -6, -12, -12, + -12, 5, -1, 4, -12, -12, -2, -12, -12, -12 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -521,23 +527,23 @@ static const yytype_int8 yypact[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 4, 0, 8, 1, 0, 0, 9, 10, 13, - 0, 0, 2, 17, 5, 0, 0, 8, 6, 16, - 18, 0, 11, 7, 14, 12, 3, 15 + 0, 4, 0, 10, 1, 0, 0, 11, 12, 15, + 0, 0, 2, 19, 5, 0, 0, 10, 18, 20, + 9, 0, 7, 13, 6, 8, 16, 14, 3, 17 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -10, -10, -8, 12, -10, -10, -3, -10, -10, -9, - -10, -7, -10 + -12, -12, -3, 9, -12, -11, -12, 0, -12, -12, + -9, -12, -10, -12 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { - -1, 2, 13, 14, 17, 18, 6, 7, 24, 10, - 26, 12, 15 + -1, 2, 13, 14, 17, 21, 22, 6, 7, 26, + 10, 28, 12, 15 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -545,37 +551,39 @@ static const yytype_int8 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint8 yytable[] = { - 1, 1, 4, 8, 9, 19, 5, 20, 11, 16, - 21, 23, 3, 25, 22, 0, 0, 27 + 1, 1, 4, 5, 8, 20, 18, 9, 11, 3, + 16, 25, 19, 24, 27, 0, 29, 23 }; static const yytype_int8 yycheck[] = { - 5, 5, 0, 3, 3, 10, 8, 15, 9, 6, - 5, 7, 0, 22, 17, -1, -1, 24 + 5, 5, 0, 9, 3, 6, 11, 3, 10, 0, + 7, 22, 15, 8, 23, -1, 26, 17 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 5, 12, 14, 0, 8, 17, 18, 3, 3, - 20, 9, 22, 13, 14, 23, 6, 15, 16, 10, - 13, 5, 17, 7, 19, 20, 21, 22 + 0, 5, 13, 15, 0, 9, 19, 20, 3, 3, + 22, 10, 24, 14, 15, 25, 7, 16, 11, 14, + 6, 17, 18, 19, 8, 17, 21, 22, 23, 24 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 11, 12, 13, 14, 15, 15, 16, 17, 17, - 18, 19, 19, 20, 21, 21, 22, 23, 23 + 0, 12, 13, 14, 15, 16, 16, 17, 17, 18, + 19, 19, 20, 21, 21, 22, 23, 23, 24, 25, + 25 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { - 0, 2, 4, 5, 1, 0, 1, 3, 0, 1, - 2, 0, 1, 1, 0, 1, 3, 1, 2 + 0, 2, 4, 5, 1, 0, 3, 1, 2, 1, + 0, 1, 2, 0, 1, 1, 0, 1, 3, 1, + 2 }; @@ -1252,98 +1260,108 @@ yyreduce: switch (yyn) { case 2: -#line 81 "fmd_parser.y" /* yacc.c:1646 */ +#line 80 "fmd_parser.y" /* yacc.c:1646 */ { - if (!(res = parse_descriptor((yyvsp[-3].strval), (yyvsp[-2].maybe_intval), (yyvsp[-1].maybe_intval), (yyvsp[0].region_listhdr)))) + union flashmap_flags flags = { .v=0 }; + if (!(res = parse_descriptor((yyvsp[-3].strval), flags, (yyvsp[-2].maybe_intval), (yyvsp[-1].maybe_intval), (yyvsp[0].region_listhdr)))) YYABORT; } -#line 1261 "y.tab.c" /* yacc.c:1646 */ +#line 1270 "y.tab.c" /* yacc.c:1646 */ break; case 3: #line 87 "fmd_parser.y" /* yacc.c:1646 */ { - struct flashmap_descriptor *node = parse_descriptor((yyvsp[-4].strval), (yyvsp[-2].maybe_intval), (yyvsp[-1].maybe_intval), (yyvsp[0].region_listhdr)); + struct flashmap_descriptor *node = parse_descriptor((yyvsp[-4].strval), (yyvsp[-3].flags), (yyvsp[-2].maybe_intval), (yyvsp[-1].maybe_intval), (yyvsp[0].region_listhdr)); if (!node) YYABORT; - char *annotation = (yyvsp[-3].strval); - if (annotation && !fmd_process_annotation_impl(node, annotation)) { - ERROR("Section '%s' has unexpected annotation '(%s)'\n", - node->name, annotation); + if (node->flags.f.cbfs && !fmd_process_flag_cbfs(node)) { + ERROR("Section '%s' cannot have flag 'CBFS''\n", node->name); YYABORT; } - free(annotation); (yyval.region_ptr) = node; } -#line 1281 "y.tab.c" /* yacc.c:1646 */ +#line 1287 "y.tab.c" /* yacc.c:1646 */ break; case 4: -#line 103 "fmd_parser.y" /* yacc.c:1646 */ +#line 100 "fmd_parser.y" /* yacc.c:1646 */ { if (!(yyvsp[0].strval)) { perror("E: While allocating section name"); YYABORT; } } -#line 1292 "y.tab.c" /* yacc.c:1646 */ +#line 1298 "y.tab.c" /* yacc.c:1646 */ break; case 5: -#line 109 "fmd_parser.y" /* yacc.c:1646 */ - { (yyval.strval) = NULL; } -#line 1298 "y.tab.c" /* yacc.c:1646 */ +#line 106 "fmd_parser.y" /* yacc.c:1646 */ + { (yyval.flags) = (union flashmap_flags){ .v=0 }; } +#line 1304 "y.tab.c" /* yacc.c:1646 */ break; - case 7: -#line 111 "fmd_parser.y" /* yacc.c:1646 */ - { (yyval.strval) = (yyvsp[-1].strval); } -#line 1304 "y.tab.c" /* yacc.c:1646 */ + case 6: +#line 107 "fmd_parser.y" /* yacc.c:1646 */ + { (yyval.flags) = (yyvsp[-1].flags); } +#line 1310 "y.tab.c" /* yacc.c:1646 */ break; case 8: -#line 112 "fmd_parser.y" /* yacc.c:1646 */ - { (yyval.maybe_intval) = (struct unsigned_option){false, 0}; } -#line 1310 "y.tab.c" /* yacc.c:1646 */ +#line 108 "fmd_parser.y" /* yacc.c:1646 */ + { (yyval.flags).v = (yyvsp[-1].flags).v | (yyvsp[0].flags).v; } +#line 1316 "y.tab.c" /* yacc.c:1646 */ + break; + + case 9: +#line 109 "fmd_parser.y" /* yacc.c:1646 */ + { (yyval.flags).v = 0; (yyval.flags).f.cbfs = 1; } +#line 1322 "y.tab.c" /* yacc.c:1646 */ break; case 10: -#line 114 "fmd_parser.y" /* yacc.c:1646 */ +#line 110 "fmd_parser.y" /* yacc.c:1646 */ + { (yyval.maybe_intval) = (struct unsigned_option){false, 0}; } +#line 1328 "y.tab.c" /* yacc.c:1646 */ + break; + + case 12: +#line 112 "fmd_parser.y" /* yacc.c:1646 */ { (yyval.maybe_intval) = (struct unsigned_option){true, (yyvsp[0].intval)}; } -#line 1316 "y.tab.c" /* yacc.c:1646 */ +#line 1334 "y.tab.c" /* yacc.c:1646 */ break; - case 11: -#line 115 "fmd_parser.y" /* yacc.c:1646 */ + case 13: +#line 113 "fmd_parser.y" /* yacc.c:1646 */ { (yyval.maybe_intval) = (struct unsigned_option){false, 0}; } -#line 1322 "y.tab.c" /* yacc.c:1646 */ +#line 1340 "y.tab.c" /* yacc.c:1646 */ break; - case 13: -#line 117 "fmd_parser.y" /* yacc.c:1646 */ + case 15: +#line 115 "fmd_parser.y" /* yacc.c:1646 */ { (yyval.maybe_intval) = (struct unsigned_option){true, (yyvsp[0].intval)}; } -#line 1328 "y.tab.c" /* yacc.c:1646 */ +#line 1346 "y.tab.c" /* yacc.c:1646 */ break; - case 14: -#line 119 "fmd_parser.y" /* yacc.c:1646 */ + case 16: +#line 117 "fmd_parser.y" /* yacc.c:1646 */ { (yyval.region_listhdr) = (struct descriptor_list) {.len = 0, .head = NULL, .tail = NULL}; } -#line 1337 "y.tab.c" /* yacc.c:1646 */ +#line 1355 "y.tab.c" /* yacc.c:1646 */ break; - case 16: -#line 124 "fmd_parser.y" /* yacc.c:1646 */ + case 18: +#line 122 "fmd_parser.y" /* yacc.c:1646 */ { (yyval.region_listhdr) = (yyvsp[-1].region_listhdr); } -#line 1343 "y.tab.c" /* yacc.c:1646 */ +#line 1361 "y.tab.c" /* yacc.c:1646 */ break; - case 17: -#line 126 "fmd_parser.y" /* yacc.c:1646 */ + case 19: +#line 124 "fmd_parser.y" /* yacc.c:1646 */ { struct descriptor_node *node = malloc(sizeof(*node)); if (!node) { @@ -1354,11 +1372,11 @@ yyreduce: node->next = NULL; (yyval.region_listhdr) = (struct descriptor_list){.len = 1, .head = node, .tail = node}; } -#line 1358 "y.tab.c" /* yacc.c:1646 */ +#line 1376 "y.tab.c" /* yacc.c:1646 */ break; - case 18: -#line 137 "fmd_parser.y" /* yacc.c:1646 */ + case 20: +#line 135 "fmd_parser.y" /* yacc.c:1646 */ { struct descriptor_node *node = malloc(sizeof(*node)); if (!node) { @@ -1372,11 +1390,11 @@ yyreduce: (yyval.region_listhdr) = (struct descriptor_list) {.len = (yyvsp[-1].region_listhdr).len + 1, .head = (yyvsp[-1].region_listhdr).head, .tail = node}; } -#line 1376 "y.tab.c" /* yacc.c:1646 */ +#line 1394 "y.tab.c" /* yacc.c:1646 */ break; -#line 1380 "y.tab.c" /* yacc.c:1646 */ +#line 1398 "y.tab.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -1604,12 +1622,12 @@ yyreturn: #endif return yyresult; } -#line 151 "fmd_parser.y" /* yacc.c:1906 */ +#line 149 "fmd_parser.y" /* yacc.c:1906 */ -struct flashmap_descriptor *parse_descriptor(char *name, - struct unsigned_option offset, struct unsigned_option size, - struct descriptor_list children) +struct flashmap_descriptor *parse_descriptor( + char *name, union flashmap_flags flags, struct unsigned_option offset, + struct unsigned_option size, struct descriptor_list children) { struct flashmap_descriptor *region = malloc(sizeof(*region)); if (!region) { @@ -1617,6 +1635,7 @@ struct flashmap_descriptor *parse_descriptor(char *name, return NULL; } region->name = name; + region->flags = flags; region->offset_known = offset.val_known; region->offset = offset.val; region->size_known = size.val_known; diff --git a/util/cbfstool/fmd_parser.h_shipped b/util/cbfstool/fmd_parser.h_shipped index dc6301d926..9863b893ed 100644 --- a/util/cbfstool/fmd_parser.h_shipped +++ b/util/cbfstool/fmd_parser.h_shipped @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ +/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, 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 @@ -40,7 +40,7 @@ extern int yydebug; #endif /* "%code requires" blocks. */ -#line 37 "fmd_parser.y" /* yacc.c:1909 */ +#line 34 "fmd_parser.y" /* yacc.c:1909 */ #include "fmd.h" #include "option.h" @@ -60,9 +60,9 @@ struct descriptor_list { extern struct flashmap_descriptor *res; -struct flashmap_descriptor *parse_descriptor(char *name, - struct unsigned_option offset, struct unsigned_option size, - struct descriptor_list children); +struct flashmap_descriptor *parse_descriptor( + char *name, union flashmap_flags flags, struct unsigned_option offset, + struct unsigned_option size, struct descriptor_list children); void yyerror(const char *s); #line 69 "y.tab.h" /* yacc.c:1909 */ @@ -74,29 +74,34 @@ void yyerror(const char *s); { INTEGER = 258, OCTAL = 259, - STRING = 260 + STRING = 260, + FLAG_CBFS = 261 }; #endif /* Tokens. */ #define INTEGER 258 #define OCTAL 259 #define STRING 260 +#define FLAG_CBFS 261 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE YYSTYPE; + union YYSTYPE { -#line 29 "fmd_parser.y" /* yacc.c:1909 */ +#line 25 "fmd_parser.y" /* yacc.c:1909 */ unsigned intval; char *strval; struct unsigned_option maybe_intval; struct flashmap_descriptor *region_ptr; + union flashmap_flags flags; struct descriptor_list region_listhdr; -#line 99 "y.tab.h" /* yacc.c:1909 */ +#line 102 "y.tab.h" /* yacc.c:1909 */ }; + +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif diff --git a/util/cbfstool/fmd_parser.y b/util/cbfstool/fmd_parser.y index a682dbc344..4ca418efea 100644 --- a/util/cbfstool/fmd_parser.y +++ b/util/cbfstool/fmd_parser.y @@ -27,6 +27,7 @@ struct flashmap_descriptor *res = NULL; char *strval; struct unsigned_option maybe_intval; struct flashmap_descriptor *region_ptr; + union flashmap_flags flags; struct descriptor_list region_listhdr; } @@ -49,20 +50,22 @@ struct descriptor_list { extern struct flashmap_descriptor *res; -struct flashmap_descriptor *parse_descriptor(char *name, - struct unsigned_option offset, struct unsigned_option size, - struct descriptor_list children); +struct flashmap_descriptor *parse_descriptor( + char *name, union flashmap_flags flags, struct unsigned_option offset, + struct unsigned_option size, struct descriptor_list children); void yyerror(const char *s); } %token INTEGER %token OCTAL %token STRING +%token FLAG_CBFS %type flash_region %type region_name -%type region_annotation_opt -%type region_annotation +%type region_flags_opt +%type region_flags +%type region_flag %type region_offset_opt %type region_offset %type region_size_opt @@ -75,23 +78,21 @@ void yyerror(const char *s); flash_chip: region_name region_offset_opt region_size region_list { - if (!(res = parse_descriptor($1, $2, $3, $4))) + union flashmap_flags flags = { .v=0 }; + if (!(res = parse_descriptor($1, flags, $2, $3, $4))) YYABORT; }; -flash_region: region_name region_annotation_opt region_offset_opt - region_size_opt region_list_opt +flash_region: region_name region_flags_opt region_offset_opt region_size_opt + region_list_opt { - struct flashmap_descriptor *node = parse_descriptor($1, $3, $4, $5); + struct flashmap_descriptor *node = parse_descriptor($1, $2, $3, $4, $5); if (!node) YYABORT; - char *annotation = $2; - if (annotation && !fmd_process_annotation_impl(node, annotation)) { - ERROR("Section '%s' has unexpected annotation '(%s)'\n", - node->name, annotation); + if (node->flags.f.cbfs && !fmd_process_flag_cbfs(node)) { + ERROR("Section '%s' cannot have flag 'CBFS''\n", node->name); YYABORT; } - free(annotation); $$ = node; }; @@ -102,9 +103,10 @@ region_name: STRING YYABORT; } }; -region_annotation_opt: { $$ = NULL; } - | region_annotation; -region_annotation: '(' STRING ')' { $$ = $2; }; +region_flags_opt: { $$ = (union flashmap_flags){ .v=0 }; } + | '(' region_flags ')' { $$ = $2; }; +region_flags: region_flag | region_flag region_flags { $$.v = $1.v | $2.v; }; +region_flag: FLAG_CBFS { $$.v = 0; $$.f.cbfs = 1; }; region_offset_opt: { $$ = (struct unsigned_option){false, 0}; } | region_offset; region_offset: '@' INTEGER { $$ = (struct unsigned_option){true, $2}; }; @@ -146,9 +148,9 @@ region_list_entries: flash_region %% -struct flashmap_descriptor *parse_descriptor(char *name, - struct unsigned_option offset, struct unsigned_option size, - struct descriptor_list children) +struct flashmap_descriptor *parse_descriptor( + char *name, union flashmap_flags flags, struct unsigned_option offset, + struct unsigned_option size, struct descriptor_list children) { struct flashmap_descriptor *region = malloc(sizeof(*region)); if (!region) { @@ -156,6 +158,7 @@ struct flashmap_descriptor *parse_descriptor(char *name, return NULL; } region->name = name; + region->flags = flags; region->offset_known = offset.val_known; region->offset = offset.val; region->size_known = size.val_known; diff --git a/util/cbfstool/fmd_scanner.c_shipped b/util/cbfstool/fmd_scanner.c_shipped index 61215cf17c..b1b78e2603 100644 --- a/util/cbfstool/fmd_scanner.c_shipped +++ b/util/cbfstool/fmd_scanner.c_shipped @@ -8,7 +8,7 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 0 +#define YY_FLEX_SUBMINOR_VERSION 1 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif @@ -87,25 +87,13 @@ typedef unsigned int flex_uint32_t; #endif /* ! FLEXINT_H */ -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST +/* TODO: this is always defined, so inline it */ #define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) #else -#define yyconst +#define yynoreturn #endif /* Returned upon end-of-file. */ @@ -166,7 +154,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE; typedef size_t yy_size_t; #endif -extern yy_size_t yyleng; +extern int yyleng; extern FILE *yyin, *yyout; @@ -205,7 +193,7 @@ struct yy_buffer_state /* Size of input buffer in bytes, not including room for EOB * characters. */ - yy_size_t yy_buf_size; + int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. @@ -233,7 +221,7 @@ struct yy_buffer_state int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -261,7 +249,7 @@ struct yy_buffer_state /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general @@ -281,10 +269,10 @@ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ -yy_size_t yyleng; +int yyleng; /* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; +static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ @@ -309,7 +297,7 @@ static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); @@ -346,7 +334,7 @@ void yyfree (void * ); typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; @@ -363,23 +351,20 @@ extern char *yytext; static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); -#if defined(__GNUC__) && __GNUC__ >= 3 -__attribute__((__noreturn__)) -#endif -static void yy_fatal_error (yyconst char msg[] ); +static void yynoreturn yy_fatal_error (yyconst char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ + yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 9 -#define YY_END_OF_BUFFER 10 +#define YY_NUM_RULES 12 +#define YY_END_OF_BUFFER 13 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -387,11 +372,12 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[24] = +static yyconst flex_int16_t yy_accept[32] = { 0, - 7, 7, 10, 7, 1, 1, 8, 8, 3, 4, - 7, 1, 0, 2, 5, 3, 7, 4, 4, 5, - 6, 6, 0 + 10, 10, 10, 10, 13, 10, 1, 1, 11, 3, + 11, 6, 7, 4, 10, 10, 1, 0, 2, 8, + 6, 10, 7, 7, 10, 8, 9, 10, 9, 5, + 0 } ; static yyconst YY_CHAR yy_ec[256] = @@ -400,16 +386,16 @@ static yyconst YY_CHAR yy_ec[256] = 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 5, - 5, 1, 1, 1, 1, 1, 1, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, - 1, 1, 1, 5, 8, 8, 8, 8, 8, 8, - 9, 1, 1, 1, 9, 1, 9, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, - 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, - - 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, - 1, 1, 5, 1, 5, 1, 1, 1, 1, 1, + 6, 1, 1, 1, 1, 1, 1, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 1, 1, 1, + 1, 1, 1, 9, 10, 11, 12, 10, 10, 13, + 14, 1, 1, 1, 14, 1, 14, 1, 1, 1, + 1, 1, 15, 1, 1, 1, 1, 16, 1, 1, + 1, 1, 1, 1, 1, 1, 10, 10, 10, 10, + + 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, + 1, 1, 9, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -426,41 +412,56 @@ static yyconst YY_CHAR yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst YY_CHAR yy_meta[11] = +static yyconst YY_CHAR yy_meta[17] = { 0, - 1, 2, 2, 3, 3, 1, 1, 1, 1, 1 + 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1 } ; -static yyconst flex_uint16_t yy_base[27] = +static yyconst flex_uint16_t yy_base[35] = { 0, - 0, 0, 33, 0, 0, 0, 20, 34, 10, 15, - 0, 0, 12, 34, 16, 0, 21, 0, 0, 0, - 5, 0, 34, 12, 10, 29 + 0, 0, 11, 12, 44, 0, 17, 19, 38, 77, + 77, 18, 28, 77, 29, 0, 25, 36, 77, 15, + 0, 42, 0, 0, 25, 0, 58, 22, 0, 0, + 77, 32, 74, 29 } ; -static yyconst flex_int16_t yy_def[27] = +static yyconst flex_int16_t yy_def[35] = { 0, - 23, 1, 23, 24, 25, 25, 26, 23, 23, 24, - 24, 25, 26, 23, 9, 24, 24, 10, 24, 24, - 17, 24, 0, 23, 23, 23 + 31, 1, 1, 1, 31, 32, 31, 31, 33, 31, + 31, 32, 32, 31, 32, 32, 31, 33, 31, 12, + 32, 34, 13, 32, 32, 32, 34, 32, 32, 32, + 0, 31, 31, 31 } ; -static yyconst flex_uint16_t yy_nxt[45] = +static yyconst flex_uint16_t yy_nxt[94] = { 0, - 4, 5, 6, 7, 8, 9, 10, 4, 4, 4, - 11, 12, 11, 22, 14, 15, 15, 11, 16, 17, - 18, 18, 14, 19, 20, 11, 21, 21, 21, 13, - 13, 13, 23, 3, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23 + 6, 7, 8, 9, 10, 11, 12, 13, 11, 6, + 6, 6, 6, 6, 6, 6, 14, 14, 17, 17, + 17, 17, 15, 15, 20, 20, 17, 17, 26, 27, + 16, 21, 16, 22, 23, 23, 30, 28, 19, 25, + 19, 24, 16, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 16, 16, 16, 16, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 29, 16, 16, 18, 18, 5, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31 + } ; -static yyconst flex_int16_t yy_chk[45] = +static yyconst flex_int16_t yy_chk[94] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 9, 25, 24, 21, 13, 9, 9, 9, 9, 9, - 10, 10, 7, 10, 15, 15, 17, 17, 17, 26, - 26, 26, 3, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23 + 1, 1, 1, 1, 1, 1, 3, 4, 7, 7, + 8, 8, 3, 4, 12, 12, 17, 17, 20, 34, + 20, 12, 32, 12, 13, 13, 28, 25, 18, 15, + 9, 13, 22, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 22, 22, 27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 27, 27, 27, 33, 33, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31 + } ; static yy_state_type yy_last_accepting_state; @@ -500,9 +501,11 @@ char *yytext; int parse_integer(char *src, int base); int copy_string(const char *src); -#line 504 "" + +#line 506 "" #define INITIAL 0 +#define FLAGS 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way @@ -539,7 +542,7 @@ FILE *yyget_out (void ); void yyset_out (FILE * _out_str ); -yy_size_t yyget_leng (void ); + int yyget_leng (void ); char *yyget_text (void ); @@ -598,7 +601,7 @@ static int input (void ); /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -622,7 +625,7 @@ static int input (void ); else \ { \ errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ @@ -718,10 +721,9 @@ YY_DECL } { -#line 30 "fmd_scanner.l" - +#line 31 "fmd_scanner.l" -#line 725 "" +#line 727 "" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -748,13 +750,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 24 ) + if ( yy_current_state >= 32 ) yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 34 ); + while ( yy_base[yy_current_state] != 77 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -793,39 +795,55 @@ YY_RULE_SETUP /* Eat comments. */ YY_BREAK case 3: -#line 35 "fmd_scanner.l" +YY_RULE_SETUP +#line 34 "fmd_scanner.l" +BEGIN(FLAGS); return *yytext; + YY_BREAK case 4: YY_RULE_SETUP #line 35 "fmd_scanner.l" -return parse_integer(yytext, 10); +BEGIN(INITIAL); return *yytext; YY_BREAK case 5: YY_RULE_SETUP #line 36 "fmd_scanner.l" -return OCTAL; +return FLAG_CBFS; YY_BREAK case 6: -YY_RULE_SETUP -#line 37 "fmd_scanner.l" -return parse_integer(yytext + 2, 16); - YY_BREAK +#line 38 "fmd_scanner.l" case 7: YY_RULE_SETUP #line 38 "fmd_scanner.l" -return copy_string(yytext); +return parse_integer(yytext, 10); YY_BREAK case 8: YY_RULE_SETUP #line 39 "fmd_scanner.l" -return *yytext; +return OCTAL; YY_BREAK case 9: YY_RULE_SETUP +#line 40 "fmd_scanner.l" +return parse_integer(yytext + 2, 16); + YY_BREAK +case 10: +YY_RULE_SETUP #line 41 "fmd_scanner.l" +return copy_string(yytext); + YY_BREAK +case 11: +YY_RULE_SETUP +#line 42 "fmd_scanner.l" +return *yytext; + YY_BREAK +case 12: +YY_RULE_SETUP +#line 44 "fmd_scanner.l" ECHO; YY_BREAK -#line 828 "" +#line 845 "" case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(FLAGS): yyterminate(); case YY_END_OF_BUFFER: @@ -969,7 +987,7 @@ static int yy_get_next_buffer (void) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); - yy_size_t number_to_move, i; + int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) @@ -998,7 +1016,7 @@ static int yy_get_next_buffer (void) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1; + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -1011,7 +1029,7 @@ static int yy_get_next_buffer (void) else { - yy_size_t num_to_read = + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) @@ -1025,7 +1043,7 @@ static int yy_get_next_buffer (void) if ( b->yy_is_our_buffer ) { - yy_size_t new_size = b->yy_buf_size * 2; + int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; @@ -1038,7 +1056,7 @@ static int yy_get_next_buffer (void) } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; + b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( @@ -1080,7 +1098,7 @@ static int yy_get_next_buffer (void) else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((int) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); @@ -1117,10 +1135,10 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 24 ) + if ( yy_current_state >= 32 ) yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; } return yy_current_state; @@ -1145,11 +1163,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 24 ) + if ( yy_current_state >= 32 ) yy_c = yy_meta[(unsigned int) yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 23); + yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; + yy_is_jam = (yy_current_state == 31); return yy_is_jam ? 0 : yy_current_state; } @@ -1168,7 +1186,7 @@ static int yy_get_next_buffer (void) if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ - yy_size_t number_to_move = (yy_n_chars) + 2; + int number_to_move = (yy_n_chars) + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = @@ -1180,7 +1198,7 @@ static int yy_get_next_buffer (void) yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); @@ -1219,7 +1237,7 @@ static int yy_get_next_buffer (void) else { /* need more input */ - yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + int offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) @@ -1243,7 +1261,7 @@ static int yy_get_next_buffer (void) case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) - return EOF; + return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; @@ -1491,7 +1509,7 @@ void yypop_buffer_state (void) */ static void yyensure_buffer_stack (void) { - yy_size_t num_to_alloc; + int num_to_alloc; if (!(yy_buffer_stack)) { @@ -1499,15 +1517,15 @@ static void yyensure_buffer_stack (void) * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - + (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; @@ -1536,7 +1554,7 @@ static void yyensure_buffer_stack (void) * @param base the character buffer * @param size the size in bytes of the character buffer * - * @return the newly allocated buffer state object. + * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { @@ -1546,7 +1564,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return 0; + return NULL; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) @@ -1555,7 +1573,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = 0; + b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; @@ -1578,7 +1596,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { - return yy_scan_bytes(yystr,strlen(yystr) ); + return yy_scan_bytes(yystr,(int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will @@ -1588,15 +1606,15 @@ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; - yy_size_t i; + int i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; + n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); @@ -1622,7 +1640,7 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len #define YY_EXIT_FAILURE 2 #endif -static void yy_fatal_error (yyconst char* msg ) +static void yynoreturn yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); @@ -1652,7 +1670,7 @@ static void yy_fatal_error (yyconst char* msg ) */ int yyget_lineno (void) { - + return yylineno; } @@ -1675,7 +1693,7 @@ FILE *yyget_out (void) /** Get the length of the current token. * */ -yy_size_t yyget_leng (void) +int yyget_leng (void) { return yyleng; } @@ -1731,10 +1749,10 @@ static int yy_init_globals (void) * This function is called from yylex_destroy(), so don't allocate here. */ - (yy_buffer_stack) = 0; + (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; + (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; @@ -1743,8 +1761,8 @@ static int yy_init_globals (void) yyin = stdin; yyout = stdout; #else - yyin = (FILE *) 0; - yyout = (FILE *) 0; + yyin = NULL; + yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by @@ -1802,7 +1820,7 @@ static int yy_flex_strlen (yyconst char * s ) void *yyalloc (yy_size_t size ) { - return (void *) malloc( size ); + return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) @@ -1815,7 +1833,7 @@ void *yyrealloc (void * ptr, yy_size_t size ) * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ - return (void *) realloc( (char *) ptr, size ); + return realloc(ptr, size); } void yyfree (void * ptr ) @@ -1825,7 +1843,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 41 "fmd_scanner.l" +#line 44 "fmd_scanner.l" diff --git a/util/cbfstool/fmd_scanner.h_shipped b/util/cbfstool/fmd_scanner.h_shipped index 0ac158d143..ff990c687f 100644 --- a/util/cbfstool/fmd_scanner.h_shipped +++ b/util/cbfstool/fmd_scanner.h_shipped @@ -11,7 +11,7 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 -#define YY_FLEX_SUBMINOR_VERSION 0 +#define YY_FLEX_SUBMINOR_VERSION 1 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif @@ -90,25 +90,13 @@ typedef unsigned int flex_uint32_t; #endif /* ! FLEXINT_H */ -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST +/* TODO: this is always defined, so inline it */ #define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) #else -#define yyconst +#define yynoreturn #endif /* Size of default input buffer. */ @@ -134,7 +122,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE; typedef size_t yy_size_t; #endif -extern yy_size_t yyleng; +extern int yyleng; extern FILE *yyin, *yyout; @@ -150,7 +138,7 @@ struct yy_buffer_state /* Size of input buffer in bytes, not including room for EOB * characters. */ - yy_size_t yy_buf_size; + int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. @@ -178,7 +166,7 @@ struct yy_buffer_state int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -199,7 +187,7 @@ void yypop_buffer_state (void ); YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); @@ -220,6 +208,7 @@ extern char *yytext; #ifdef YY_HEADER_EXPORT_START_CONDITIONS #define INITIAL 0 +#define FLAGS 1 #endif @@ -256,7 +245,7 @@ FILE *yyget_out (void ); void yyset_out (FILE * _out_str ); -yy_size_t yyget_leng (void ); + int yyget_leng (void ); char *yyget_text (void ); @@ -328,9 +317,9 @@ extern int yylex (void); #undef YY_DECL #endif -#line 41 "fmd_scanner.l" +#line 44 "fmd_scanner.l" -#line 335 "fmd_scanner.h_shipped" +#line 324 "fmd_scanner.h_shipped" #undef yyIN_HEADER #endif /* yyHEADER_H */ diff --git a/util/cbfstool/fmd_scanner.l b/util/cbfstool/fmd_scanner.l index 82969594a7..3e0f3133b1 100644 --- a/util/cbfstool/fmd_scanner.l +++ b/util/cbfstool/fmd_scanner.l @@ -24,13 +24,16 @@ int copy_string(const char *src); %} %option noyywrap +%s FLAGS MULTIPLIER [KMG] %% - [[:space:]]+ /* Eat whitespace. */ #.*$ /* Eat comments. */ +\( BEGIN(FLAGS); return *yytext; +\) BEGIN(INITIAL); return *yytext; +CBFS return FLAG_CBFS; 0{MULTIPLIER}? | [1-9][0-9]*{MULTIPLIER}? return parse_integer(yytext, 10); 0[0-9]+{MULTIPLIER}? return OCTAL; -- cgit v1.2.3