#include #include #include #include #define MAXVAL 64 #define MAX2(a, b) ((a) > (b) ? (a) : (b)) struct reg { struct reg *next; unsigned offset; unsigned nvala; unsigned nvalb; unsigned vala[MAXVAL]; unsigned valb[MAXVAL]; }; struct reg *regs = NULL; unsigned l = 0; static int add_val(unsigned offset, unsigned val, unsigned b) { struct reg *reg = regs; while (reg) { if (reg->offset == offset) { break; } reg = reg->next; } if (reg == NULL) { reg = calloc(1, sizeof(*reg)); if (reg == NULL) { return -ENOMEM; } reg->offset = offset; reg->next = regs; regs = reg; } if (b) { reg->valb[reg->nvalb++] = val; } else { reg->vala[reg->nvala++] = val; } return 0; } static void print_reg(void) { struct reg *reg = regs; unsigned i; while (reg) { for (i = 0; i < MAX2(reg->nvala, reg->nvalb); i++) { if (i < reg->nvala && i < reg->valb) { if (reg->vala[i] == reg->valb[i]) { fprintf(stderr, "0x%08x 0x%08x 0x%08x\n", reg->offset, reg->vala[i], reg->valb[i]); } else { fprintf(stderr, "0x%08x 0x%08x 0x%08x !\n", reg->offset, reg->vala[i], reg->valb[i]); } } else if (i < reg->nvala) { fprintf(stderr, "0x%08x 0x%08x ---------- !\n", reg->offset, reg->vala[i]); } else { fprintf(stderr, "0x%08x ---------- 0x%08x !\n", reg->offset, reg->valb[i]); } } reg = reg->next; } } static int parse_pkt0(FILE *file, unsigned pkt, unsigned b) { char line[128]; unsigned i; for (i = 0; i <= ((pkt >> 16) & 0x3fff); i++) { if (fgets(line, sizeof(line), file) == NULL) { if (feof(file)) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return -EINVAL; } } l++; } return 0; } static int parse_pkt3(FILE *file, unsigned pkt, unsigned b) { unsigned offset, val; char line[128]; unsigned i; int r; if (fgets(line, sizeof(line), file) == NULL) { if (feof(file)) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return -EINVAL; } } l++; offset = strtol(line, NULL, 0) << 2; //fprintf(stderr, "%s %d pkt3[0x%08x][%d] 0x%08x\n", __func__, __LINE__, pkt, 0, offset); for (i = 1; i <= ((pkt >> 16) & 0x3fff); i++) { if (fgets(line, sizeof(line), file) == NULL) { if (feof(file)) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return -EINVAL; } l++; } val = strtol(line, NULL, 0); //fprintf(stderr, "%s %d pkt3[0x%08x][%d] 0x%08x\n", __func__, __LINE__, pkt, i, val); switch (((pkt >> 8) & 0xff)) { case 0x68: r = add_val(offset + 0x8000, val, b); if (r) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return r; } break; case 0x69: r = add_val(offset + 0x28000, val, b); if (r) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return r; } break; default: break; } offset += 4; } return 0; } static int parse(const char *filename, unsigned b) { FILE *file; char line[128]; unsigned tmp; int r; l = 1; file = fopen(filename, "r"); if (file == NULL) { fprintf(stderr, "%s %d failed opening %s\n", __func__, __LINE__, filename); return -EINVAL; } while (!feof(file)) { if (fgets(line, sizeof(line), file) == NULL) { continue; } l++; tmp = strtol(line, NULL, 0); switch (tmp >> 30) { case 0: r = parse_pkt0(file, tmp, b); if (r) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return r; } break; case 2: break; case 3: r = parse_pkt3(file, tmp, b); if (r) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return r; } break; } } return 0; } int main(int argc, char *argv[]) { int r; r = parse(argv[1], 0); if (r) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return r; } r = parse(argv[2], 1); if (r) { fprintf(stderr, "%s %d %d\n", __func__, __LINE__, l); return r; } print_reg(); }