aboutsummaryrefslogtreecommitdiff
path: root/src/mouse.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2009-01-04 12:20:02 -0500
committerKevin O'Connor <kevin@koconnor.net>2009-01-04 12:20:02 -0500
commit0234cd90be8805b1951b4411de81314d27518eea (patch)
treec7149c6dc8313909b66935d3d34f4ca281fdfb1b /src/mouse.c
parent7bb3253a0545c551ff25cc66dddf914a6f4a2928 (diff)
downloadseabios-hppa-0234cd90be8805b1951b4411de81314d27518eea.zip
seabios-hppa-0234cd90be8805b1951b4411de81314d27518eea.tar.gz
seabios-hppa-0234cd90be8805b1951b4411de81314d27518eea.tar.bz2
Make sure ps2 port command reads are from the desired device.
Discard reads from real-time events or from a different device. Also, improve the kbd/mouse diagnostic messages.
Diffstat (limited to 'src/mouse.c')
-rw-r--r--src/mouse.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/mouse.c b/src/mouse.c
index 65baa20..b57a7e7 100644
--- a/src/mouse.c
+++ b/src/mouse.c
@@ -111,7 +111,7 @@ mouse_15c201(struct bregs *regs)
static void
mouse_15c202(struct bregs *regs)
{
- static u8 sample_rates[7] = {10, 20, 40, 60, 80, 100, 200};
+ static u8 VAR16 sample_rates[7] = {10, 20, 40, 60, 80, 100, 200};
if (regs->bh >= ARRAY_SIZE(sample_rates)) {
set_code_fail(regs, RET_EINVINPUT);
return;
@@ -285,15 +285,8 @@ handle_15c2(struct bregs *regs)
}
static void
-int74_function()
+process_mouse(u8 data)
{
- u8 v = inb(PORT_PS2_STATUS);
- if ((v & 0x21) != 0x21) {
- dprintf(1, "int74 but no mouse data.\n");
- return;
- }
- v = inb(PORT_PS2_DATA);
-
u16 ebda_seg = get_ebda_seg();
u8 mouse_flags_1 = GET_EBDA2(ebda_seg, mouse_flag1);
u8 mouse_flags_2 = GET_EBDA2(ebda_seg, mouse_flag2);
@@ -304,7 +297,7 @@ int74_function()
u8 package_count = mouse_flags_2 & 0x07;
u8 index = mouse_flags_1 & 0x07;
- SET_EBDA2(ebda_seg, mouse_data[index], v);
+ SET_EBDA2(ebda_seg, mouse_data[index], data);
if ((index+1) < package_count) {
mouse_flags_1++;
@@ -345,7 +338,15 @@ handle_74()
if (! CONFIG_PS2_MOUSE)
goto done;
- int74_function();
+ u8 v = inb(PORT_PS2_STATUS);
+ if ((v & (I8042_STR_OBF|I8042_STR_AUXDATA))
+ != (I8042_STR_OBF|I8042_STR_AUXDATA)) {
+ dprintf(1, "mouse irq but no mouse data.\n");
+ goto done;
+ }
+ v = inb(PORT_PS2_DATA);
+
+ process_mouse(v);
done:
eoi_pic2();