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 <[email protected]>
Acked-by: Stefan Reinauer <[email protected]>



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;
 }


-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to