/**************************************************************************** * try_convert_checksum_layout * * Perform sanity checking on CMOS checksum layout information and attempt to * convert information from bit positions to byte positions. Return OK on * success or an error code on failure. ****************************************************************************/ static void try_convert_checksum_layout(cmos_checksum_layout_t * layout) { switch (checksum_layout_to_bytes(layout)) { case OK: return; case LAYOUT_SUMMED_AREA_START_NOT_ALIGNED: fprintf(stderr, "%s: CMOS checksummed area start is not byte-aligned.\n", prog_name); break; case LAYOUT_SUMMED_AREA_END_NOT_ALIGNED: fprintf(stderr, "%s: CMOS checksummed area end is not byte-aligned.\n", prog_name); break; case LAYOUT_CHECKSUM_LOCATION_NOT_ALIGNED: fprintf(stderr, "%s: CMOS checksum location is not byte-aligned.\n", prog_name); break; case LAYOUT_INVALID_SUMMED_AREA: fprintf(stderr, "%s: CMOS checksummed area end must be greater than " "CMOS checksummed area start.\n", prog_name); break; case LAYOUT_CHECKSUM_OVERLAPS_SUMMED_AREA: fprintf(stderr, "%s: CMOS checksum overlaps checksummed area.\n", prog_name); break; case LAYOUT_SUMMED_AREA_OUT_OF_RANGE: fprintf(stderr, "%s: CMOS checksummed area out of range.\n", prog_name); break; case LAYOUT_CHECKSUM_LOCATION_OUT_OF_RANGE: fprintf(stderr, "%s: CMOS checksum location out of range.\n", prog_name); break; default: BUG(); } exit(1); }
/**************************************************************************** * set_checksum_info * * Set CMOS checksum information according to input parameters and perform * sanity checking on input parameters. ****************************************************************************/ static void set_checksum_info(const char start_str[], const char end_str[], const char index_str[]) { cmos_checksum_layout_t layout; /* These are bit positions that we want to convert to byte positions. */ layout.summed_area_start = string_to_unsigned(start_str, "CMOS checksummed area start"); layout.summed_area_end = string_to_unsigned(end_str, "CMOS checksummed area end"); layout.checksum_at = string_to_unsigned(index_str, "CMOS checksum location"); switch (checksum_layout_to_bytes(&layout)) { case OK: break; case LAYOUT_SUMMED_AREA_START_NOT_ALIGNED: fprintf(stderr, "%s: Error on line %d of CMOS layout file. CMOS " "checksummed area start is not byte-aligned.\n", prog_name, line_num); goto fail; case LAYOUT_SUMMED_AREA_END_NOT_ALIGNED: fprintf(stderr, "%s: Error on line %d of CMOS layout file. CMOS " "checksummed area end is not byte-aligned.\n", prog_name, line_num); goto fail; case LAYOUT_CHECKSUM_LOCATION_NOT_ALIGNED: fprintf(stderr, "%s: Error on line %d of CMOS layout file. CMOS " "checksum location is not byte-aligned.\n", prog_name, line_num); goto fail; case LAYOUT_INVALID_SUMMED_AREA: fprintf(stderr, "%s: Error on line %d of CMOS layout file. CMOS " "checksummed area end must be greater than CMOS checksummed " "area start.\n", prog_name, line_num); goto fail; case LAYOUT_CHECKSUM_OVERLAPS_SUMMED_AREA: fprintf(stderr, "%s: Error on line %d of CMOS layout file. CMOS " "checksum overlaps checksummed area.\n", prog_name, line_num); goto fail; case LAYOUT_SUMMED_AREA_OUT_OF_RANGE: fprintf(stderr, "%s: Error on line %d of CMOS layout file. CMOS " "checksummed area out of range.\n", prog_name, line_num); goto fail; case LAYOUT_CHECKSUM_LOCATION_OUT_OF_RANGE: fprintf(stderr, "%s: Error on line %d of CMOS layout file. CMOS " "checksum location out of range.\n", prog_name, line_num); goto fail; default: BUG(); } cmos_checksum_start = layout.summed_area_start; cmos_checksum_end = layout.summed_area_end; cmos_checksum_index = layout.checksum_at; return; fail: exit(1); }