Skip to content

Commit 894f9d1

Browse files
committed
Fix output
1 parent c2f90fc commit 894f9d1

File tree

18 files changed

+166
-114
lines changed

18 files changed

+166
-114
lines changed

mythril/src/device/acpi.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::device::{
2-
DeviceRegion, EmulatedDevice, Port, PortReadRequest, PortWriteRequest,
2+
DeviceRegion, EmulatedDevice, InterruptArray, Port, PortReadRequest,
3+
PortWriteRequest,
34
};
45
use crate::error::Result;
56
use crate::memory::GuestAddressSpaceViewMut;
@@ -74,26 +75,26 @@ impl EmulatedDevice for AcpiRuntime {
7475
port: Port,
7576
mut val: PortReadRequest,
7677
_space: GuestAddressSpaceViewMut,
77-
) -> Result<()> {
78+
) -> Result<InterruptArray> {
7879
if port == self.pmtimer() {
7980
let on_duration = time::now() - time::system_start_time();
8081
let pm_time =
8182
(on_duration.as_nanos() * PMTIMER_HZ as u128) / 1_000_000_000;
8283
val.copy_from_u32(pm_time as u32);
8384
}
84-
Ok(())
85+
Ok(InterruptArray::default())
8586
}
8687

8788
fn on_port_write(
8889
&mut self,
8990
port: Port,
9091
val: PortWriteRequest,
9192
_space: GuestAddressSpaceViewMut,
92-
) -> Result<()> {
93+
) -> Result<InterruptArray> {
9394
info!(
9495
"Attempt to write to AcpiRuntime port=0x{:x}, val={}. Ignoring",
9596
port, val
9697
);
97-
Ok(())
98+
Ok(InterruptArray::default())
9899
}
99100
}

mythril/src/device/com.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::device::{
2-
DeviceRegion, EmulatedDevice, Port, PortReadRequest, PortWriteRequest,
2+
DeviceRegion, EmulatedDevice, InterruptArray, Port, PortReadRequest,
3+
PortWriteRequest,
34
};
45
use crate::error::Result;
56
use crate::logger;
@@ -44,8 +45,7 @@ impl ComDevice {
4445
base_port,
4546
buff: vec![],
4647

47-
// For now, transmitter holding register is always empty
48-
interrupt_identification_register: 0x02,
48+
interrupt_identification_register: 0x01,
4949

5050
..Default::default()
5151
})
@@ -66,7 +66,7 @@ impl EmulatedDevice for ComDevice {
6666
port: Port,
6767
mut val: PortReadRequest,
6868
_space: GuestAddressSpaceViewMut,
69-
) -> Result<()> {
69+
) -> Result<InterruptArray> {
7070
if port - self.base_port == SerialOffset::DATA
7171
&& self.divisor_latch_bit_set()
7272
{
@@ -79,23 +79,26 @@ impl EmulatedDevice for ComDevice {
7979

8080
if port - self.base_port == SerialOffset::IIR {
8181
val.copy_from_u32(self.interrupt_identification_register as u32);
82+
83+
// Reading the IIR clears it (the LSB = 1 indicates there is _not_ a
84+
// pending interrupt)
85+
self.interrupt_identification_register = 1;
8286
} else if port - self.base_port == SerialOffset::IER {
8387
val.copy_from_u32(self.interrupt_enable_register as u32);
8488
}
8589

8690
if port - self.base_port == SerialOffset::LSR {
87-
val.copy_from_u32(0x20);
91+
val.copy_from_u32(0x60);
8892
}
89-
90-
Ok(())
93+
Ok(InterruptArray::default())
9194
}
9295

9396
fn on_port_write(
9497
&mut self,
9598
port: Port,
9699
val: PortWriteRequest,
97100
_space: GuestAddressSpaceViewMut,
98-
) -> Result<()> {
101+
) -> Result<InterruptArray> {
99102
let val: u8 = val.try_into()?;
100103
if port - self.base_port == SerialOffset::DATA {
101104
if self.divisor_latch_bit_set() {
@@ -107,6 +110,12 @@ impl EmulatedDevice for ComDevice {
107110
logger::write_console(&format!("GUEST{}: {}", self.id, s));
108111
self.buff.clear();
109112
}
113+
let mut arr = InterruptArray::default();
114+
if self.interrupt_enable_register & 0b00000010 == 0b10 {
115+
arr.push(52);
116+
}
117+
self.interrupt_identification_register = 0b10;
118+
return Ok(arr);
110119
}
111120
} else if port - self.base_port == SerialOffset::DLL
112121
&& self.divisor_latch_bit_set()
@@ -120,6 +129,6 @@ impl EmulatedDevice for ComDevice {
120129
self.interrupt_enable_register = val;
121130
}
122131

123-
Ok(())
132+
Ok(InterruptArray::default())
124133
}
125134
}

mythril/src/device/debug.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::device::{
2-
DeviceRegion, EmulatedDevice, Port, PortReadRequest, PortWriteRequest,
2+
DeviceRegion, EmulatedDevice, InterruptArray, Port, PortReadRequest,
3+
PortWriteRequest,
34
};
45
use crate::error::Result;
56
use crate::logger;
@@ -34,18 +35,18 @@ impl EmulatedDevice for DebugPort {
3435
_port: Port,
3536
mut val: PortReadRequest,
3637
_space: GuestAddressSpaceViewMut,
37-
) -> Result<()> {
38+
) -> Result<InterruptArray> {
3839
// This is a magical value (called BOCHS_DEBUG_PORT_MAGIC by edk2)
3940
val.copy_from_u32(0xe9);
40-
Ok(())
41+
Ok(InterruptArray::default())
4142
}
4243

4344
fn on_port_write(
4445
&mut self,
4546
_port: Port,
4647
val: PortWriteRequest,
4748
_space: GuestAddressSpaceViewMut,
48-
) -> Result<()> {
49+
) -> Result<InterruptArray> {
4950
self.buff.extend_from_slice(val.as_slice());
5051

5152
// Flush on newlines
@@ -55,6 +56,6 @@ impl EmulatedDevice for DebugPort {
5556
logger::write_console(&format!("GUEST{}: {}", self.id, s));
5657
self.buff.clear();
5758
}
58-
Ok(())
59+
Ok(InterruptArray::default())
5960
}
6061
}

