aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86_64/io_port.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86_64/io_port.rs')
-rw-r--r--src/arch/x86_64/io_port.rs44
1 files changed, 28 insertions, 16 deletions
diff --git a/src/arch/x86_64/io_port.rs b/src/arch/x86_64/io_port.rs
index f5755f4..7b37989 100644
--- a/src/arch/x86_64/io_port.rs
+++ b/src/arch/x86_64/io_port.rs
@@ -1,29 +1,41 @@
-extern "C" {
- fn _inb(port: u16) -> u8;
- fn _inw(port: u16) -> u16;
- fn _outb(port: u16, val: u8);
- fn _outw(port: u16, val: u16);
-}
-
-// The port addr is 16-bit wide.
-// wrappers for in/out[b,w]
-// Also I don't feel necessary to have a IO_Port Class give how
-// trivial it is
-// TODO perhaps use inline asm, because the code is short
+use core::arch::asm;
pub fn inw(p: u16) -> u16 {
- unsafe { _inw(p) }
+ let result: u16;
+ unsafe {
+ asm!("in ax, dx",
+ in("dx") p,
+ out("ax") result
+ )
+ }
+ result
}
pub fn inb(p: u16) -> u8 {
- unsafe { _inb(p) }
+ let result: u8;
+ unsafe {
+ asm!("in al, dx",
+ in("dx") p,
+ out("al") result
+ )
+ }
+ result
}
+
pub fn outb(p: u16, val: u8) {
unsafe {
- _outb(p, val);
+ asm!("out dx, al",
+ in("dx") p,
+ in("al") val,
+ )
}
}
pub fn outw(p: u16, val: u16) {
- unsafe { _outw(p, val) }
+ unsafe {
+ asm!("out dx, ax",
+ in("dx") p,
+ in("ax") val,
+ )
+ }
}