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

