From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <4b8975be661bc48197d5ce424643c9a5@plan9.bell-labs.com> To: 9fans@cse.psu.edu Subject: Re: [9fans] Standalone cpu/auth.. From: David Gordon Hogan MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Date: Wed, 15 May 2002 21:11:20 -0400 Topicbox-Message-UUID: 93d93f26-eaca-11e9-9e20-41e7f4b1d025 > I just tried the cpu/auth standalone on a dual PIII with Intel > server mother board. At boot time, i see the message.. > ..... > pcirouting: South bridge FFFF, FFFF not found > ..... > pcirouting: Can't find south bridge PCI 255.37.7 The first message is ``impossible''. I'd love to know why it's happening. The second one is just improbable. What does the "pci" command report? Also, here is a program for dumping the contents of the BIOS PCI routing table, please save it as "pcir.c", compile and run, then send me the output: #include #include typedef struct Router Router; typedef struct Slot Slot; struct Slot { uchar bus; // Pci bus number uchar dev; // Pci device number uchar maps[12]; // Avoid structs! Link and mask. uchar slot; // Add-in/built-in slot uchar reserved; }; struct Router { uchar signature[4]; // Routing table signature uchar version[2]; // Version number uchar size[2]; // Total table size uchar bus; // Interrupt router bus number uchar devfn; // Router's devfunc uchar pciirqs[2]; // Exclusive PCI irqs uchar compat[4]; // Compatible PCI interrupt router uchar miniport[4]; // Miniport data uchar reserved[11]; uchar checksum; }; #define GET2(p) ((p)[0]|((p)[1]<<8)) #define DEV(devfn) (devfn>>3) #define FN(devfn) (devfn&7) void main(int argc, char *argv[]) { Slot *e; Router *r; int fd, size, i; char file[64]; uchar *buf, *p, *ep, *m; USED(argc, argv); snprint(file, sizeof file, "#p/%d/mem", getpid()); fd = open(file, OREAD); if(fd < 0) sysfatal("open proc mem"); if(seek(fd, 0x80000000|0xf0000, 0) < 0) sysfatal("seek proc mem"); buf = malloc(0x10000); if(read(fd, buf, 0x10000) != 0x10000) sysfatal("read proc mem"); ep = buf+0x10000; for(p = buf; p < ep; p += 16) if(p[0] == '$' && p[1] == 'P' && p[2] == 'I' && p[3] == 'R') break; if(p == ep) { fprint(2, "pcir: PCI routing table not found\n"); exits("not found"); } r = (Router *)p; print("PCI interrupt routing table version %d.%d at %.5ux\n", r->version[1], r->version[0], p-buf+0xf0000); print("South Bridge %d.%d.%d, irqs %.4uX compat %.4uX/%.4uX\n", r->bus, DEV(r->devfn), FN(r->devfn), GET2(r->pciirqs), GET2(&r->compat[0]), GET2(&r->compat[2])); print("miniport data: %.2uX %.2uX %.2uX %.2uX\n", r->miniport[0], r->miniport[1], r->miniport[2], r->miniport[3]); size = GET2(r->size); for(e = (Slot *)&r[1]; (uchar *)e < p + size; e++) { print("%d.%d.%d %.2uX:\t", e->bus, DEV(e->dev), FN(e->dev), e->slot); for(i = 0; i != 4; i++) { m = &e->maps[i * 3]; print("[%d] %.2uX %.4uX ", i, m[0], (m[2] << 8)|m[1]); } print("\n"); } exits(nil); }