From 7817122662fc03b7d5deef7b791d40473cdbf581 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 24 Mar 2017 20:38:02 -0600 Subject: [PATCH] Loop on serial input Fix issue with serial and cascade interrupts not being ackd --- arch/x86_64/src/device/serial.rs | 12 +++++++----- arch/x86_64/src/interrupt/irq.rs | 3 +++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/x86_64/src/device/serial.rs b/arch/x86_64/src/device/serial.rs index 02037da..87e18c7 100644 --- a/arch/x86_64/src/device/serial.rs +++ b/arch/x86_64/src/device/serial.rs @@ -85,13 +85,15 @@ impl SerialPort { } pub fn on_receive(&mut self) { - let data = self.data.read(); + while self.line_sts().contains(INPUT_FULL) { + let data = self.data.read(); - extern { - fn debug_input(byte: u8); + extern { + fn debug_input(byte: u8); + } + + unsafe { debug_input(data) }; } - - unsafe { debug_input(data) }; } } diff --git a/arch/x86_64/src/interrupt/irq.rs b/arch/x86_64/src/interrupt/irq.rs index f6f3862..a83a33f 100644 --- a/arch/x86_64/src/interrupt/irq.rs +++ b/arch/x86_64/src/interrupt/irq.rs @@ -50,14 +50,17 @@ interrupt!(keyboard, { interrupt!(cascade, { // No need to do any operations on cascade + pic::MASTER.ack(); }); interrupt!(com2, { COM2.lock().on_receive(); + pic::MASTER.ack(); }); interrupt!(com1, { COM1.lock().on_receive(); + pic::MASTER.ack(); }); interrupt!(lpt2, {