mythril/src/device/dma.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::device::{
2-
DeviceRegion, EmulatedDevice, Port, PortReadRequest, PortWriteRequest,
2+
DeviceRegion, EmulatedDevice, InterruptArray, Port, PortReadRequest,
3+
PortWriteRequest,
34
};
45
use crate::error::Result;
56
use crate::memory::GuestAddressSpaceViewMut;
@@ -50,16 +51,16 @@ impl EmulatedDevice for Dma8237 {
5051
_port: Port,
5152
_val: PortReadRequest,
5253
_space: GuestAddressSpaceViewMut,
53-
) -> Result<()> {
54-
Ok(())
54+
) -> Result<InterruptArray> {
55+
Ok(InterruptArray::default())
5556
}
5657

5758
fn on_port_write(
5859
&mut self,
5960
_port: Port,
6061
_val: PortWriteRequest,
6162
_space: GuestAddressSpaceViewMut,
62-
) -> Result<()> {
63-
Ok(())
63+
) -> Result<InterruptArray> {
64+
Ok(InterruptArray::default())
6465
}
6566
}

mythril/src/device/ignore.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::device::{
2-
DeviceRegion, EmulatedDevice, Port, PortReadRequest, PortWriteRequest,
2+
DeviceRegion, EmulatedDevice, InterruptArray, Port, PortReadRequest,
3+
PortWriteRequest,
34
};
45
use crate::error::Result;
56
use crate::memory::GuestAddressSpaceViewMut;
@@ -36,16 +37,16 @@ impl EmulatedDevice for IgnoredDevice {
3637
_port: Port,
3738
_val: PortReadRequest,
3839
_space: GuestAddressSpaceViewMut,
39-
) -> Result<()> {
40-
Ok(())
40+
) -> Result<InterruptArray> {
41+
Ok(InterruptArray::default())
4142
}
4243

4344
fn on_port_write(
4445
&mut self,
4546
_port: Port,
4647
_val: PortWriteRequest,
4748
_space: GuestAddressSpaceViewMut,
48-
) -> Result<()> {
49-
Ok(())
49+
) -> Result<InterruptArray> {
50+
Ok(InterruptArray::default())
5051
}
5152
}

mythril/src/device/keyboard.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::device::{
2-
DeviceRegion, EmulatedDevice, Port, PortReadRequest, PortWriteRequest,
2+
DeviceRegion, EmulatedDevice, InterruptArray, Port, PortReadRequest,
3+
PortWriteRequest,
34
};
45
use crate::error::Result;
56
use crate::memory::GuestAddressSpaceViewMut;
@@ -31,18 +32,18 @@ impl EmulatedDevice for Keyboard8042 {
3132
_port: Port,
3233
mut val: PortReadRequest,
3334
_space: GuestAddressSpaceViewMut,
34-
) -> Result<()> {
35+
) -> Result<InterruptArray> {
3536
//FIXME: For now just return 0xff for everything
3637
val.copy_from_u32(0xff);
37-
Ok(())
38+
Ok(InterruptArray::default())
3839
}
3940

4041
fn on_port_write(
4142
&mut self,
4243
_port: Port,
4344
_val: PortWriteRequest,
4445
_space: GuestAddressSpaceViewMut,
45-
) -> Result<()> {
46-
Ok(())
46+
) -> Result<InterruptArray> {
47+
Ok(InterruptArray::default())
4748
}
4849
}

