Author: stepan
Date: 2009-09-26 18:18:22 +0200 (Sat, 26 Sep 2009)
New Revision: 4680
Modified:
trunk/util/getpir/Makefile
trunk/util/getpir/README
trunk/util/getpir/getpir.c
Log:
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 ?\226?\128?\147 Makefile and README file are modified accordingly.
Signed-off-by: Mohamed Mansoor <mansoor(a)iwavesystems.com>
Acked-by: Stefan Reinauer <stepan(a)coresystems.de>
Modified: trunk/util/getpir/Makefile
===================================================================
--- trunk/util/getpir/Makefile 2009-09-26 15:52:05 UTC (rev 4679)
+++ trunk/util/getpir/Makefile 2009-09-26 16:18:22 UTC (rev 4680)
@@ -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 $^
Modified: trunk/util/getpir/README
===================================================================
--- trunk/util/getpir/README 2009-09-26 15:52:05 UTC (rev 4679)
+++ trunk/util/getpir/README 2009-09-26 16:18:22 UTC (rev 4680)
@@ -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..
+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:
-INSTALL:
+Steps
+1. make distclean;
+2. make getpir
+3. ./getpir
-edit Makefile, define the root to coreboot tree
-make
+ 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.
-USAGE:
-./getpir
+4. CHECKING CUSTOM irq_tables.c:
-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.
+ 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.
+
-CHECKING CUSTOM irq_tables.c:
+Do not run make checkpir and ./checkpir directly because it needs to be linked
+to irq_table.o first.
-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:
-
-make test
-
-Do not run ./checkpir directly because it needs to be linked to irq_table.o first.
Modified: trunk/util/getpir/getpir.c
===================================================================
--- trunk/util/getpir/getpir.c 2009-09-26 15:52:05 UTC (rev 4679)
+++ trunk/util/getpir/getpir.c 2009-09-26 16:18:22 UTC (rev 4680)
@@ -28,31 +28,45 @@
{
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);
+ 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 (rt != NULL) {
- printf("Found PCI IRQ routing table signature at %p.\n",
- (void *)((char *)rt - ptr + 0xf0000));
- } else {
+ 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 @@
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;
}