summaryrefslogtreecommitdiff
path: root/util/getpir
diff options
context:
space:
mode:
authorMohamed Mansoor <mansoor@iwavesystems.com>2009-09-26 16:18:22 +0000
committerStefan Reinauer <stepan@openbios.org>2009-09-26 16:18:22 +0000
commitbde683ce9fcc346096a07222047fa5a16aa74243 (patch)
tree41fcbdcd15c911a4cb41e460f534defd4880034f /util/getpir
parent5db685fedfe7f291719c90088bbf7618b31f3da6 (diff)
This patch changes following in getpir application.
1 - Moved the check sum validation to probe_table function. 2 - Proper handling of resources allocated. 3 - Signature check is done in 16 byte boundaries. 4 - irq_tables.c file is created only if a valid PIRQ table is found. 5 – Makefile and README file are modified accordingly. Signed-off-by: Mohamed Mansoor <mansoor@iwavesystems.com> Acked-by: Stefan Reinauer <stepan@coresystems.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4680 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'util/getpir')
-rw-r--r--util/getpir/Makefile3
-rw-r--r--util/getpir/README36
-rw-r--r--util/getpir/getpir.c53
3 files changed, 51 insertions, 41 deletions
diff --git a/util/getpir/Makefile b/util/getpir/Makefile
index 13bf47efc9..94270f54a6 100644
--- a/util/getpir/Makefile
+++ b/util/getpir/Makefile
@@ -5,8 +5,7 @@
CC=gcc
CFLAGS=-O2 -D_GNU_SOURCE -DGETPIR -Wall
-all: getpir checkpir
- ./checkpir
+all: getpir
getpir: getpir.o checksum.o code_gen.o
$(CC) $(CFLAGS) -o getpir $^
diff --git a/util/getpir/README b/util/getpir/README
index 6c5d6e2b53..33d0de2a93 100644
--- a/util/getpir/README
+++ b/util/getpir/README
@@ -1,28 +1,30 @@
ABOUT:
-This utility will help to create irq_table.c file, that is very hard to create manually,
-specialy when you are testing new motherboards, changing your hardware often, placing new cards, etc..
-
-
-INSTALL:
-
-edit Makefile, define the root to coreboot tree
-make
+This utility will help to create irq_table.c file, that is very hard to create
+manually, specialy when you are testing new motherboards, changing your
+hardware often, placing new cards, etc..
USAGE:
-./getpir
+Steps
+1. make distclean;
+2. make getpir
+3. ./getpir
+
+ Will dump irq table to the file called irq_tables.c, ready to use with
+ coreboot. Just move the file to corresponding place in the coreboot tree.
-Will dump irq table to the file called irq_tables.c, ready to use with coreboot. Just move the
-file to corresponding place in the linux bios tree.
+4. CHECKING CUSTOM irq_tables.c:
-CHECKING CUSTOM irq_tables.c:
+ make checkpir
+ ./checkpir
-checkpir.c Will verify the irq_tables.c, currently it only checks the checksum. In case of wrong
-checksum, a good value is proposed, so you can edit irq_tables.c manualy and replace checksum.
-Run the command like this:
+ checkpir.c Will verify the irq_tables.c, currently it only checks the
+ checksum. In case of wrong checksum, a good value is proposed, so you can
+ edit irq_tables.c manualy and replace checksum.
+
-make test
+Do not run make checkpir and ./checkpir directly because it needs to be linked
+to irq_table.o first.
-Do not run ./checkpir directly because it needs to be linked to irq_table.o first.
diff --git a/util/getpir/getpir.c b/util/getpir/getpir.c
index d0ad978a40..6fc3a95d8a 100644
--- a/util/getpir/getpir.c
+++ b/util/getpir/getpir.c
@@ -28,31 +28,45 @@ static struct irq_routing_table *probe_table(int fd_mem)
{
char *ptr, signature[] = "$PIR";
struct irq_routing_table *rt;
+ int size = 16;
- ptr = mmap(0, 0x10000, PROT_READ, MAP_SHARED,
- fd_mem, (off_t) 0xf0000);
+ ptr = mmap(0, 0x10000, PROT_READ, MAP_SHARED,
+ fd_mem, (off_t) 0xf0000);
if (ptr == MAP_FAILED) {
perror("Mapping system memory failed: ");
- exit(1);
+ return NULL;
}
- rt = (struct irq_routing_table *) memmem(ptr, 0xFFFF, signature, 4);
-
- if (rt != NULL) {
- printf("Found PCI IRQ routing table signature at %p.\n",
- (void *)((char *)rt - ptr + 0xf0000));
- } else {
+ do {
+ rt = (struct irq_routing_table *) memmem(ptr + size, 16, signature, 4);
+ if (rt != NULL) {
+ printf("Found PCI IRQ routing table signature at %p.\n",
+ (void *) ((char *) rt - ptr + 0xf0000));
+ printf("Validating... ");
+ if (!calc_checksum(rt)) {
+ printf("checksum is ok.\n");
+ break;
+ } else {
+ printf("checksum is wrong.\n");
+ }
+ }
+ size += 16;
+ } while (size < 0xFFFF);
+
+ if (size >= 0xFFFF) {
printf("No PCI IRQ routing table signature found.\n");
- exit(1);
+ munmap(ptr, 0x10000);
+ return NULL;
}
+
return rt;
}
int main(void)
{
int fd_mem;
- struct irq_routing_table *rt;
+ struct irq_routing_table *rt;
if (getuid()) {
fprintf(stderr, "Run me as root, I need access to " MEM_DEV ".\n");
@@ -66,19 +80,14 @@ int main(void)
printf("Probing PIRQ table in memory.\n");
rt = probe_table(fd_mem);
-
- printf("Validating... ");
- if (!calc_checksum(rt))
- printf("checksum is ok.\n");
- else
- printf("checksum is wrong.\n");
-
- printf("Creating irq_tables.c ...\n");
- code_gen("irq_tables.c", rt);
-
+ if (rt != NULL) {
+ printf("Creating irq_tables.c ...\n");
+ code_gen("irq_tables.c", rt);
+ printf
+ ("Done, you can move the file to the coreboot tree now.\n");
+ }
close(fd_mem);
- printf("Done, you can move the file to the coreboot tree now.\n");
return 0;
}