#include <ctype.h>
#include <errno.h>
#include <libgen.h>
+#define UTIL_BUILD_OPTION_TABLE
#include "../../src/include/pc80/mc146818rtc.h"
#include "../../src/include/boot/coreboot_tables.h"
#define INPUT_LINE_MAX 256
#define MAX_VALUE_BYTE_LENGTH 64
-#define TMPFILE_LEN 256
+#define TMPFILE_LEN 25600
#define TMPFILE_TEMPLATE "/build_opt_tbl_XXXXXX"
static unsigned char cmos_table[4096];
ce->name);
exit(1);
}
- /* test if entries 8 or more in length are even bytes */
+ /* test if entries 8 or more in length are even bytes */
if(ce->length%8){
printf("Error - Entry %s length over 8 must be a multiple of 8\n",
ce->name);
printf(" [--option filename]\n");
printf(" [--header filename]\n\n");
printf("--config = Build the definitions table from the given file.\n");
+ printf("--binary = Output a binary file with the definitions.\n");
printf("--option = Output a C source file with the definitions.\n");
- printf("--header = Ouput a C header file with the definitions.\n");
+ printf("--header = Output a C header file with the definitions.\n");
exit(1);
}
char *ptr2;
value = strtoul(*ptr, &ptr2, base);
if (ptr2 == *ptr) {
- printf("Error missing digits at: \n%s\n in line:\n%s\n",
+ printf("Error missing digits at: \n%s\n in line:\n%s\n",
*ptr, line);
exit(1);
}
*
* The input comes from the configuration file which contains two parts
* entries and enumerations. Each section is started with the key words
- * entries and enumerations. Records then follow in their respective
+ * entries and enumerations. Records then follow in their respective
* formats.
*
* The output of this program is the cmos definitions table. It is stored
- * in the cmos_table array. If this module is called, and the global
+ * in the cmos_table array. If this module is called, and the global
* table_file has been implimented by the user, the table is also written
* to the specified file.
*
- * This program exits with a return code of 1 on error. It returns 0 on
+ * This program exits with a return code of 1 on error. It returns 0 on
* successful completion
*/
int main(int argc, char **argv)
{
int i;
char *config=0;
+ char *binary=0;
char *option=0;
char *header=0;
FILE *fp;
int enum_length;
int len;
char buf[16];
+ char val;
for(i=1;i<argc;i++) {
if(argv[i][0]!='-') {
}
config=argv[++i];
break;
+ case 'b': /* Emit a binary file */
+ if(strcmp(&argv[i][2],"binary")) {
+ display_usage(argv[0]);
+ }
+ binary=argv[++i];
+ break;
case 'o': /* use a cmos definitions table file */
if(strcmp(&argv[i][2],"option")) {
display_usage(argv[0]);
ce=(struct cmos_entries*)(cmos_table+(ct->header_length));
cptr = (char*)ce;
for(;;){ /* this section loops through the entry records */
- if(fgets(line,INPUT_LINE_MAX,fp)==NULL)
+ if(fgets(line,INPUT_LINE_MAX,fp)==NULL)
break; /* end if no more input */
// FIXME mode should be a single enum.
if(!entry_mode) { /* skip input until the entries key word */
}
/* skip commented and blank lines */
- if(line[0]=='#') continue;
- if(line[strspn(line," ")]=='\n') continue;
+ val = line[strspn(line," ")];
+ /* takes care of *nix, Mac and Windows line ending formats */
+ if (val=='#' || val=='\n' || val=='\r') continue;
/* scan in the input data */
sscanf(line,"%d %d %c %d %s",
&ce->bit,&ce->length,&uc,&ce->config_id,&ce->name[0]);
exit(1);
}
if (!is_ident((char *)ce->name)) {
- fprintf(stderr,
- "Error - Name %s is an invalid identifier in line\n %s\n",
+ fprintf(stderr,
+ "Error - Name %s is an invalid identifier in line\n %s\n",
ce->name, line);
exit(1);
}
for(;enum_mode;){ /* loop to build the enumerations section */
long ptr;
- if(fgets(line,INPUT_LINE_MAX,fp)==NULL)
+ if(fgets(line,INPUT_LINE_MAX,fp)==NULL)
break; /* go till end of input */
if (strstr(line, "checksums") != 0) {
for(cnt=0;(line[ptr]!='\n')&&(cnt<31);ptr++,cnt++)
c_enums->text[cnt]=line[ptr];
c_enums->text[cnt]=0;
-
+
/* make the record int aligned */
cnt++;
if(cnt%4)
skip_spaces(line, &ptr);
cs->location = get_number(line, &ptr, 10);
-
+
/* Make certain there are spaces until the end of the line */
skip_spaces(line, &ptr);
exit(1);
}
if ((cs->location >= (CMOS_IMAGE_BUFFER_SIZE*8)) ||
- ((cs->location + 16) > (CMOS_IMAGE_BUFFER_SIZE*8)))
+ ((cs->location + 16) > (CMOS_IMAGE_BUFFER_SIZE*8)))
{
fprintf(stderr, "Error - location is to big in line\n%s\n", line);
exit(1);
/* See if we want to output a C source file */
if(option) {
int err=0;
- strncpy(tempfilename, dirname(strdup(option)), TMPFILE_LEN);
- strncat(tempfilename, TMPFILE_TEMPLATE, TMPFILE_LEN);
+ snprintf(tempfilename, TMPFILE_LEN, "%s%s", dirname(strdup(option)), TMPFILE_TEMPLATE);
tempfile = mkstemp(tempfilename);
if(tempfile == -1) {
perror("Error - Could not create temporary file");
}
/* write the header */
- if(!fwrite("unsigned char option_table[] = {",1,32,fp)) {
+ if(fwrite("unsigned char option_table[] = {",1,32,fp) != 32) {
perror("Error - Could not write image file");
fclose(fp);
unlink(tempfilename);
}
/* write the array values */
for(i=0; i<(int)(ct->size-1); i++) {
- if(!(i%10) && !err) err=!fwrite("\n\t",1,2,fp);
+ if(!(i%10) && !err) err=(fwrite("\n\t",1,2,fp) != 2);
sprintf(buf,"0x%02x,",cmos_table[i]);
- if(!err) err=!fwrite(buf,1,5,fp);
+ if(!err) err=(fwrite(buf,1,5,fp) != 5);
}
/* write the end */
sprintf(buf,"0x%02x\n",cmos_table[i]);
- if(!err) err=!fwrite(buf,1,4,fp);
- if(!fwrite("};\n",1,3,fp)) {
+ if(!err) err=(fwrite(buf,1,4,fp) != 4);
+ if(fwrite("};\n",1,3,fp) != 3) {
perror("Error - Could not write image file");
fclose(fp);
unlink(tempfilename);
}
}
+ /* See if we also want to output a binary file */
+ if(binary) {
+ int err=0;
+ snprintf(tempfilename, TMPFILE_LEN, "%s%s", dirname(strdup(binary)), TMPFILE_TEMPLATE);
+ tempfile = mkstemp(tempfilename);
+ if(tempfile == -1) {
+ perror("Error - Could not create temporary file");
+ exit(1);
+ }
+
+ if((fp=fdopen(tempfile,"wb"))==NULL){
+ perror("Error - Could not open temporary file");
+ unlink(tempfilename);
+ exit(1);
+ }
+
+ /* write the array values */
+ if(fwrite(cmos_table, (int)(ct->size-1), 1, fp) != 1) {
+ perror("Error - Could not write image file");
+ fclose(fp);
+ unlink(tempfilename);
+ exit(1);
+ }
+
+ fclose(fp);
+ UNLINK_IF_NECESSARY(binary);
+ if (rename(tempfilename, binary)) {
+ fprintf(stderr, "Error - Could not write %s: ", binary);
+ perror(NULL);
+ unlink(tempfilename);
+ exit(1);
+ }
+ }
+
/* See if we also want to output a C header file */
if (header) {
struct cmos_option_table *hdr;
struct lb_record *ptr, *end;
- strncpy(tempfilename, dirname(strdup(header)), TMPFILE_LEN);
- strncat(tempfilename, TMPFILE_TEMPLATE, TMPFILE_LEN);
+ snprintf(tempfilename, TMPFILE_LEN, "%s%s", dirname(strdup(header)), TMPFILE_TEMPLATE);
tempfile = mkstemp(tempfilename);
if(tempfile == -1) {
perror("Error - Could not create temporary file");
/* Walk through the entry records */
ptr = (struct lb_record *)(cmos_table + hdr->header_length);
end = (struct lb_record *)(cmos_table + hdr->size);
+ fprintf(fp, "/* This file is autogenerated.\n"
+ " * See mainboard's cmos.layout file.\n */\n\n"
+ "#ifndef __OPTION_TABLE_H\n#define __OPTION_TABLE_H\n\n");
+
for(;ptr < end; ptr = (struct lb_record *)(((char *)ptr) + ptr->size)) {
if (ptr->tag != LB_TAG_OPTION) {
continue;
unlink(tempfilename);
exit(1);
}
+ fprintf(fp, "\n#endif // __OPTION_TABLE_H\n");
fclose(fp);
UNLINK_IF_NECESSARY(header);