]> Joshua Wise's Git repositories - netwatch.git/blob - aseg/counter.c
ccfff7254d9b355430ec336b8c1e2e13364d64e7
[netwatch.git] / aseg / counter.c
1 #include <io.h>
2 #include <smram.h>
3 #include <video_defines.h>
4 #include <minilib.h>
5
6 unsigned int counter = 0;
7 unsigned long pcisave;
8 unsigned char vgasave;
9 char thestr[512];
10 char logents[4][41] = {{0}};
11
12 #define VRAM_BASE               0xA0000UL
13 #define TEXT_CONSOLE_OFFSET     0x18000UL 
14
15 #define TEXT_CONSOLE_BASE       (VRAM_BASE + TEXT_CONSOLE_OFFSET)
16
17 #define COLOR                   0x1F
18
19 unsigned char vga_read(unsigned char idx)
20 {
21         outb(CRTC_IDX_REG, idx);
22         return inb(CRTC_DATA_REG);
23 }
24
25 char * vga_base()
26 {
27         return (char *) (
28                 TEXT_CONSOLE_BASE
29                 | (((unsigned int) vga_read(CRTC_START_ADDR_LSB_IDX)) << 9)
30                 | (((unsigned int) vga_read(CRTC_START_ADDR_MSB_IDX)) << 1)
31         );
32 }
33
34 void strblit(char *src, int row, int col)
35 {
36         char *destp = vga_base() + row * 80 * 2 + col * 2;
37         smram_state_t old_state = smram_save_state();
38
39         smram_aseg_set_state(SMRAM_ASEG_SMMCODE);
40         
41         while (*src)
42         {
43                 *(destp++) = *(src++);
44                 *(destp++) = COLOR;
45         }
46
47         smram_restore_state(old_state);
48 }
49
50 void outlog()
51 {
52         int y, x;
53         char *basep = vga_base();
54
55         smram_state_t old_state = smram_save_state();
56
57         smram_aseg_set_state(SMRAM_ASEG_SMMCODE);
58
59         for (y = 0; y < 4; y++)
60                 for (x = 40; x < 80; x++)
61                 {
62                         basep[y*80*2+x*2] = ' ';
63                         basep[y*80*2+x*2+1] = 0x1F;
64                 }
65
66         smram_restore_state(old_state);
67
68         for (y = 0; y < 4; y++)
69                 strblit(logents[y], y, 40);
70 }
71
72 void dolog(char *s)
73 {
74         memmove(logents[0], logents[1], sizeof(logents[0])*3);
75         strcpy(logents[3], s);
76 }
77
78 void pci_dump() {
79         char s[40];
80         unsigned long cts;
81         static int curdev = 0;  /* 0 if kbd, 1 if mouse */
82                 
83         cts = inl(0x84C);
84         
85         outl(0x848, 0x0);
86         
87         switch(cts&0xF0000)
88         {
89         case 0x20000:
90         {
91                 unsigned char b;
92                 strcpy(s, "READxxxxxxxxxxxxxxxx");
93                 tohex(s+4, cts);
94                 b = inb(cts & 0xFFFF);
95                 tohex(s+12, b);
96                 if ((cts & 0xFFFF) == 0x64)
97                         curdev = (b & 0x20) ? 1 : 0;
98                 if ((curdev == 0) && ((cts & 0xFFFF) == 0x60) && (b == 0x01))
99                         outb(0xCF9, 0x4);
100                 dolog(s);
101                 *(unsigned char*)0xAFFD0 /* EAX */ = b;
102                 break;
103         }
104         case 0x30000:
105         {
106                 unsigned char b;
107                 
108                 strcpy(s, "WRITxxxxxxxxxxxxxxxx");
109                 b = *(unsigned char*)0xAFFD0 /* EAX */;
110                 tohex(s+4, cts);
111                 tohex(s+12, b);
112                 dolog(s);
113                 outb(cts & 0xFFFF, b);
114                 break;
115         }
116         default:
117                 dolog("Unhandled PCI cycle");
118         }
119 }
120
121 void __start (void)
122 {
123         static int first = 1;
124         
125         pcisave = inl(0xCF8);
126         vgasave = inb(0x3D4);
127         
128         if (first)
129         {
130                 first = 0;
131                 dolog("NetWatch running...");
132         }
133
134         counter++;
135         outb(0x80, (counter & 0xFF));
136         
137         strcpy(thestr, "15-412! xxxxxxxx xxxxxxxx");
138         tohex(thestr + 8, inl(0x0834));
139         tohex(thestr + 17, counter);
140         strblit(thestr, 0, 0);
141         
142         if (inl(0x834) & 0x20)
143                 dolog("Warning: unhandled APM access");
144         if (inl(0x834) & 0x1000)
145         {
146                 if (inl(0x844) & 0x1000)        /* devact_sts */
147                 {
148                         pci_dump();
149                         outl(0x848, 0x1000);
150                         outl(0x844, 0x1000);
151                 }
152         }
153         if (inl(0x834) & 0x4000)
154                 dolog("Long periodic timer");
155         if (inl(0x840) & 0x1000)
156         {
157                 dolog("Caught device monitor trap");
158                 pci_dump();
159                 outl(0x840, 0x1100);
160                 outl(0x840, 0x0100);
161         }
162         if (inl(0x834) & ~(0x4160))
163         {
164                 char s[40];
165                 strcpy(s, "Unknown: xxxxxxxx");
166                 tohex(s + 9, inl(0x834) & ~(0x140));
167                 dolog(s);
168         }
169
170
171         outlog();
172         
173         outl(0xCF8, pcisave);
174         outb(0x3D4, vgasave);
175         
176         outl(0x848, 0x1000);
177         outl(0x834, /*0x40*/0xFFFF);    // ack the periodic IRQ
178         outb(0x830, (inb(0x830) | 0x2) & ~0x40);
179         outb(0x830, inb(0x830) | 0x40);
180         
181 }
182
This page took 0.029021 seconds and 2 git commands to generate.