Changeset 25334


Ignore:
Timestamp:
2011-02-03T02:26:40+01:00 (5 years ago)
Author:
mb
Message:

calvaria: Add basic PMM parser

File:
1 edited

Legend:

Unmodified
Added
Removed
  • packages/utils/calvaria/files/src/calvaria.c

    r25307 r25334  
    4646} 
    4747 
    48 static void dump(FILE *outstream, const char *buf, size_t size) 
    49 { 
     48static void dump_bytes(FILE *outstream, const void *_buf, size_t size) 
     49{ 
     50        const char *buf = _buf; 
    5051        size_t i, ascii_cnt = 0; 
    5152        char ascii[17] = { 0, }; 
     
    7273                fprintf(outstream, "  |%s|\n", ascii); 
    7374        } 
    74         fprintf(outstream, "\n"); 
    7575} 
    7676 
     
    132132} 
    133133 
     134void dump_bme_payload(FILE *outstream, const void *payload, size_t len) 
     135{ 
     136        const uint8_t *pmm_area = payload; 
     137        unsigned int group, element, pmm_offset; 
     138        uint8_t active_group_mask; 
     139        static const uint8_t zero_element[16] = { 0, }; 
     140 
     141        if (len != 0x600 || memcmp(payload, "BME-PMM-BLOCK01", 15) != 0) { 
     142                fprintf(outstream, "ERROR: The section payload is not " 
     143                        "a BME PMM block\n"); 
     144                return; 
     145        } 
     146 
     147        active_group_mask = pmm_area[16]; 
     148 
     149        for (group = 0; group < 3; group++) { 
     150                for (element = 0; element < 32; element++) { 
     151                        pmm_offset = group * 512 + element * 16; 
     152                        if (memcmp(pmm_area + pmm_offset, zero_element, 16) == 0) 
     153                                continue; 
     154                        fprintf(outstream, "-- BME-PMM area -- group %u%s, element %u:\n", 
     155                                group, 
     156                                (active_group_mask & (1 << group)) ? "" : " (INACTIVE)", 
     157                                element); 
     158                        dump_bytes(outstream, pmm_area + pmm_offset, 16); 
     159                } 
     160        } 
     161} 
     162 
     163typedef void (*payload_dumper_t)(FILE *, const void *payload, size_t len); 
     164 
     165static payload_dumper_t get_payload_dumper(const char *section_name, int raw) 
     166{ 
     167        if (!raw) { 
     168                if (strcmp(section_name, "bme") == 0) 
     169                        return dump_bme_payload; 
     170        } 
     171 
     172        return dump_bytes; 
     173} 
     174 
    134175static int dump_section(const struct header *hdr, 
    135176                        const void *payload, size_t payload_len, 
    136177                        int dump_payload, 
     178                        int dump_raw_payload, 
    137179                        FILE *outstream) 
    138180{ 
    139181        char name[sizeof(hdr->name) + 1] = { 0, }; 
    140182        int hdrsum_ok, datasum_ok; 
     183        payload_dumper_t dumper; 
    141184 
    142185        memcpy(name, hdr->name, sizeof(hdr->name)); 
     
    154197        fprintf(outstream, "Header CRC32:  0x%08X (%s)\n", le32_to_cpu(hdr->hdrsum), 
    155198                hdrsum_ok ? "Ok" : "MISMATCH"); 
    156         if (dump_payload) 
    157                 dump(outstream, payload, payload_len); 
     199        if (dump_payload) { 
     200                dumper = get_payload_dumper(name, dump_raw_payload); 
     201                dumper(outstream, payload, payload_len); 
     202        } 
    158203        fprintf(outstream, "\n"); 
    159204 
     
    260305                      int want_section_index, const char *want_section_name, 
    261306                      int want_headers_only, 
     307                      int dump_raw_payload, 
    262308                      FILE *outstream) 
    263309{ 
     
    291337                                   payload_len, 
    292338                                   !want_headers_only, 
     339                                   dump_raw_payload, 
    293340                                   outstream); 
    294341                if (err) { 
     
    356403        fprintf(fd, "  -i|--index NUMBER    Use this section index number\n"); 
    357404        fprintf(fd, "  -n|--name STRING     Use this section name\n"); 
     405        fprintf(fd, "  -r|--raw             Dump raw data (for -d|--dump only)\n"); 
    358406        fprintf(fd, "\n"); 
    359407        fprintf(fd, "  -h|--help            Print this help text\n"); 
     
    374422        int opt_index = -1; 
    375423        const char *opt_name = NULL; 
     424        int opt_raw_payload = 0; 
    376425 
    377426        static struct option long_options[] = { 
     
    381430                { "index", required_argument, 0, 'i', }, 
    382431                { "name", required_argument, 0, 'n', }, 
     432                { "raw", no_argument, 0, 'r', }, 
    383433                { "help", no_argument, 0, 'h', }, 
    384434                { }, 
     
    386436 
    387437        while (1) { 
    388                 c = getopt_long(argc, argv, "dHphi:n:", 
     438                c = getopt_long(argc, argv, "dHphi:n:r", 
    389439                                long_options, &idx); 
    390440                if (c == -1) 
     
    416466                        opt_name = optarg; 
    417467                        break; 
     468                case 'r': 
     469                        opt_raw_payload = 1; 
     470                        break; 
    418471                default: 
    419472                        return 1; 
     
    446499                err = dump_image(filepath, opt_index, opt_name, 
    447500                                 (action == ACTION_DUMPHDRS), 
     501                                 opt_raw_payload, 
    448502                                 stdout); 
    449503                if (err) 
Note: See TracChangeset for help on using the changeset viewer.