示例#1
0
/****************************************************************************
 * write_cmos_layout
 *
 * Write CMOS layout information to file 'f'.  The output is written in the
 * format that CMOS layout files adhere to.
 ****************************************************************************/
void write_cmos_layout(FILE * f)
{
	const cmos_entry_t *cmos_entry;
	const cmos_enum_t *cmos_enum;
	cmos_checksum_layout_t layout;

	fprintf(f, "entries\n");

	for (cmos_entry = first_cmos_entry();
	     cmos_entry != NULL; cmos_entry = next_cmos_entry(cmos_entry))
		fprintf(f, "%u %u %c %u %s\n", cmos_entry->bit,
			cmos_entry->length,
			cmos_entry_char_value(cmos_entry->config),
			cmos_entry->config_id, cmos_entry->name);

	fprintf(f, "\nenumerations\n");

	for (cmos_enum = first_cmos_enum();
	     cmos_enum != NULL; cmos_enum = next_cmos_enum(cmos_enum))
		fprintf(f, "%u %llu %s\n", cmos_enum->config_id,
			cmos_enum->value, cmos_enum->text);

	layout.summed_area_start = cmos_checksum_start;
	layout.summed_area_end = cmos_checksum_end;
	layout.checksum_at = cmos_checksum_index;
	checksum_layout_to_bits(&layout);
	fprintf(f, "\nchecksums\nchecksum %u %u %u\n", layout.summed_area_start,
		layout.summed_area_end, layout.checksum_at);
}
示例#2
0
void write_cmos_layout_header(const char *header_filename)
{
	FILE *fp;
	const cmos_entry_t *cmos_entry;
	cmos_checksum_layout_t layout;

	if ((fp = fopen(header_filename, "w+")) == NULL) {
		fprintf(stderr,
				"%s: Can't open file %s for writing: %s\n",
				prog_name, header_filename, strerror(errno));
			exit(1);
	}

	fprintf(fp, "/**\n * This is an autogenerated file. Do not EDIT.\n"
			" * All changes made to this file will be lost.\n"
			" * See mainboard's cmos.layout file.\n */\n"
			"\n#ifndef __OPTION_TABLE_H\n"
			"#define __OPTION_TABLE_H\n\n");

	for (cmos_entry = first_cmos_entry(); cmos_entry != NULL;
			cmos_entry = next_cmos_entry(cmos_entry)) {

		if (!is_ident((char *)cmos_entry->name)) {
			fprintf(stderr,
				"Error - Name %s is an invalid identifier\n",
				cmos_entry->name);
			fclose(fp);
			exit(1);
		}

		fprintf(fp, "#define CMOS_VSTART_%s\t%d\n",
				cmos_entry->name, cmos_entry->bit);
		fprintf(fp, "#define CMOS_VLEN_%s\t%d\n",
				cmos_entry->name, cmos_entry->length);
	}

	layout.summed_area_start = cmos_checksum_start;
	layout.summed_area_end = cmos_checksum_end;
	layout.checksum_at = cmos_checksum_index;
	checksum_layout_to_bits(&layout);

	fprintf(fp, "\n#define LB_CKS_RANGE_START %d\n",
			layout.summed_area_start / 8);
	fprintf(fp, "#define LB_CKS_RANGE_END %d\n",
			layout.summed_area_end / 8);
	fprintf(fp, "#define LB_CKS_LOC %d\n",
			layout.checksum_at / 8);
	fprintf(fp, "\n#endif /* __OPTION_TABLE_H */\n");

	fclose(fp);
}
示例#3
0
int write_cmos_layout_bin(FILE *f)
{
	const cmos_entry_t *cmos_entry;
	const cmos_enum_t *cmos_enum;
	cmos_checksum_layout_t layout;
	struct cmos_option_table table;
	struct cmos_entries entry;
	struct cmos_enums cenum;
	struct cmos_checksum csum;
	size_t sum = 0;
	int len;

	for (cmos_entry = first_cmos_entry(); cmos_entry != NULL;
			cmos_entry = next_cmos_entry(cmos_entry)) {

		if (cmos_entry == first_cmos_entry()) {
			sum += sizeof(table);
			table.header_length = sizeof(table);
			table.tag = LB_TAG_CMOS_OPTION_TABLE;
			table.size = 0;

			if (fwrite((char *)&table, sizeof(table), 1, f) != 1) {
				perror("Error writing image file");
				goto err;
			}
		}

		memset(&entry, 0, sizeof(entry));
		entry.tag = LB_TAG_OPTION;
		entry.config = cmos_entry->config;
		entry.config_id = (uint32_t)cmos_entry->config_id;
		entry.bit = cmos_entry->bit;
		entry.length = cmos_entry->length;

		if (!is_ident((char *)cmos_entry->name)) {
			fprintf(stderr,
				"Error - Name %s is an invalid identifier\n",
				cmos_entry->name);
			goto err;
		}

		memcpy(entry.name, cmos_entry->name, strlen(cmos_entry->name));
		entry.name[strlen(cmos_entry->name)] = '\0';
		len = strlen(cmos_entry->name) + 1;

		if (len % 4)
			ROUNDUP4(len);

		entry.size = sizeof(entry) - CMOS_MAX_NAME_LENGTH + len;
		sum += entry.size;
		if (fwrite((char *)&entry, entry.size, 1, f) != 1) {
			perror("Error writing image file");
			goto err;
		}
	}

	for (cmos_enum = first_cmos_enum();
			cmos_enum != NULL; cmos_enum = next_cmos_enum(cmos_enum)) {
		memset(&cenum, 0, sizeof(cenum));
		cenum.tag = LB_TAG_OPTION_ENUM;
		memcpy(cenum.text, cmos_enum->text, strlen(cmos_enum->text));
		cenum.text[strlen(cmos_enum->text)] = '\0';
		len = strlen((char *)cenum.text) + 1;

		if (len % 4)
			ROUNDUP4(len);

		cenum.config_id = cmos_enum->config_id;
		cenum.value = cmos_enum->value;
		cenum.size = sizeof(cenum) - CMOS_MAX_TEXT_LENGTH + len;
		sum += cenum.size;
		if (fwrite((char *)&cenum, cenum.size, 1, f) != 1) {
			perror("Error writing image file");
			goto err;
		}
	}

	layout.summed_area_start = cmos_checksum_start;
	layout.summed_area_end = cmos_checksum_end;
	layout.checksum_at = cmos_checksum_index;
	checksum_layout_to_bits(&layout);

	csum.tag = LB_TAG_OPTION_CHECKSUM;
	csum.size = sizeof(csum);
	csum.range_start = layout.summed_area_start;
	csum.range_end = layout.summed_area_end;
	csum.location = layout.checksum_at;
	csum.type = CHECKSUM_PCBIOS;
	sum += csum.size;

	if (fwrite((char *)&csum, csum.size, 1, f) != 1) {
		perror("Error writing image file");
		goto err;
	}

	if (fseek(f, 0, SEEK_SET) != 0) {
		perror("Error while seeking");
		goto err;
	}

	table.size = sum;
	if (fwrite((char *)&table, sizeof(table), 1, f) != 1) {
		perror("Error writing image file");
		goto err;
	}
	return sum;

err:
	fclose(f);
	exit(1);
}