Files
RedBear-OS/local/recipes/drivers/redox-driver-sys/source/src/io.rs
T
2026-04-16 12:43:10 +01:00

70 lines
1.8 KiB
Rust

#[cfg(all(target_arch = "x86_64", target_os = "redox"))]
use syscall as redox_syscall;
use crate::Result;
#[cfg(all(target_arch = "x86_64", target_os = "redox"))]
pub fn acquire_iopl() -> Result<()> {
extern "C" {
fn redox_cur_thrfd_v0() -> usize;
}
let kernel_fd = redox_syscall::dup(unsafe { redox_cur_thrfd_v0() }, b"open_via_dup")?;
let res = libredox::call::call_wo(
kernel_fd,
&[],
redox_syscall::CallFlags::empty(),
&[redox_syscall::ProcSchemeVerb::Iopl as u64],
);
let _ = redox_syscall::close(kernel_fd);
res.map(|_| ()).map_err(|e| e.into())
}
#[cfg(all(target_arch = "x86_64", not(target_os = "redox")))]
pub fn acquire_iopl() -> Result<()> {
Err(crate::DriverError::Other(String::from(
"acquire_iopl: only available on Redox",
)))
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub fn inb(port: u16) -> u8 {
let val: u8;
unsafe { core::arch::asm!("inb {1:x}, {0}", out(reg_byte) val, in(reg) port) };
val
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub fn outb(port: u16, val: u8) {
unsafe { core::arch::asm!("outb {1:x}, {0}", in(reg_byte) val, in(reg) port) };
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub fn inl(port: u16) -> u32 {
let val: u32;
unsafe { core::arch::asm!("inl {1:x}, {0:e}", out(reg) val, in(reg) port) };
val
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub fn outl(port: u16, val: u32) {
unsafe { core::arch::asm!("outl {1:x}, {0:e}", in(reg) val, in(reg) port) };
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub fn inw(port: u16) -> u16 {
let val: u16;
unsafe { core::arch::asm!("inw {1:x}, {0:x}", out(reg) val, in(reg) port) };
val
}
#[cfg(target_arch = "x86_64")]
#[inline]
pub fn outw(port: u16, val: u16) {
unsafe { core::arch::asm!("outw {1:x}, {0:x}", in(reg) val, in(reg) port) };
}