diff --git a/ableos/src/experiments/info.rs b/ableos/src/experiments/info.rs index fc6aec0..901a3d4 100644 --- a/ableos/src/experiments/info.rs +++ b/ableos/src/experiments/info.rs @@ -18,6 +18,7 @@ //! } //! ``` +use core::arch::asm; use core::ops::Deref; use core::{fmt, slice, str}; @@ -39,28 +40,27 @@ pub enum RequestType { } pub fn cpuid(code: RequestType) -> (u32, u32, u32, u32) { - let res1; - let res2; - let res3; - let res4; + let eax; + let ebx; + let ecx; + let edx; unsafe { - llvm_asm!("cpuid" - : // output operands - "={eax}"(res1), - "={ebx}"(res2), - "={ecx}"(res3), - "={edx}"(res4) - : // input operands - "{eax}"(code as u32), - "{ecx}"(0 as u32) - : // clobbers - : // options + asm!( + "movq %rbx, {0:r}", + "cpuid", + "xchgq %rbx, {0:r}", + lateout(reg) ebx, + inlateout("eax") code as u32 => eax, + inlateout("ecx") 0 => ecx, + lateout("edx") edx, + options(nostack, preserves_flags, att_syntax), ); } - (res1, res2, res3, res4) + (eax, ebx, ecx, edx) } + /// The main entrypoint to the CPU information #[cfg(any(target_arch = "x86_64", target_arch = "x86"))] pub fn master() -> Option { diff --git a/ableos/src/lib.rs b/ableos/src/lib.rs index b3d9c2c..d241fa5 100644 --- a/ableos/src/lib.rs +++ b/ableos/src/lib.rs @@ -6,17 +6,14 @@ #![no_std] #![feature( abi_x86_interrupt, - // asm, asm_sym, alloc_error_handler, core_intrinsics, - // global_asm, + exclusive_range_pattern, lang_items, - llvm_asm, - naked_functions + naked_functions, + slice_pattern, )] -#![feature(exclusive_range_pattern)] -#![feature(slice_pattern)] /// Contains architecture specific code for aarch64. #[cfg(target_arch = "aarch64")]