summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2012-10-24 15:59:21 -0400
committerJerome Glisse <jglisse@redhat.com>2012-10-24 15:59:21 -0400
commita3561f6449677200b51143439e305b140861acb9 (patch)
treeffe65b7c8f65ebfcb08bc8b6319517367dc3ef2d
parent12b94ef78cb63808cbd9447536e14834a6260695 (diff)
add missing reg tools
-rw-r--r--Makefile9
-rw-r--r--rdb_annotateib.c12
-rw-r--r--rdb_missingreg.c229
3 files changed, 243 insertions, 7 deletions
diff --git a/Makefile b/Makefile
index ba4dccb..1f68407 100644
--- a/Makefile
+++ b/Makefile
@@ -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, &regs, 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(&reg->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(&reg->list, &regs);
+}
+
+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(&regs);
+
+ 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, &regs, 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);
+ }
+ }
+}