use core::arch::asm;
pub(crate) struct X64;
impl super::ArchSupport for X64 {}
pub unsafe fn io_out8(port: u16, value: u8) {
unsafe {
core::arch::asm!(
"out dx, al",
in("dx") port,
in("al") value,
options(nostack, nomem, preserves_flags)
);
}
}
pub fn rdtsc() -> u64 {
let lo: u32;
let hi: u32;
unsafe { core::arch::asm!("rdtsc", out("eax") lo, out("edx") hi, options(nostack, nomem)) };
((hi as u64) << 32) | lo as u64
}
impl super::Interrupts for X64 {
fn enable_interrupts() {
unsafe {
asm!("sti", options(nostack, nomem, preserves_flags));
}
}
fn disable_interrupts() {
unsafe {
asm!("cli", options(nostack, nomem, preserves_flags));
}
}
fn interrupts_enabled() -> bool {
let eflags: u64;
const IF: u64 = 0x200;
unsafe {
asm!("pushfq; pop {}", out(reg) eflags);
}
eflags & IF != 0
}
}