diff options
Diffstat (limited to 'src/arch/x86_64/io_port.rs')
| -rw-r--r-- | src/arch/x86_64/io_port.rs | 44 |
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, + ) + } } |
