diff --git a/nel_os_kernel/src/vmm/x86_64/intel/io.rs b/nel_os_kernel/src/vmm/x86_64/intel/io.rs index c8f2432..af15d6d 100644 --- a/nel_os_kernel/src/vmm/x86_64/intel/io.rs +++ b/nel_os_kernel/src/vmm/x86_64/intel/io.rs @@ -61,7 +61,6 @@ pub struct Pic { pub primary_read_sel: ReadSel, pub secondary_read_sel: ReadSel, pub serial: Serial, - pub serial_buffer: SerialBuffer, } impl Pic { @@ -80,7 +79,6 @@ impl Pic { primary_read_sel: ReadSel::Irr, secondary_read_sel: ReadSel::Irr, serial: Serial::default(), - serial_buffer: SerialBuffer::default(), } } @@ -202,7 +200,7 @@ impl Pic { 0x20..=0x21 => self.handle_pic_in(regs, qual), 0xA0..=0xA1 => self.handle_pic_in(regs, qual), 0x0070..=0x0071 => regs.rax = 0, - 0x03F..=0x03FF => self.handle_serial_in(regs, qual), + 0x03F8..=0x03FF => self.handle_serial_in(regs, qual), _ => regs.rax = 0, } } @@ -237,17 +235,7 @@ impl Pic { fn handle_serial_out(&mut self, regs: &mut GuestRegisters, qual: QualIo) { match qual.port() { - 0x3F8 => { - let byte = regs.rax as u8; - if self.serial_buffer.end < self.serial_buffer.buffer.len() { - self.serial_buffer.buffer[self.serial_buffer.end] = byte; - self.serial_buffer.end += 1; - } - - if byte == b'\n' || self.serial_buffer.end == self.serial_buffer.buffer.len() { - self.serial_buffer.flush(); - } - } + 0x3F8 => serial::write_byte(regs.rax as u8), 0x3F9 => self.serial.ier = regs.rax as u8, 0x3FA => {} 0x3FB => {} @@ -382,6 +370,7 @@ impl IOBitmap { } self.set_io_ports(0x0040..=0x0047); + self.set_io_ports(0x02F8..=0x03EF); vmwrite(vmcs::control::IO_BITMAP_A_ADDR_FULL, bitmap_a_addr as u64)?; vmwrite(vmcs::control::IO_BITMAP_B_ADDR_FULL, bitmap_b_addr as u64)?; @@ -418,30 +407,3 @@ impl IOBitmap { } } } - -#[derive(Debug, Clone, Copy)] -pub struct SerialBuffer { - pub buffer: [u8; 1024], - pub end: usize, -} - -impl SerialBuffer { - pub fn flush(&mut self) { - if self.end == 0 { - return; - } - - serial::write_bytes(&self.buffer[..self.end]); - - self.end = 0; - } -} - -impl Default for SerialBuffer { - fn default() -> Self { - Self { - buffer: [0; 1024], - end: 0, - } - } -} diff --git a/nel_os_kernel/src/vmm/x86_64/intel/qual.rs b/nel_os_kernel/src/vmm/x86_64/intel/qual.rs index a6fa188..9d69657 100644 --- a/nel_os_kernel/src/vmm/x86_64/intel/qual.rs +++ b/nel_os_kernel/src/vmm/x86_64/intel/qual.rs @@ -3,7 +3,7 @@ use core::convert::TryFrom; use core::fmt::Debug; -use modular_bitfield::prelude::{B1, B16, B32, B4, B8}; +use modular_bitfield::prelude::{B1, B16, B3, B32, B4, B9}; use modular_bitfield::{bitfield, Specifier}; #[repr(u8)] @@ -113,12 +113,12 @@ pub struct QualCr { #[repr(u64)] #[derive(Debug, Clone, Copy)] pub struct QualIo { - pub size: B4, + pub size: B3, pub direction: B1, pub string: B1, pub rep: B1, pub operand_encoding: B1, - _reserved1: B8, + _reserved1: B9, pub port: B16, _reserved2: B32, }