+ /** found the table */
+ int i, ts = (rt->size - 32) / 16;
+ struct irq_info *se_arr;
+ se_arr = (struct irq_info *) ((char *) rt + 32);
+ /** Dump the table information to the stdout */
+ printf("Found PCI IRQ routing table signature at %p.\n", (void *) ((char *) rt - ptr + 0xf0000));
+ printf("SIGNATURE = %s\n", (char*)&rt->signature);
+ printf("VERSION = %04x\n", rt->version);
+ printf("SIZE = %i\n", rt->size);
+ printf("MAX_DEVICES_ON_BUS = 32 + 16 * %d\n", ts);
+ printf("INT_ROUTER_BUS = 0x%02x\n", rt->rtr_bus);
+ printf("INT_ROUTER DEVICE = (0x%02x << 3) | 0x%01x\n", rt->rtr_devfn >> 3, rt->rtr_devfn & 7);
+ printf("IRQ_DEVOTED_TO_PCI = %#x\n", rt->exclusive_irqs);
+ printf("VENDOR = %#x\n", rt->rtr_vendor);
+ printf("DEVICE = %#x\n", rt->rtr_device);
+ printf("MINIPORT = %#x\n", rt->miniport_data);
+ printf("CHECKSUM = %#x\n", rt->checksum);
+ printf("\tbus , dev | fn, {link, bitmap}, {link, bitmap}, {link, bitmap}, {link, bitmap}, slot, rfu\n");
+ for (i = 0; i < ts; i++) {
+ printf("\t0x%02x, (0x%02x << 3) | 0x%01x, {{0x%02x, 0x%04x}, {0x%02x, 0x%04x}, {0x%02x, 0x%04x}, {0x%02x, 0x%04x}}, 0x%x, 0x%x},\n",
+ (se_arr+i)->bus, (se_arr+i)->devfn >> 3,
+ (se_arr+i)->devfn & 7, (se_arr+i)->irq[0].link,
+ (se_arr+i)->irq[0].bitmap, (se_arr+i)->irq[1].link,
+ (se_arr+i)->irq[1].bitmap, (se_arr+i)->irq[2].link,
+ (se_arr+i)->irq[2].bitmap, (se_arr+i)->irq[3].link,
+ (se_arr+i)->irq[3].bitmap, (se_arr+i)->slot,
+ (se_arr+i)->rfu);
+ }
+ /** A table should not be over 0x400 bytes */
+ if (rt->size > 0x400) {
+ return NULL;
+ }
+ printf("Validating...\n");
+ /** Calculate the checksum value */
+ checksum_result = calc_checksum(rt);
+ /** Show the calculatedchecksum value */
+ printf("CHECKSUM = %#x\n", 0x100-((checksum_result - rt->checksum) & 0xFF));
+ /** and the result of the calculation */
+ if (!checksum_result) {