diff options
author | Jerome Glisse <jglisse@redhat.com> | 2012-10-24 15:59:21 -0400 |
---|---|---|
committer | Jerome Glisse <jglisse@redhat.com> | 2012-10-24 15:59:21 -0400 |
commit | a3561f6449677200b51143439e305b140861acb9 (patch) | |
tree | ffe65b7c8f65ebfcb08bc8b6319517367dc3ef2d | |
parent | 12b94ef78cb63808cbd9447536e14834a6260695 (diff) |
add missing reg tools
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | rdb_annotateib.c | 12 | ||||
-rw-r--r-- | rdb_missingreg.c | 229 |
3 files changed, 243 insertions, 7 deletions
@@ -34,8 +34,12 @@ ANN3_O = $(ANN3_C:.c=.o) ICM_C = rdb_cmpib.c rdb.c ICM_O = $(ICM_C:.c=.o) +ANN4_C = rdb_missingreg.c rdb.c +ANN4_O = $(ANN4_C:.c=.o) + TARGETS = rdb_sanitize rdb_read rdb_preg rdb_build rdb_anotate rdb_build2 \ - rdb_update rdb_annotateib rdb_cmpib rdb_annotateib2 rdb_header + rdb_update rdb_annotateib rdb_cmpib rdb_annotateib2 rdb_header \ + rdb_missingreg ##### RULES ##### .SUFFIXES: @@ -81,6 +85,9 @@ rdb_update: $(RUP_O) rdb_cmpib: $(ICM_O) $(CC) -o $@ $(ICM_O) +rdb_missingreg: $(ANN4_O) + $(CC) -o $@ $(ANN4_O) + clean: rm -f $(TARGETS) rm -f *.o diff --git a/rdb_annotateib.c b/rdb_annotateib.c index 895e0b1..5ab38e5 100644 --- a/rdb_annotateib.c +++ b/rdb_annotateib.c @@ -159,25 +159,25 @@ int main(int argc, char *argv[]) FILE *file; if (argc != 3) { - printf("usage %s ibfile rdb\n", argv[0]); + printf("usage %s rdb ibfile\n", argv[0]); return -1; } - file = fopen(argv[2], "r"); + file = fopen(argv[1], "r"); if (file == NULL) { - fprintf(stderr, "failed reading %s\n", argv[2]); + fprintf(stderr, "failed reading %s\n", argv[1]); return -1; } rdb_init(&rdb); if (rdb_read(&rdb, file)) { - fprintf(stderr, "failed reading %s\n", argv[2]); + fprintf(stderr, "failed reading %s\n", argv[1]); return -1; } fclose(file); - file = fopen(argv[1], "r"); + file = fopen(argv[2], "r"); if (file == NULL) { - fprintf(stderr, "failed reading %s\n", argv[1]); + fprintf(stderr, "failed reading %s\n", argv[2]); return -1; } annotate(&rdb, file); diff --git a/rdb_missingreg.c b/rdb_missingreg.c new file mode 100644 index 0000000..4128b5a --- /dev/null +++ b/rdb_missingreg.c @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * author: Jerome Glisse + */ +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "rdb.h" + +static struct list_head regs; + +struct reg { + struct list_head list; + unsigned offset; + unsigned v; +}; + +struct reg *find_reg(unsigned offset) +{ + struct reg *reg; + + LIST_FOR_EACH_ENTRY(reg, ®s, list) { + if (reg->offset == offset) { + return reg; + } + } + return NULL; +} + +void add_reg(unsigned offset, unsigned v, unsigned diff) +{ + struct reg *reg; + + reg = find_reg(offset); + if (reg) { + if (diff) { + list_del(®->list); + free(reg); + return; + } + reg->v = v; + return; + } + if (diff) { + return; + } + + reg = malloc(sizeof(*reg)); + if (reg == NULL) { + exit(-1); + } + reg->offset = offset; + reg->v = v; + list_add(®->list, ®s); +} + +char *line_skip(char *line, unsigned nspace) +{ + do { + if (*line == ' ') { + nspace--; + } + line++; + } while (nspace); + return line; +} + +void annotate(struct rdb *rdb, FILE *file, unsigned diff) +{ + char line[128], *tmp; + unsigned offset, value, ndw = 0, pkt = 0, it; + + while (!feof(file)) { + if (fgets(line, sizeof(line), file) == NULL) { + continue; + } + line[strlen(line) - 1] = 0; + tmp = strstr(line, "] ["); + if (tmp == NULL) { + printf("%s\n", line); + continue; + } + tmp = strchr(tmp + 4, ']'); + if (tmp == NULL) { + printf("%s\n", line); + continue; + } + value = strtoul(tmp + 2, &tmp, 0); + if (tmp == NULL) { + printf("%s\n", line); + continue; + } + if (ndw) { + switch (pkt) { + case 3: + switch (it) { + case 0x68: + if (!offset) { + offset = (value << 2) + 0x8000; + } else { + add_reg(offset, value, diff); + offset += 4; + } + break; + case 0x69: + if (!offset) { + offset = (value << 2) + 0x28000; + } else { + add_reg(offset, value, diff); + offset += 4; + } + break; + default: + break; + } + break; + case 0: + default: + add_reg(offset, value, diff); + offset += 4; + break; + } + ndw--; + } else { + pkt = (value >> 30) & 3; + switch (pkt) { + case 0: + offset = (value & 0xffff) << 2; + ndw = ((value >> 16) & 0x3fff) + 1; + break; + case 3: + offset = 0; + ndw = ((value >> 16) & 0x3fff) + 1; + it = ((value >> 8) & 0xff); + switch (it) { + case 0x29: + case 0x2b: + case 0x2d: + case 0x2e: + case 0x35: + break; + default: + break; + } + break; + case 1: + case 2: + default: + break; + } + } + } +} + +int main(int argc, char *argv[]) +{ + struct rdb rdb; + struct reg *reg; + const struct rdb_reg *rreg; + FILE *file; + + list_init_head(®s); + + if (argc != 4) { + printf("usage %s rdb ibfile1 ibfile2\n", argv[0]); + return -1; + } + + file = fopen(argv[1], "r"); + if (file == NULL) { + fprintf(stderr, "failed reading %s\n", argv[1]); + return -1; + } + rdb_init(&rdb); + if (rdb_read(&rdb, file)) { + fprintf(stderr, "failed reading %s\n", argv[1]); + return -1; + } + fclose(file); + + file = fopen(argv[2], "r"); + if (file == NULL) { + fprintf(stderr, "failed reading %s\n", argv[2]); + return -1; + } + annotate(&rdb, file, 0); + fclose(file); + + file = fopen(argv[3], "r"); + if (file == NULL) { + fprintf(stderr, "failed reading %s\n", argv[3]); + return -1; + } + annotate(&rdb, file, 1); + fclose(file); + + LIST_FOR_EACH_ENTRY(reg, ®s, list) { + rreg = rdb_find_reg(&rdb, 0, reg->offset); + if (rreg) { + printf("notreset 0x%08x 0x%08x %s\n", reg->offset, reg->v, rreg->name); + } else { + printf("notreset 0x%08x 0x%08x ??\n", reg->offset, reg->v); + } + } +} |