mythril/src/device/lapic.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::device::{
2-
DeviceRegion, EmulatedDevice, MemReadRequest, MemWriteRequest,
2+
DeviceRegion, EmulatedDevice, InterruptArray, MemReadRequest,
3+
MemWriteRequest,
34
};
45
use crate::error::Result;
56
use crate::memory::{GuestAddressSpaceViewMut, GuestPhysAddr};
@@ -37,22 +38,22 @@ impl EmulatedDevice for LocalApic {
3738
addr: GuestPhysAddr,
3839
data: MemReadRequest,
3940
_space: GuestAddressSpaceViewMut,
40-
) -> Result<()> {
41+
) -> Result<InterruptArray> {
4142
info!(
4243
"local apic read of addr = {:?} (len=0x{:x})",
4344
addr,
4445
data.as_slice().len()
4546
);
46-
Ok(())
47+
Ok(InterruptArray::default())
4748
}
4849

4950
fn on_mem_write(
5051
&mut self,
5152
addr: GuestPhysAddr,
5253
data: MemWriteRequest,
5354
_space: GuestAddressSpaceViewMut,
54-
) -> Result<()> {
55+
) -> Result<InterruptArray> {
5556
info!("local apic write of addr = {:?} (data={:?})", addr, data);
56-
Ok(())
57+
Ok(InterruptArray::default())
5758
}
5859
}

mythril/src/device/mod.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use alloc::boxed::Box;
44
use alloc::collections::btree_map::BTreeMap;
55
use alloc::rc::Rc;
66
use alloc::vec::Vec;
7+
use arrayvec::ArrayVec;
78
use core::cmp::Ordering;
89
use core::convert::{TryFrom, TryInto};
910
use core::fmt;
@@ -24,6 +25,8 @@ pub mod qemu_fw_cfg;
2425
pub mod rtc;
2526
pub mod vga;
2627

28+
const MAX_EVENT_INTERRUPTS: usize = 8;
29+
pub type InterruptArray = ArrayVec<[u8; MAX_EVENT_INTERRUPTS]>;
2730
pub type Port = u16;
2831

2932
#[derive(Eq, PartialEq)]
@@ -191,7 +194,7 @@ pub trait EmulatedDevice {
191194
_addr: GuestPhysAddr,
192195
_data: MemReadRequest,
193196
_space: GuestAddressSpaceViewMut,
194-
) -> Result<()> {
197+
) -> Result<InterruptArray> {
195198
Err(Error::NotImplemented(
196199
"MemoryMapped device does not support reading".into(),
197200
))
@@ -201,7 +204,7 @@ pub trait EmulatedDevice {
201204
_addr: GuestPhysAddr,
202205
_data: MemWriteRequest,
203206
_space: GuestAddressSpaceViewMut,
204-
) -> Result<()> {
207+
) -> Result<InterruptArray> {
205208
Err(Error::NotImplemented(
206209
"MemoryMapped device does not support writing".into(),
207210
))
@@ -211,7 +214,7 @@ pub trait EmulatedDevice {
211214
_port: Port,
212215
_val: PortReadRequest,
213216
_space: GuestAddressSpaceViewMut,
214-
) -> Result<()> {
217+
) -> Result<InterruptArray> {
215218
Err(Error::NotImplemented(
216219
"PortIo device does not support reading".into(),
217220
))
@@ -221,7 +224,7 @@ pub trait EmulatedDevice {
221224
_port: Port,
222225
_val: PortWriteRequest,
223226
_space: GuestAddressSpaceViewMut,
224-
) -> Result<()> {
227+
) -> Result<InterruptArray> {
225228
Err(Error::NotImplemented(
226229
"PortIo device does not support writing".into(),
227230
))

mythril/src/device/pci.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::device::{
2-
DeviceRegion, EmulatedDevice, Port, PortReadRequest, PortWriteRequest,
2+
DeviceRegion, EmulatedDevice, InterruptArray, Port, PortReadRequest,
3+
PortWriteRequest,
34
};
45
use crate::error::{Error, Result};
56
use crate::memory::GuestAddressSpaceViewMut;
@@ -207,7 +208,7 @@ impl EmulatedDevice for PciRootComplex {
207208
port: Port,
208209
mut val: PortReadRequest,
209210
_space: GuestAddressSpaceViewMut,
210-
) -> Result<()> {
211+
) -> Result<InterruptArray> {
211212
match port {
212213
Self::PCI_CONFIG_ADDRESS => {
213214
// For now, always set the enable bit
@@ -243,15 +244,15 @@ impl EmulatedDevice for PciRootComplex {
243244
)))
244245
}
245246
}
246-
Ok(())
247+
Ok(InterruptArray::default())
247248
}
248249

249250
fn on_port_write(
250251
&mut self,
251252
port: Port,
252253
val: PortWriteRequest,
253254
_space: GuestAddressSpaceViewMut,
254-
) -> Result<()> {
255+
) -> Result<InterruptArray> {
255256
match port {
256257
Self::PCI_CONFIG_ADDRESS => {
257258
let addr: u32 = val.try_into()?;
@@ -264,7 +265,7 @@ impl EmulatedDevice for PciRootComplex {
264265
);
265266
}
266267
}
267-
Ok(())
268+
Ok(InterruptArray::default())
268269
}
269270
}
270271

0 commit comments

Comments
 (0)