util/blobtool: Update blobtool.y
- Refactor the spec & setter file reads into a separate function. - Make sure files can actually be opened before reading from them. - Check all malloced variables. - Set functions with no declatations as static. - Update blobtool.tab.c_shipped to the latest version. Change-Id: Ie97fff84493a06f48d8673d388c3882028d048ca Signed-off-by: Martin Roth <martinroth@google.com> Reviewed-on: https://review.coreboot.org/19231 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
@ -103,13 +103,22 @@ struct blob {
|
|||||||
|
|
||||||
struct blob *binary;
|
struct blob *binary;
|
||||||
|
|
||||||
unsigned char* value_to_bits (unsigned int v, unsigned int w)
|
static void check_pointer (void *ptr)
|
||||||
|
{
|
||||||
|
if (ptr == NULL) {
|
||||||
|
printf("Error: Out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char* value_to_bits (unsigned int v, unsigned int w)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned char* bitarr;
|
unsigned char* bitarr;
|
||||||
|
|
||||||
if (w > MAX_WIDTH) w = MAX_WIDTH;
|
if (w > MAX_WIDTH) w = MAX_WIDTH;
|
||||||
bitarr = (unsigned char *) malloc (w * sizeof (unsigned char));
|
bitarr = (unsigned char *) malloc (w * sizeof (unsigned char));
|
||||||
|
check_pointer(bitarr);
|
||||||
memset (bitarr, 0, w);
|
memset (bitarr, 0, w);
|
||||||
|
|
||||||
for (i = 0; i < w; i++) {
|
for (i = 0; i < w; i++) {
|
||||||
@ -119,10 +128,11 @@ unsigned char* value_to_bits (unsigned int v, unsigned int w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Store each bit of a bitfield in a new byte sequentially 0x80 or 0x81 */
|
/* Store each bit of a bitfield in a new byte sequentially 0x80 or 0x81 */
|
||||||
void append_field_to_blob (unsigned char b[], unsigned int w)
|
static void append_field_to_blob (unsigned char b[], unsigned int w)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
binary->blb = (unsigned char *) realloc (binary->blb, binary->bloblen + w);
|
binary->blb = (unsigned char *) realloc (binary->blb, binary->bloblen + w);
|
||||||
|
check_pointer(binary->blb);
|
||||||
for (j = 0, i = binary->bloblen; i < binary->bloblen + w; i++, j++) {
|
for (j = 0, i = binary->bloblen; i < binary->bloblen + w; i++, j++) {
|
||||||
binary->blb[i] = VALID_BIT | (b[j] & 1);
|
binary->blb[i] = VALID_BIT | (b[j] & 1);
|
||||||
//fprintf (stderr, "blob[%d] = %d\n", i, binary->blb[i] & 1);
|
//fprintf (stderr, "blob[%d] = %d\n", i, binary->blb[i] & 1);
|
||||||
@ -130,7 +140,7 @@ void append_field_to_blob (unsigned char b[], unsigned int w)
|
|||||||
binary->bloblen += w;
|
binary->bloblen += w;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_bitfield(char *name, unsigned int value)
|
static void set_bitfield(char *name, unsigned int value)
|
||||||
{
|
{
|
||||||
unsigned long long i;
|
unsigned long long i;
|
||||||
struct field *bf = getsym (name);
|
struct field *bf = getsym (name);
|
||||||
@ -147,11 +157,12 @@ void set_bitfield(char *name, unsigned int value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_bitfield_array(char *name, unsigned int n, unsigned int value)
|
static void set_bitfield_array(char *name, unsigned int n, unsigned int value)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int len = strlen (name);
|
unsigned long len = strlen (name);
|
||||||
char *namen = (char *) malloc ((len + 9) * sizeof (char));
|
char *namen = (char *) malloc ((len + 9) * sizeof (char));
|
||||||
|
check_pointer(namen);
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
snprintf (namen, len + 8, "%s%x", name, i);
|
snprintf (namen, len + 8, "%s%x", name, i);
|
||||||
set_bitfield (namen, value);
|
set_bitfield (namen, value);
|
||||||
@ -159,7 +170,7 @@ void set_bitfield_array(char *name, unsigned int n, unsigned int value)
|
|||||||
free(namen);
|
free(namen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_new_bitfield(char *name, unsigned int width)
|
static void create_new_bitfield(char *name, unsigned int width)
|
||||||
{
|
{
|
||||||
struct field *bf;
|
struct field *bf;
|
||||||
|
|
||||||
@ -167,11 +178,12 @@ void create_new_bitfield(char *name, unsigned int width)
|
|||||||
//fprintf(stderr, "Added bitfield `%s` : %d\n", bf->name, width);
|
//fprintf(stderr, "Added bitfield `%s` : %d\n", bf->name, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_new_bitfields(char *name, unsigned int n, unsigned int width)
|
static void create_new_bitfields(char *name, unsigned int n, unsigned int width)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int len = strlen (name);
|
unsigned long len = strlen (name);
|
||||||
char *namen = (char *) malloc ((len + 9) * sizeof (char));
|
char *namen = (char *) malloc ((len + 9) * sizeof (char));
|
||||||
|
check_pointer(namen);
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
snprintf (namen, len + 8, "%s%x", name, i);
|
snprintf (namen, len + 8, "%s%x", name, i);
|
||||||
create_new_bitfield (namen, width);
|
create_new_bitfield (namen, width);
|
||||||
@ -186,7 +198,9 @@ struct field *putsym (char const *sym_name, unsigned int w)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
struct field *ptr = (struct field *) malloc (sizeof (struct field));
|
struct field *ptr = (struct field *) malloc (sizeof (struct field));
|
||||||
|
check_pointer(ptr);
|
||||||
ptr->name = (char *) malloc (strlen (sym_name) + 1);
|
ptr->name = (char *) malloc (strlen (sym_name) + 1);
|
||||||
|
check_pointer(ptr->name);
|
||||||
strcpy (ptr->name, sym_name);
|
strcpy (ptr->name, sym_name);
|
||||||
ptr->width = w;
|
ptr->width = w;
|
||||||
ptr->value = 0;
|
ptr->value = 0;
|
||||||
@ -211,7 +225,7 @@ struct field *getsym (char const *sym_name)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_all_values (void)
|
static void dump_all_values (void)
|
||||||
{
|
{
|
||||||
struct field *ptr;
|
struct field *ptr;
|
||||||
for (ptr = sym_table; ptr != (struct field *) 0;
|
for (ptr = sym_table; ptr != (struct field *) 0;
|
||||||
@ -223,7 +237,7 @@ void dump_all_values (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void empty_field_table(void)
|
static void empty_field_table(void)
|
||||||
{
|
{
|
||||||
struct field *ptr;
|
struct field *ptr;
|
||||||
struct field *ptrnext;
|
struct field *ptrnext;
|
||||||
@ -240,21 +254,23 @@ void empty_field_table(void)
|
|||||||
sym_table_tail = 0;
|
sym_table_tail = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_binary_blob (void)
|
static void create_binary_blob (void)
|
||||||
{
|
{
|
||||||
if (binary && binary->blb) {
|
if (binary && binary->blb) {
|
||||||
free(binary->blb);
|
free(binary->blb);
|
||||||
free(binary);
|
free(binary);
|
||||||
}
|
}
|
||||||
binary = (struct blob *) malloc (sizeof (struct blob));
|
binary = (struct blob *) malloc (sizeof (struct blob));
|
||||||
|
check_pointer(binary);
|
||||||
binary->blb = (unsigned char *) malloc (sizeof (unsigned char));
|
binary->blb = (unsigned char *) malloc (sizeof (unsigned char));
|
||||||
|
check_pointer(binary->blb);
|
||||||
binary->bloblen = 0;
|
binary->bloblen = 0;
|
||||||
binary->blb[0] = VALID_BIT;
|
binary->blb[0] = VALID_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void interpret_next_blob_value (struct field *f)
|
static void interpret_next_blob_value (struct field *f)
|
||||||
{
|
{
|
||||||
int i;
|
unsigned int i;
|
||||||
unsigned int v = 0;
|
unsigned int v = 0;
|
||||||
|
|
||||||
if (binary->bloblen >= binary->lenactualblob * 8) {
|
if (binary->bloblen >= binary->lenactualblob * 8) {
|
||||||
@ -270,7 +286,7 @@ void interpret_next_blob_value (struct field *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* {}%BIN -> {} */
|
/* {}%BIN -> {} */
|
||||||
void generate_setter_bitfields(unsigned char *bin)
|
static void generate_setter_bitfields(unsigned char *bin)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct field *ptr;
|
struct field *ptr;
|
||||||
@ -295,7 +311,7 @@ void generate_setter_bitfields(unsigned char *bin)
|
|||||||
fprintf (fp, "\n}\n");
|
fprintf (fp, "\n}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void generate_binary_with_gbe_checksum(void)
|
static void generate_binary_with_gbe_checksum(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned short checksum;
|
unsigned short checksum;
|
||||||
@ -367,7 +383,7 @@ void generate_binary_with_gbe_checksum(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* {}{} -> BIN */
|
/* {}{} -> BIN */
|
||||||
void generate_binary(void)
|
static void generate_binary(void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct field *ptr;
|
struct field *ptr;
|
||||||
@ -775,8 +791,8 @@ static const yytype_uint8 yytranslate[] =
|
|||||||
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
|
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
|
||||||
static const yytype_uint16 yyrline[] =
|
static const yytype_uint16 yyrline[] =
|
||||||
{
|
{
|
||||||
0, 383, 383, 385, 386, 391, 395, 396, 401, 402,
|
0, 399, 399, 401, 402, 407, 411, 412, 417, 418,
|
||||||
406, 407, 411, 412, 417, 418, 422, 423
|
422, 423, 427, 428, 433, 434, 438, 439
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1872,14 +1888,39 @@ void yyerror (char const *s)
|
|||||||
void set_input_string(char* in);
|
void set_input_string(char* in);
|
||||||
|
|
||||||
/* This function parses a string */
|
/* This function parses a string */
|
||||||
int parse_string(unsigned char* in) {
|
static int parse_string(unsigned char* in) {
|
||||||
set_input_string ((char *)in);
|
set_input_string ((char *)in);
|
||||||
return yyparse ();
|
return yyparse ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int loadfile (char *file, char *filetype,
|
||||||
|
unsigned char **parsestring, unsigned int lenstr)
|
||||||
|
{
|
||||||
|
unsigned int lenfile;
|
||||||
|
|
||||||
|
if ((fp = fopen(file, "r")) == NULL) {
|
||||||
|
printf("Error: Could not open %s file: %s\n",filetype,file);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
lenfile = ftell(fp);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
|
if (lenstr == 0)
|
||||||
|
*parsestring = (unsigned char *) malloc (lenfile + 2);
|
||||||
|
else
|
||||||
|
*parsestring = (unsigned char *) realloc (*parsestring,
|
||||||
|
lenfile + lenstr);
|
||||||
|
|
||||||
|
check_pointer(*parsestring);
|
||||||
|
fread(*parsestring + lenstr, 1, lenfile, fp);
|
||||||
|
fclose(fp);
|
||||||
|
return lenfile;
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char *argv[])
|
int main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
unsigned int lenspec, lensetter;
|
unsigned int lenspec;
|
||||||
unsigned char *parsestring;
|
unsigned char *parsestring;
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
unsigned int pos = 0;
|
unsigned int pos = 0;
|
||||||
@ -1895,70 +1936,43 @@ int main (int argc, char *argv[])
|
|||||||
/* Compile mode */
|
/* Compile mode */
|
||||||
|
|
||||||
/* Load Spec */
|
/* Load Spec */
|
||||||
fp = fopen(argv[1], "r");
|
lenspec = loadfile(argv[1], "spec", &parsestring, 0);
|
||||||
fseek(fp, 0, SEEK_END);
|
loadfile(argv[2], "setter", &parsestring, lenspec);
|
||||||
lenspec = ftell(fp);
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
parsestring = (unsigned char *) malloc (lenspec);
|
|
||||||
if (!parsestring) {
|
|
||||||
printf("Out of memory\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fread(parsestring, 1, lenspec, fp);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
/* Load Setter */
|
|
||||||
fp = fopen(argv[2], "r");
|
|
||||||
fseek(fp, 0, SEEK_END);
|
|
||||||
lensetter = ftell(fp);
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
parsestring = (unsigned char *) realloc (parsestring,
|
|
||||||
lenspec + lensetter);
|
|
||||||
if (!parsestring) {
|
|
||||||
printf("Out of memory\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fread(parsestring + lenspec, 1, lensetter, fp);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
/* Open output and parse string - output to fp */
|
/* Open output and parse string - output to fp */
|
||||||
fp = fopen(argv[3], "wb");
|
if ((fp = fopen(argv[3], "wb")) == NULL) {
|
||||||
|
printf("Error: Could not open output file: %s\n",argv[3]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
ret = parse_string(parsestring);
|
ret = parse_string(parsestring);
|
||||||
free(parsestring);
|
free(parsestring);
|
||||||
} else if (argc == 5 && strcmp (argv[1], "-d") == 0) {
|
} else if (argc == 5 && strcmp (argv[1], "-d") == 0) {
|
||||||
/* Decompile mode */
|
/* Decompile mode */
|
||||||
|
|
||||||
/* Load Spec */
|
/* Load Spec */
|
||||||
fp = fopen(argv[2], "r");
|
lenspec = loadfile(argv[2], "spec", &parsestring, 0);
|
||||||
fseek(fp, 0, SEEK_END);
|
|
||||||
lenspec = ftell(fp);
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
parsestring = (unsigned char *) malloc (lenspec + 1);
|
|
||||||
fread(parsestring, 1, lenspec, fp);
|
|
||||||
if (!parsestring) {
|
|
||||||
printf("Out of memory\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
/* Add binary read trigger token */
|
|
||||||
parsestring[lenspec] = '%';
|
parsestring[lenspec] = '%';
|
||||||
|
parsestring[lenspec + 1] = '\0';
|
||||||
|
|
||||||
/* Load Actual Binary */
|
/* Load Actual Binary */
|
||||||
fp = fopen(argv[3], "rb");
|
if ((fp = fopen(argv[3], "rb")) == NULL) {
|
||||||
|
printf("Error: Could not open binary file: %s\n",argv[3]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
fseek(fp, 0, SEEK_END);
|
fseek(fp, 0, SEEK_END);
|
||||||
binary->lenactualblob = ftell(fp);
|
binary->lenactualblob = ftell(fp);
|
||||||
fseek(fp, 0, SEEK_SET);
|
fseek(fp, 0, SEEK_SET);
|
||||||
binary->actualblob = (unsigned char *) malloc (binary->lenactualblob);
|
binary->actualblob = (unsigned char *) malloc (binary->lenactualblob);
|
||||||
if (!binary->actualblob) {
|
check_pointer(binary->actualblob);
|
||||||
printf("Out of memory\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fread(binary->actualblob, 1, binary->lenactualblob, fp);
|
fread(binary->actualblob, 1, binary->lenactualblob, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
/* Open output and parse - output to fp */
|
/* Open output and parse - output to fp */
|
||||||
fp = fopen(argv[4], "w");
|
if ((fp = fopen(argv[4], "w")) == NULL) {
|
||||||
|
printf("Error: Could not open output file: %s\n",argv[4]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
ret = parse_string(parsestring);
|
ret = parse_string(parsestring);
|
||||||
free(parsestring);
|
free(parsestring);
|
||||||
free(binary->actualblob);
|
free(binary->actualblob);
|
||||||
|
@ -53,13 +53,22 @@ struct blob {
|
|||||||
|
|
||||||
struct blob *binary;
|
struct blob *binary;
|
||||||
|
|
||||||
unsigned char* value_to_bits (unsigned int v, unsigned int w)
|
static void check_pointer (void *ptr)
|
||||||
|
{
|
||||||
|
if (ptr == NULL) {
|
||||||
|
printf("Error: Out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char* value_to_bits (unsigned int v, unsigned int w)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned char* bitarr;
|
unsigned char* bitarr;
|
||||||
|
|
||||||
if (w > MAX_WIDTH) w = MAX_WIDTH;
|
if (w > MAX_WIDTH) w = MAX_WIDTH;
|
||||||
bitarr = (unsigned char *) malloc (w * sizeof (unsigned char));
|
bitarr = (unsigned char *) malloc (w * sizeof (unsigned char));
|
||||||
|
check_pointer(bitarr);
|
||||||
memset (bitarr, 0, w);
|
memset (bitarr, 0, w);
|
||||||
|
|
||||||
for (i = 0; i < w; i++) {
|
for (i = 0; i < w; i++) {
|
||||||
@ -69,10 +78,11 @@ unsigned char* value_to_bits (unsigned int v, unsigned int w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Store each bit of a bitfield in a new byte sequentially 0x80 or 0x81 */
|
/* Store each bit of a bitfield in a new byte sequentially 0x80 or 0x81 */
|
||||||
void append_field_to_blob (unsigned char b[], unsigned int w)
|
static void append_field_to_blob (unsigned char b[], unsigned int w)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
binary->blb = (unsigned char *) realloc (binary->blb, binary->bloblen + w);
|
binary->blb = (unsigned char *) realloc (binary->blb, binary->bloblen + w);
|
||||||
|
check_pointer(binary->blb);
|
||||||
for (j = 0, i = binary->bloblen; i < binary->bloblen + w; i++, j++) {
|
for (j = 0, i = binary->bloblen; i < binary->bloblen + w; i++, j++) {
|
||||||
binary->blb[i] = VALID_BIT | (b[j] & 1);
|
binary->blb[i] = VALID_BIT | (b[j] & 1);
|
||||||
//fprintf (stderr, "blob[%d] = %d\n", i, binary->blb[i] & 1);
|
//fprintf (stderr, "blob[%d] = %d\n", i, binary->blb[i] & 1);
|
||||||
@ -80,7 +90,7 @@ void append_field_to_blob (unsigned char b[], unsigned int w)
|
|||||||
binary->bloblen += w;
|
binary->bloblen += w;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_bitfield(char *name, unsigned int value)
|
static void set_bitfield(char *name, unsigned int value)
|
||||||
{
|
{
|
||||||
unsigned long long i;
|
unsigned long long i;
|
||||||
struct field *bf = getsym (name);
|
struct field *bf = getsym (name);
|
||||||
@ -97,11 +107,12 @@ void set_bitfield(char *name, unsigned int value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_bitfield_array(char *name, unsigned int n, unsigned int value)
|
static void set_bitfield_array(char *name, unsigned int n, unsigned int value)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int len = strlen (name);
|
unsigned long len = strlen (name);
|
||||||
char *namen = (char *) malloc ((len + 9) * sizeof (char));
|
char *namen = (char *) malloc ((len + 9) * sizeof (char));
|
||||||
|
check_pointer(namen);
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
snprintf (namen, len + 8, "%s%x", name, i);
|
snprintf (namen, len + 8, "%s%x", name, i);
|
||||||
set_bitfield (namen, value);
|
set_bitfield (namen, value);
|
||||||
@ -109,7 +120,7 @@ void set_bitfield_array(char *name, unsigned int n, unsigned int value)
|
|||||||
free(namen);
|
free(namen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_new_bitfield(char *name, unsigned int width)
|
static void create_new_bitfield(char *name, unsigned int width)
|
||||||
{
|
{
|
||||||
struct field *bf;
|
struct field *bf;
|
||||||
|
|
||||||
@ -117,11 +128,12 @@ void create_new_bitfield(char *name, unsigned int width)
|
|||||||
//fprintf(stderr, "Added bitfield `%s` : %d\n", bf->name, width);
|
//fprintf(stderr, "Added bitfield `%s` : %d\n", bf->name, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_new_bitfields(char *name, unsigned int n, unsigned int width)
|
static void create_new_bitfields(char *name, unsigned int n, unsigned int width)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int len = strlen (name);
|
unsigned long len = strlen (name);
|
||||||
char *namen = (char *) malloc ((len + 9) * sizeof (char));
|
char *namen = (char *) malloc ((len + 9) * sizeof (char));
|
||||||
|
check_pointer(namen);
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
snprintf (namen, len + 8, "%s%x", name, i);
|
snprintf (namen, len + 8, "%s%x", name, i);
|
||||||
create_new_bitfield (namen, width);
|
create_new_bitfield (namen, width);
|
||||||
@ -136,7 +148,9 @@ struct field *putsym (char const *sym_name, unsigned int w)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
struct field *ptr = (struct field *) malloc (sizeof (struct field));
|
struct field *ptr = (struct field *) malloc (sizeof (struct field));
|
||||||
|
check_pointer(ptr);
|
||||||
ptr->name = (char *) malloc (strlen (sym_name) + 1);
|
ptr->name = (char *) malloc (strlen (sym_name) + 1);
|
||||||
|
check_pointer(ptr->name);
|
||||||
strcpy (ptr->name, sym_name);
|
strcpy (ptr->name, sym_name);
|
||||||
ptr->width = w;
|
ptr->width = w;
|
||||||
ptr->value = 0;
|
ptr->value = 0;
|
||||||
@ -161,7 +175,7 @@ struct field *getsym (char const *sym_name)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_all_values (void)
|
static void dump_all_values (void)
|
||||||
{
|
{
|
||||||
struct field *ptr;
|
struct field *ptr;
|
||||||
for (ptr = sym_table; ptr != (struct field *) 0;
|
for (ptr = sym_table; ptr != (struct field *) 0;
|
||||||
@ -173,7 +187,7 @@ void dump_all_values (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void empty_field_table(void)
|
static void empty_field_table(void)
|
||||||
{
|
{
|
||||||
struct field *ptr;
|
struct field *ptr;
|
||||||
struct field *ptrnext;
|
struct field *ptrnext;
|
||||||
@ -190,21 +204,23 @@ void empty_field_table(void)
|
|||||||
sym_table_tail = 0;
|
sym_table_tail = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void create_binary_blob (void)
|
static void create_binary_blob (void)
|
||||||
{
|
{
|
||||||
if (binary && binary->blb) {
|
if (binary && binary->blb) {
|
||||||
free(binary->blb);
|
free(binary->blb);
|
||||||
free(binary);
|
free(binary);
|
||||||
}
|
}
|
||||||
binary = (struct blob *) malloc (sizeof (struct blob));
|
binary = (struct blob *) malloc (sizeof (struct blob));
|
||||||
|
check_pointer(binary);
|
||||||
binary->blb = (unsigned char *) malloc (sizeof (unsigned char));
|
binary->blb = (unsigned char *) malloc (sizeof (unsigned char));
|
||||||
|
check_pointer(binary->blb);
|
||||||
binary->bloblen = 0;
|
binary->bloblen = 0;
|
||||||
binary->blb[0] = VALID_BIT;
|
binary->blb[0] = VALID_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void interpret_next_blob_value (struct field *f)
|
static void interpret_next_blob_value (struct field *f)
|
||||||
{
|
{
|
||||||
int i;
|
unsigned int i;
|
||||||
unsigned int v = 0;
|
unsigned int v = 0;
|
||||||
|
|
||||||
if (binary->bloblen >= binary->lenactualblob * 8) {
|
if (binary->bloblen >= binary->lenactualblob * 8) {
|
||||||
@ -220,7 +236,7 @@ void interpret_next_blob_value (struct field *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* {}%BIN -> {} */
|
/* {}%BIN -> {} */
|
||||||
void generate_setter_bitfields(unsigned char *bin)
|
static void generate_setter_bitfields(unsigned char *bin)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct field *ptr;
|
struct field *ptr;
|
||||||
@ -245,7 +261,7 @@ void generate_setter_bitfields(unsigned char *bin)
|
|||||||
fprintf (fp, "\n}\n");
|
fprintf (fp, "\n}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void generate_binary_with_gbe_checksum(void)
|
static void generate_binary_with_gbe_checksum(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned short checksum;
|
unsigned short checksum;
|
||||||
@ -317,7 +333,7 @@ void generate_binary_with_gbe_checksum(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* {}{} -> BIN */
|
/* {}{} -> BIN */
|
||||||
void generate_binary(void)
|
static void generate_binary(void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct field *ptr;
|
struct field *ptr;
|
||||||
@ -435,14 +451,39 @@ void yyerror (char const *s)
|
|||||||
void set_input_string(char* in);
|
void set_input_string(char* in);
|
||||||
|
|
||||||
/* This function parses a string */
|
/* This function parses a string */
|
||||||
int parse_string(unsigned char* in) {
|
static int parse_string(unsigned char* in) {
|
||||||
set_input_string ((char *)in);
|
set_input_string ((char *)in);
|
||||||
return yyparse ();
|
return yyparse ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int loadfile (char *file, char *filetype,
|
||||||
|
unsigned char **parsestring, unsigned int lenstr)
|
||||||
|
{
|
||||||
|
unsigned int lenfile;
|
||||||
|
|
||||||
|
if ((fp = fopen(file, "r")) == NULL) {
|
||||||
|
printf("Error: Could not open %s file: %s\n",filetype,file);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
lenfile = ftell(fp);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
|
if (lenstr == 0)
|
||||||
|
*parsestring = (unsigned char *) malloc (lenfile + 2);
|
||||||
|
else
|
||||||
|
*parsestring = (unsigned char *) realloc (*parsestring,
|
||||||
|
lenfile + lenstr);
|
||||||
|
|
||||||
|
check_pointer(*parsestring);
|
||||||
|
fread(*parsestring + lenstr, 1, lenfile, fp);
|
||||||
|
fclose(fp);
|
||||||
|
return lenfile;
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char *argv[])
|
int main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
unsigned int lenspec, lensetter;
|
unsigned int lenspec;
|
||||||
unsigned char *parsestring;
|
unsigned char *parsestring;
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
unsigned int pos = 0;
|
unsigned int pos = 0;
|
||||||
@ -458,70 +499,43 @@ int main (int argc, char *argv[])
|
|||||||
/* Compile mode */
|
/* Compile mode */
|
||||||
|
|
||||||
/* Load Spec */
|
/* Load Spec */
|
||||||
fp = fopen(argv[1], "r");
|
lenspec = loadfile(argv[1], "spec", &parsestring, 0);
|
||||||
fseek(fp, 0, SEEK_END);
|
loadfile(argv[2], "setter", &parsestring, lenspec);
|
||||||
lenspec = ftell(fp);
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
parsestring = (unsigned char *) malloc (lenspec);
|
|
||||||
if (!parsestring) {
|
|
||||||
printf("Out of memory\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fread(parsestring, 1, lenspec, fp);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
/* Load Setter */
|
|
||||||
fp = fopen(argv[2], "r");
|
|
||||||
fseek(fp, 0, SEEK_END);
|
|
||||||
lensetter = ftell(fp);
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
parsestring = (unsigned char *) realloc (parsestring,
|
|
||||||
lenspec + lensetter);
|
|
||||||
if (!parsestring) {
|
|
||||||
printf("Out of memory\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fread(parsestring + lenspec, 1, lensetter, fp);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
/* Open output and parse string - output to fp */
|
/* Open output and parse string - output to fp */
|
||||||
fp = fopen(argv[3], "wb");
|
if ((fp = fopen(argv[3], "wb")) == NULL) {
|
||||||
|
printf("Error: Could not open output file: %s\n",argv[3]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
ret = parse_string(parsestring);
|
ret = parse_string(parsestring);
|
||||||
free(parsestring);
|
free(parsestring);
|
||||||
} else if (argc == 5 && strcmp (argv[1], "-d") == 0) {
|
} else if (argc == 5 && strcmp (argv[1], "-d") == 0) {
|
||||||
/* Decompile mode */
|
/* Decompile mode */
|
||||||
|
|
||||||
/* Load Spec */
|
/* Load Spec */
|
||||||
fp = fopen(argv[2], "r");
|
lenspec = loadfile(argv[2], "spec", &parsestring, 0);
|
||||||
fseek(fp, 0, SEEK_END);
|
|
||||||
lenspec = ftell(fp);
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
parsestring = (unsigned char *) malloc (lenspec + 1);
|
|
||||||
fread(parsestring, 1, lenspec, fp);
|
|
||||||
if (!parsestring) {
|
|
||||||
printf("Out of memory\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
/* Add binary read trigger token */
|
|
||||||
parsestring[lenspec] = '%';
|
parsestring[lenspec] = '%';
|
||||||
|
parsestring[lenspec + 1] = '\0';
|
||||||
|
|
||||||
/* Load Actual Binary */
|
/* Load Actual Binary */
|
||||||
fp = fopen(argv[3], "rb");
|
if ((fp = fopen(argv[3], "rb")) == NULL) {
|
||||||
|
printf("Error: Could not open binary file: %s\n",argv[3]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
fseek(fp, 0, SEEK_END);
|
fseek(fp, 0, SEEK_END);
|
||||||
binary->lenactualblob = ftell(fp);
|
binary->lenactualblob = ftell(fp);
|
||||||
fseek(fp, 0, SEEK_SET);
|
fseek(fp, 0, SEEK_SET);
|
||||||
binary->actualblob = (unsigned char *) malloc (binary->lenactualblob);
|
binary->actualblob = (unsigned char *) malloc (binary->lenactualblob);
|
||||||
if (!binary->actualblob) {
|
check_pointer(binary->actualblob);
|
||||||
printf("Out of memory\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fread(binary->actualblob, 1, binary->lenactualblob, fp);
|
fread(binary->actualblob, 1, binary->lenactualblob, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
/* Open output and parse - output to fp */
|
/* Open output and parse - output to fp */
|
||||||
fp = fopen(argv[4], "w");
|
if ((fp = fopen(argv[4], "w")) == NULL) {
|
||||||
|
printf("Error: Could not open output file: %s\n",argv[4]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
ret = parse_string(parsestring);
|
ret = parse_string(parsestring);
|
||||||
free(parsestring);
|
free(parsestring);
|
||||||
free(binary->actualblob);
|
free(binary->actualblob);
|
||||||
|
Reference in New Issue
Block a user