Denis 'GNUtoo' Carikli has uploaded this change for review. ( https://review.coreboot.org/27810
Change subject: util/bincfg: don't use sym_table shared variable ......................................................................
util/bincfg: don't use sym_table shared variable
Change-Id: I652a8da75498f871a53eb7509f6145c4842e3373 Signed-off-by: Denis 'GNUtoo' Carikli GNUtoo@no-log.org --- M util/bincfg/bincfg.h M util/bincfg/bincfg.y 2 files changed, 82 insertions(+), 60 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/10/27810/1
diff --git a/util/bincfg/bincfg.h b/util/bincfg/bincfg.h index b8c6688..8e2038a 100644 --- a/util/bincfg/bincfg.h +++ b/util/bincfg/bincfg.h @@ -27,6 +27,8 @@ unsigned int value; struct field *next; }; +typedef struct field* field_t; +typedef struct field** field_ptr_t;
/* Bit array intermediary representation */ struct blob { @@ -37,13 +39,12 @@ unsigned int lenactualblob; };
-static struct field *putsym (char const *, unsigned int); -static struct field *getsym (char const *); -static void yyerror (FILE* fp, char const *); -int yylex (void); +static field_t putsym(field_ptr_t sym_table_ptr, char const *, unsigned int); +static field_t getsym(field_ptr_t sym_table_ptr, char const *); +static void yyerror(FILE* fp, field_ptr_t, char const *); +int yylex(void);
static struct blob *binary; -static struct field *sym_table; -static struct field *sym_table_tail; +static field_t sym_table_tail;
#endif /* __BINCFG_H */ diff --git a/util/bincfg/bincfg.y b/util/bincfg/bincfg.y index 8be11e9..851d9f5 100644 --- a/util/bincfg/bincfg.y +++ b/util/bincfg/bincfg.y @@ -59,10 +59,12 @@ binary->bloblen += w; }
-static void set_bitfield(char *name, unsigned int value) +static void set_bitfield(field_ptr_t sym_table_ptr, char *name, + unsigned int value) { unsigned long long i; - struct field *bf = getsym (name); + + struct field *bf = getsym(sym_table_ptr, name); if (bf) { bf->value = value & 0xffffffff; i = (1 << bf->width) - 1; @@ -78,28 +80,30 @@ } }
-static void set_bitfield_array(char *name, unsigned int n, unsigned int value) +static void set_bitfield_array(field_ptr_t sym_table_ptr, char *name, + unsigned int n, unsigned int value) { unsigned int i; unsigned long len = strlen (name); char *namen = (char *) malloc ((len + 9) * sizeof (char)); + check_pointer(namen); for (i = 0; i < n; i++) { snprintf (namen, len + 8, "%s%x", name, i); - set_bitfield (namen, value); + set_bitfield (sym_table_ptr, namen, value); } free(namen); }
-static void create_new_bitfield(char *name, unsigned int width) +static void create_new_bitfield(field_ptr_t sym_table_ptr, char *name, unsigned int width) { struct field *bf;
- if (!(bf = putsym (name, width))) return; + if (!(bf = putsym (sym_table_ptr, name, width))) return; //fprintf(stderr, "Added bitfield `%s` : %d\n", bf->name, width); }
-static void create_new_bitfields(char *name, unsigned int n, unsigned int width) +static void create_new_bitfields(field_ptr_t sym_table_ptr, char *name, unsigned int n, unsigned int width) { unsigned int i; unsigned long len = strlen (name); @@ -107,51 +111,56 @@ check_pointer(namen); for (i = 0; i < n; i++) { snprintf (namen, len + 8, "%s%x", name, i); - create_new_bitfield (namen, width); + create_new_bitfield (sym_table_ptr, namen, width); } free(namen); }
-static struct field *putsym (char const *sym_name, unsigned int w) +static field_t putsym (field_ptr_t sym_table_ptr, char const *sym_name, + unsigned int w) { - if (getsym(sym_name)) { + if (getsym(sym_table_ptr, sym_name)) { fprintf(stderr, "Cannot add duplicate named bitfield `%s`\n", sym_name); return 0; } - struct field *ptr = (struct field *) malloc (sizeof (struct field)); + field_t ptr = (field_t ) malloc (sizeof (struct field)); check_pointer(ptr); ptr->name = (char *) malloc (strlen (sym_name) + 1); check_pointer(ptr->name); strcpy (ptr->name, sym_name); ptr->width = w; ptr->value = 0; - ptr->next = (struct field *)0; + ptr->next = (field_t)0; if (sym_table_tail) { sym_table_tail->next = ptr; } else { - sym_table = ptr; + *sym_table_ptr = ptr; } sym_table_tail = ptr; return ptr; }
-static struct field *getsym (char const *sym_name) +static field_t getsym (field_ptr_t sym_table_ptr, char const *sym_name) { - struct field *ptr; - for (ptr = sym_table; ptr != (struct field *) 0; - ptr = (struct field *)ptr->next) { + field_t ptr; + field_t sym_table = *sym_table_ptr; + + for (ptr = sym_table; ptr != (field_t ) 0; + ptr = (field_t )ptr->next) { if (strcmp (ptr->name, sym_name) == 0) return ptr; } return 0; }
-static void dump_all_values (void) +static void dump_all_values (field_ptr_t sym_table_ptr) { - struct field *ptr; - for (ptr = sym_table; ptr != (struct field *) 0; - ptr = (struct field *)ptr->next) { + field_t ptr; + field_t sym_table = *sym_table_ptr; + + for (ptr = sym_table; ptr != (field_t ) 0; + ptr = (field_t )ptr->next) { fprintf(stderr, "%s = %d (%d bits)\n", ptr->name, ptr->value, @@ -159,17 +168,19 @@ } }
-static void empty_field_table(void) +static void empty_field_table(field_ptr_t sym_table_ptr) { - struct field *ptr; - struct field *ptrnext; + field_t ptr; + field_t ptrnext;
- for (ptr = sym_table; ptr != (struct field *) 0; ptr = ptrnext) { + field_t sym_table = *sym_table_ptr; + + for (ptr = sym_table; ptr != (field_t ) 0; ptr = ptrnext) { if (ptr) { ptrnext = ptr->next; free(ptr); } else { - ptrnext = (struct field *) 0; + ptrnext = (field_t ) 0; } } sym_table = 0; @@ -190,7 +201,7 @@ binary->blb[0] = VALID_BIT; }
-static void interpret_next_blob_value (struct field *f) +static void interpret_next_blob_value (field_t f) { unsigned int i; unsigned int v = 0; @@ -208,10 +219,12 @@ }
/* {}%BIN -> {} */ -static void generate_setter_bitfields(FILE* fp, unsigned char *bin) +static void generate_setter_bitfields(FILE* fp, field_ptr_t sym_table_ptr, + unsigned char *bin) { unsigned int i; - struct field *ptr; + field_t ptr; + field_t sym_table = *sym_table_ptr;
/* Convert bytes to bit array */ for (i = 0; i < binary->lenactualblob; i++) { @@ -224,7 +237,7 @@ fprintf (fp, "# AUTOGENERATED SETTER BY BINCFG\n{\n");
/* Traverse spec and output bitfield setters based on blob values */ - for (ptr = sym_table; ptr != (struct field *) 0; ptr = ptr->next) { + for (ptr = sym_table; ptr != (field_t ) 0; ptr = ptr->next) {
interpret_next_blob_value(ptr); fprintf (fp, "\t"%s" = 0x%x,\n", ptr->name, ptr->value); @@ -233,15 +246,18 @@ fprintf (fp, "\n}\n"); }
-static void generate_binary_with_gbe_checksum(FILE* fp) +static void generate_binary_with_gbe_checksum(FILE* fp, + field_ptr_t sym_table_ptr) { int i; unsigned short checksum;
+ field_t sym_table = *sym_table_ptr; + /* traverse spec, push to blob and add up for checksum */ - struct field *ptr; + field_t ptr; unsigned int uptochksum = 0; - for (ptr = sym_table; ptr != (struct field *) 0; ptr = ptr->next) { + for (ptr = sym_table; ptr != (field_t ) 0; ptr = ptr->next) { if (strcmp (ptr->name, "checksum_gbe") == 0) { /* Stop traversing because we hit checksum */ ptr = ptr->next; @@ -277,14 +293,14 @@ checksum = (0xbaba - binary->checksum) & 0xffff;
/* Now write checksum */ - set_bitfield ("checksum_gbe", checksum); + set_bitfield (sym_table_ptr, "checksum_gbe", checksum);
fprintf(fp, "%c", checksum & 0xff); fprintf(fp, "%c", (checksum & 0xff00) >> 8);
append_field_to_blob (value_to_bits(checksum, 16), 16);
- for (; ptr != (struct field *) 0; ptr = ptr->next) { + for (; ptr != (field_t ) 0; ptr = ptr->next) { append_field_to_blob ( value_to_bits(ptr->value, ptr->width), ptr->width); } @@ -305,10 +321,11 @@ }
/* {}{} -> BIN */ -static void generate_binary(FILE* fp) +static void generate_binary(FILE* fp, field_ptr_t sym_table_ptr) { unsigned int i; - struct field *ptr; + field_t ptr; + field_t sym_table = *sym_table_ptr;
if (binary->bloblen % 8) { fprintf (stderr, @@ -316,13 +333,13 @@ exit (1); }
- if (getsym ("checksum_gbe")) { - generate_binary_with_gbe_checksum(fp); + if (getsym (sym_table_ptr, "checksum_gbe")) { + generate_binary_with_gbe_checksum(fp, sym_table_ptr); return; }
/* traverse spec, push to blob */ - for (ptr = sym_table; ptr != (struct field *) 0; ptr = ptr->next) { + for (ptr = sym_table; ptr != (field_t ) 0; ptr = ptr->next) { append_field_to_blob ( value_to_bits(ptr->value, ptr->width), ptr->width); @@ -353,7 +370,7 @@ unsigned char u8; unsigned char *u8array; } -%parse-param {FILE* fp} +%parse-param {FILE* fp} {struct field** sym_table_ptr}
%token <str> name %token <u32> val @@ -372,13 +389,13 @@
input: /* empty */ -| input spec setter eof { empty_field_table(); YYACCEPT;} +| input spec setter eof { empty_field_table(sym_table_ptr); YYACCEPT;} | input spec blob { fprintf (stderr, "Parsed all bytes\n"); - empty_field_table(); YYACCEPT;} + empty_field_table(sym_table_ptr); YYACCEPT;} ;
blob: - '%' eof { generate_setter_bitfields(fp, + '%' eof { generate_setter_bitfields(fp, sym_table_ptr, binary->actualblob); } ;
@@ -394,14 +411,15 @@ ;
specpair: - name ':' val { create_new_bitfield($1, $3); } -| name '[' val ']' ':' val { create_new_bitfields($1, $3, $6); } + name ':' val { create_new_bitfield(sym_table_ptr, $1, $3); } +| name '[' val ']' ':' val { create_new_bitfields(sym_table_ptr, $1, $3, + $6); } ;
setter: '{' '}' { fprintf (stderr, "No values\n"); } | '{' valuemembers '}' { fprintf (stderr, "Parsed all values\n"); - generate_binary(fp); } + generate_binary(fp, sym_table_ptr); } ;
valuemembers: @@ -410,14 +428,15 @@ ;
setpair: - name '=' val { set_bitfield($1, $3); } -| name '[' val ']' '=' val { set_bitfield_array($1, $3, $6); } +name '=' val { set_bitfield(sym_table_ptr, $1, $3); } +| name '[' val ']' '=' val { set_bitfield_array(sym_table_ptr, $1, $3, + $6); } ;
%%
/* Called by yyparse on error. */ -static void yyerror (FILE* fp, char const *s) +static void yyerror (FILE* fp, field_ptr_t sym_table_ptr, char const *s) { fprintf (stderr, "yyerror: %s\n", s); } @@ -426,9 +445,10 @@ void set_input_string(char* in);
/* This function parses a string */ -static int parse_string(FILE* fp, unsigned char* in) { +static int parse_string(FILE* fp, field_ptr_t sym_table_ptr, unsigned char* in) +{ set_input_string ((char *)in); - return yyparse (fp); + return yyparse (fp, sym_table_ptr); }
static unsigned int loadfile (FILE* fp, char *file, char *filetype, @@ -464,6 +484,7 @@ unsigned int pos = 0; int ret = 0; FILE* fp; + field_t sym_table;
#if YYDEBUG == 1 yydebug = 1; @@ -484,7 +505,7 @@ argv[3]); exit(1); } - ret = parse_string(fp, parsestring); + ret = parse_string(fp, &sym_table, parsestring); free(parsestring); } else if (argc == 5 && strcmp (argv[1], "-d") == 0) { /* Decompile mode */ @@ -516,7 +537,7 @@ argv[4]); exit(1); } - ret = parse_string(fp, parsestring); + ret = parse_string(fp, &sym_table, parsestring); free(parsestring); free(binary->actualblob); fclose(fp);