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");