blob: 48aa13e9a1c7b2670b42b2c5d42e29b461fe144c [file] [log] [blame]
Li-Ta Lo81521262004-07-08 17:18:27 +00001#include <stdio.h>
2#include "test.h"
3#include "pci-userspace.h"
4
5#define DEBUG_INT1A
6
7#define SUCCESSFUL 0x00
8#define DEVICE_NOT_FOUND 0x86
9#define BAD_REGISTER_NUMBER 0x87
10
11void x86emu_dump_xregs(void);
12extern int verbose;
13
14
15int int1A_handler()
16{
17 PCITAG tag;
18 pciVideoPtr pvp = NULL;
19
20 if (verbose) {
21 printf("\nint1a encountered.\n");
22 x86emu_dump_xregs();
23 }
24
25 switch (X86_AX) {
26 case 0xb101:
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 */
31 X86_ECX &= 0xFF00;
32 X86_ECX |= (pciNumBuses & 0xFF); /* Max bus number in system */
33 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
34#ifdef DEBUG_INT1A
35 if (verbose)
36 printf("PCI bios present.\n");
37#endif
38 return 1;
39 case 0xb102:
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);
44 }
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);
50 }
51#endif
52 else {
53 X86_EAX = X86_AL | (DEVICE_NOT_FOUND << 8);
54 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
55 }
56#ifdef DEBUG_INT1A
57 printf("eax=0x%x ebx=0x%x eflags=0x%x\n", X86_EAX, X86_EBX, X86_EFLAGS);
58#endif
59 return 1;
60 case 0xb103:
61#if 0
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 */
68 }
69#else
70 /* FIXME: dirty hack */
71 if (0);
72#endif
73#ifdef SHOW_ALL_DEVICES
74 else if ((pvp = FindPciClass(X86_CL, X86_CH,
75 (X86_ECX & 0xffff0000) >> 16,
76 X86_ESI, pvp))) {
77 X86_EAX = X86_AL | (SUCCESSFUL << 8);
78 X86_EFLAGS &= ~((unsigned long) 0x01); /* clear carry flag */
79 X86_EBX = pciSlotBX(pvp);
80 }
81#endif
82 else {
83 X86_EAX = X86_AL | (DEVICE_NOT_FOUND << 8);
84 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
85 }
86#ifdef DEBUG_INT1A
87 printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
88#endif
89 return 1;
90 case 0xb108:
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 */
95 } else {
96 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
97 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
98 }
99#ifdef DEBUG_INT1A
100 printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
101#endif
102 return 1;
103 case 0xb109:
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 */
108 } else {
109 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
110 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
111 }
112#ifdef DEBUG_INT1A
113 printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
114#endif
115 return 1;
116 case 0xb10a:
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 */
121 } else {
122 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
123 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
124 }
125#ifdef DEBUG_INT1A
126 printf("eax=0x%x ecx=0x%x eflags=0x%x\n", X86_EAX, X86_ECX, X86_EFLAGS);
127#endif
128 return 1;
129 case 0xb10b:
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 */
134 } else {
135 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
136 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
137 }
138#ifdef DEBUG_INT1A
139 printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
140#endif
141 return 1;
142 case 0xb10c:
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 */
147 } else {
148 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
149 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
150 }
151#ifdef DEBUG_INT1A
152 printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
153#endif
154 return 1;
155 case 0xb10d:
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 */
160 } else {
161 X86_EAX = X86_AL | (BAD_REGISTER_NUMBER << 8);
162 X86_EFLAGS |= ((unsigned long) 0x01); /* set carry flag */
163 }
164#ifdef DEBUG_INT1A
165 printf("eax=0x%x eflags=0x%x\n", X86_EAX, X86_EFLAGS);
166#endif
167 return 1;
168 default:
169 printf("int1a: subfunction not implemented.\n");
170 return 0;
171 }
172}