3 #include "pci-userspace.h"
7 #define SUCCESSFUL 0x00
8 #define DEVICE_NOT_FOUND 0x86
9 #define BAD_REGISTER_NUMBER 0x87
11 void x86emu_dump_xregs(void);
18 pciVideoPtr pvp = NULL;
21 printf("\nint1a encountered.\n");
22 //x86emu_dump_xregs();
27 X86_EAX = 0x00; /* no config space/special cycle support */
28 X86_AL = 0x01; /* config mechanism 1 */
29 X86_EDX = 0x20494350; /* " ICP" */
30 X86_EBX = 0x0210; /* Version 2.10 */
32 X86_ECX |= (pciNumBuses & 0xFF); /* Max bus number in system */
33 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
36 printf("PCI bios present.\n");
40 if (X86_DX == pvp->vendor_id && X86_CX == pvp->device_id && X86_ESI == 0) {
41 X86_EAX = X86_AL | (SUCCESSFUL << 8);
42 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
43 X86_EBX = pciSlotBX(pvp);
45 #ifdef SHOW_ALL_DEVICES
46 else if ((pvp = xf86FindPciDeviceVendor(X86_EDX, X86_ECX, X86_ESI, pvp))) {
47 X86_EAX = X86_AL | (SUCCESSFUL << 8);
48 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
49 X86_EBX = pciSlotBX(pvp);
53 X86_EAX = X86_AL | (DEVICE_NOT_FOUND << 8);
54 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
57 printf("eax=0x%x ebx=0x%x eflags=0x%x\n", X86_EAX, X86_EBX, X86_EFLAGS);
62 if (X86_CL == pvp->interface &&
63 X86_CH == pvp->subclass &&
64 ((X86_ECX & 0xFFFF0000) >> 16) == pvp->class) {
65 X86_EAX = X86_AL | (SUCCESSFUL << 8);
66 X86_EBX = pciSlotBX(pvp);
67 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
70 /* FIXME: dirty hack */
73 #ifdef SHOW_ALL_DEVICES
74 else if ((pvp = FindPciClass(X86_CL, X86_CH,
75 (X86_ECX & 0xffff0000) >> 16,
77 X86_EAX = X86_AL | (SUCCESSFUL << 8);
78 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
79 X86_EBX = pciSlotBX(pvp);
83 X86_EAX = X86_AL | (DEVICE_NOT_FOUND << 8);
84 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
87 printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
91 if ((tag = findPci(X86_EBX))) {
92 X86_CL = pciReadByte(tag, X86_EDI);
93 X86_EAX = X86_AL | (SUCCESSFUL << 8);
94 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
96 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
97 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
100 printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
104 if ((tag = findPci(X86_EBX))) {
105 X86_CX = pciReadWord(tag, X86_EDI);
106 X86_EAX = X86_AL | (SUCCESSFUL << 8);
107 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
109 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
110 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
113 printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
117 if ((tag = findPci(X86_EBX))) {
118 X86_ECX = pciReadLong(tag, X86_EDI);
119 X86_EAX = X86_AL | (SUCCESSFUL << 8);
120 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
122 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
123 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
126 printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
130 if ((tag = findPci(X86_EBX))) {
131 pciWriteByte(tag, X86_EDI, X86_CL);
132 X86_EAX = X86_AL | (SUCCESSFUL << 8);
133 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
135 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
136 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
139 printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
143 if ((tag = findPci(X86_EBX))) {
144 pciWriteWord(tag, X86_EDI, X86_CX);
145 X86_EAX = X86_AL | (SUCCESSFUL << 8);
146 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
148 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
149 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
152 printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
156 if ((tag = findPci(X86_EBX))) {
157 pciWriteLong(tag, X86_EDI, X86_ECX);
158 X86_EAX = X86_AL | (SUCCESSFUL << 8);
159 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
161 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
162 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
165 printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
169 printf("int1a: subfunction not implemented.\n");