fix QualIO #2
All checks were successful
Check / Build ISO (nightly-2025-04-27) (push) Successful in 41s
All checks were successful
Check / Build ISO (nightly-2025-04-27) (push) Successful in 41s
This commit is contained in:
@@ -61,7 +61,6 @@ pub struct Pic {
|
|||||||
pub primary_read_sel: ReadSel,
|
pub primary_read_sel: ReadSel,
|
||||||
pub secondary_read_sel: ReadSel,
|
pub secondary_read_sel: ReadSel,
|
||||||
pub serial: Serial,
|
pub serial: Serial,
|
||||||
pub serial_buffer: SerialBuffer,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Pic {
|
impl Pic {
|
||||||
@@ -80,7 +79,6 @@ impl Pic {
|
|||||||
primary_read_sel: ReadSel::Irr,
|
primary_read_sel: ReadSel::Irr,
|
||||||
secondary_read_sel: ReadSel::Irr,
|
secondary_read_sel: ReadSel::Irr,
|
||||||
serial: Serial::default(),
|
serial: Serial::default(),
|
||||||
serial_buffer: SerialBuffer::default(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,7 +200,7 @@ impl Pic {
|
|||||||
0x20..=0x21 => self.handle_pic_in(regs, qual),
|
0x20..=0x21 => self.handle_pic_in(regs, qual),
|
||||||
0xA0..=0xA1 => self.handle_pic_in(regs, qual),
|
0xA0..=0xA1 => self.handle_pic_in(regs, qual),
|
||||||
0x0070..=0x0071 => regs.rax = 0,
|
0x0070..=0x0071 => regs.rax = 0,
|
||||||
0x03F..=0x03FF => self.handle_serial_in(regs, qual),
|
0x03F8..=0x03FF => self.handle_serial_in(regs, qual),
|
||||||
_ => regs.rax = 0,
|
_ => regs.rax = 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -237,17 +235,7 @@ impl Pic {
|
|||||||
|
|
||||||
fn handle_serial_out(&mut self, regs: &mut GuestRegisters, qual: QualIo) {
|
fn handle_serial_out(&mut self, regs: &mut GuestRegisters, qual: QualIo) {
|
||||||
match qual.port() {
|
match qual.port() {
|
||||||
0x3F8 => {
|
0x3F8 => serial::write_byte(regs.rax as u8),
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
0x3F9 => self.serial.ier = regs.rax as u8,
|
0x3F9 => self.serial.ier = regs.rax as u8,
|
||||||
0x3FA => {}
|
0x3FA => {}
|
||||||
0x3FB => {}
|
0x3FB => {}
|
||||||
@@ -382,6 +370,7 @@ impl IOBitmap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.set_io_ports(0x0040..=0x0047);
|
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_A_ADDR_FULL, bitmap_a_addr as u64)?;
|
||||||
vmwrite(vmcs::control::IO_BITMAP_B_ADDR_FULL, bitmap_b_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,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
use core::convert::TryFrom;
|
use core::convert::TryFrom;
|
||||||
use core::fmt::Debug;
|
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};
|
use modular_bitfield::{bitfield, Specifier};
|
||||||
|
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
@@ -113,12 +113,12 @@ pub struct QualCr {
|
|||||||
#[repr(u64)]
|
#[repr(u64)]
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct QualIo {
|
pub struct QualIo {
|
||||||
pub size: B4,
|
pub size: B3,
|
||||||
pub direction: B1,
|
pub direction: B1,
|
||||||
pub string: B1,
|
pub string: B1,
|
||||||
pub rep: B1,
|
pub rep: B1,
|
||||||
pub operand_encoding: B1,
|
pub operand_encoding: B1,
|
||||||
_reserved1: B8,
|
_reserved1: B9,
|
||||||
pub port: B16,
|
pub port: B16,
|
||||||
_reserved2: B32,
|
_reserved2: B32,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user