[coreboot] [v2] r4680 - trunk/util/getpir

svn at coreboot.org svn at coreboot.org
Sat Sep 26 18:18:22 CEST 2009


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 at iwavesystems.com>
Acked-by: Stefan Reinauer <stepan at 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;
 }





More information about the coreboot mailing list