]> Joshua Wise's Git repositories - netwatch.git/blame - aseg/counter.c
more reliable keyboard injection
[netwatch.git] / aseg / counter.c
CommitLineData
035d7af7 1#include <io.h>
36ce375d
JP
2#include <smram.h>
3#include <video_defines.h>
4#include <minilib.h>
d71d9872 5#include <smi.h>
4d898e0b 6#include <pci-bother.h>
3e6d6106 7#include "../net/net.h"
91a6abf7 8#include "vga-overlay.h"
0cd80c51 9#include "packet.h"
50d89a31 10#include "keyboard.h"
36ce375d 11
91a6abf7 12unsigned int counter = 0;
d9de6545 13unsigned int lastctr = 0;
91a6abf7
JP
14unsigned long pcisave;
15unsigned char vgasave;
d9de6545
JW
16static int curdev = 0; /* 0 if kbd, 1 if mouse */
17
18static void cause_kbd_irq()
19{
20 outl(0x844, 0x0);
21 outl(0x848, 0x0);
22 while (inb(0x64) & 0x1)
23 inb(0x60);
24 outb(0x60, 0xee); /* Cause an IRQ. */
25 while (!(inb(0x64) & 0x1))
26 ;
27 while (inb(0x64) & 0x1)
28 inb(0x60);
29}
4bea7daf 30
98765740 31void pci_dump() {
98765740 32 unsigned long cts;
98765740
JP
33
34 cts = inl(0x84C);
35
85bc8ca6 36 outl(0x840, 0x0);
d9de6545 37 outl(0x848, 0x0);
98765740
JP
38 switch(cts&0xF0000)
39 {
40 case 0x20000:
41 {
42 unsigned char b;
c3c652f7
JW
43
44 switch (cts & 0xFFFF)
50d89a31 45 {
c3c652f7
JW
46 case 0x64:
47 /* Read the real hardware and mask in our OBF if need be. */
48 b = inb(0x64);
49 if (kbd_has_injected_scancode())
50 {
d9de6545
JW
51 dologf("OS wants to know; we have data");
52 lastctr = counter;
c3c652f7
JW
53 b |= 0x01;
54 b &= ~0x20; /* no mouse for you! */
55 curdev = 0;
56 } else
57 curdev = (b & 0x20) ? 1 : 0;
58 *(unsigned char*)0xAFFD0 /* EAX */ = b;
59 break;
60 case 0x60:
d9de6545 61 if (kbd_has_injected_scancode())
c3c652f7 62 {
50d89a31 63 b = kbd_get_injected_scancode();
d9de6545
JW
64 lastctr = counter;
65 inb(0x60);
c3c652f7
JW
66 } else
67 b = inb(0x60);
68 if ((curdev == 0) && (b == 0x01)) { /* Escape */
69 outb(0xCF9, 0x4); /* Reboot */
70 return;
50d89a31 71 }
d9de6545
JW
72
73 /* If there is more nus to come, generate another IRQ. */
74 if (kbd_has_injected_scancode())
75 cause_kbd_irq();
76
c3c652f7
JW
77 *(unsigned char*)0xAFFD0 /* EAX */ = b;
78 break;
50d89a31
JP
79 }
80
98765740
JP
81 *(unsigned char*)0xAFFD0 /* EAX */ = b;
82 break;
83 }
84 case 0x30000:
85 {
86 unsigned char b;
87
98765740 88 b = *(unsigned char*)0xAFFD0 /* EAX */;
34205a17 89 dologf("WRITE: %08x (%02x)", cts, b);
98765740
JP
90 outb(cts & 0xFFFF, b);
91 break;
92 }
93 default:
94 dolog("Unhandled PCI cycle");
95 }
85bc8ca6 96
d9de6545 97 outl(0x844, 0x1000);
85bc8ca6 98 outl(0x848, 0x1000);
98765740
JP
99}
100
07d1dd26
JW
101void timer_handler(smi_event_t ev)
102{
103 static unsigned int ticks = 0;
104
105 smi_disable_event(SMI_EVENT_FAST_TIMER);
106 smi_enable_event(SMI_EVENT_FAST_TIMER);
107
d9de6545
JW
108 if (kbd_has_injected_scancode() && (counter > (lastctr + 2)))
109 {
110 smi_disable_event(SMI_EVENT_DEVTRAP_KBC);
111 dolog("Kicking timer");
112 cause_kbd_irq();
113 smi_enable_event(SMI_EVENT_DEVTRAP_KBC);
114 }
115
07d1dd26
JW
116 outb(0x80, (ticks++) & 0xFF);
117
118 outlog();
119}
120
8a677ebb
JW
121void kbc_handler(smi_event_t ev)
122{
123 pci_dump();
124}
125
73fb9b4c
JW
126void gbl_rls_handler(smi_event_t ev)
127{
128 unsigned long ecx;
129
7d252e04 130 ecx = *(unsigned long*)0xAFFD4;
0cd80c51
JP
131
132 packet_t * packet = check_packet(ecx);
133 if (!packet)
134 {
135 dologf("WARN: bad packet at %08x", ecx);
136 return;
137 }
138
139 dologf("Got packet: type %08x", packet->type);
140
d5cffad7
JP
141 if (packet->type == 42) {
142 dump_log((char *)packet->data);
143 *(unsigned long*)0xAFFD4 = 42;
50d89a31
JP
144 } else if (packet->type == 0xAA) {
145 kbd_inject_key('A');
d5cffad7
JP
146 } else {
147 *(unsigned long*)0xAFFD4 = 0x2BADD00D;
148 }
73fb9b4c
JW
149}
150
d71d9872 151void smi_entry(void)
015cd976 152{
34205a17
JW
153 char statstr[512];
154
035d7af7
JW
155 pcisave = inl(0xCF8);
156 vgasave = inb(0x3D4);
4d898e0b 157 pci_unbother_all();
31be35cd 158
4bea7daf 159 counter++;
34205a17
JW
160 sprintf(statstr, "15-412! %08x %08x", smi_status(), counter);
161 strblit(statstr, 0, 0);
035d7af7 162
3b3161a1 163 eth_poll();
e8351f1a 164
98765740
JP
165 if (inl(0x840) & 0x1000)
166 {
98765740
JP
167 pci_dump();
168 outl(0x840, 0x1100);
169 outl(0x840, 0x0100);
170 }
98765740 171
4fb81ad0 172 smi_poll();
035d7af7 173
4d898e0b 174 pci_bother_all();
035d7af7
JW
175 outl(0xCF8, pcisave);
176 outb(0x3D4, vgasave);
4bea7daf
JW
177}
178
This page took 0.042359 seconds and 4 git commands to generate.