nvramtool: 64bit safe CBFS handling
[coreboot.git] / util / vgabios / int1a.c
1 #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
11 void x86emu_dump_xregs(void);
12 extern int verbose;
13
14
15 int 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 }