From 668f74e64ce8ee0d8b9dc8c292e7c15798101860 Mon Sep 17 00:00:00 2001 From: Tom Dohrmann Date: Fri, 3 Apr 2020 19:12:20 +0200 Subject: [PATCH] remove inline assembly + don't set reserved bits --- src/sse.rs | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/sse.rs b/src/sse.rs index 62204ded..b4e0a9f2 100644 --- a/src/sse.rs +++ b/src/sse.rs @@ -1,23 +1,17 @@ /// Enables Streaming SIMD Extensions (SSE) support for loaded kernels. pub fn enable_sse() { - use bit_field::BitField; - use x86_64::registers::control::Cr0; - let mut flags = Cr0::read_raw(); - flags.set_bit(2, false); - flags.set_bit(1, true); - flags.set_bit(9, true); - flags.set_bit(10, true); + use x86_64::registers::control::{Cr0, Cr0Flags, Cr4, Cr4Flags}; + let mut flags = Cr0::read(); + flags.remove(Cr0Flags::EMULATE_COPROCESSOR); + flags.insert(Cr0Flags::MONITOR_COPROCESSOR); unsafe { - Cr0::write_raw(flags); + Cr0::write(flags); } - // For now, we must use inline ASM here - let mut cr4: u64; + + let mut flags = Cr4::read(); + flags.insert(Cr4Flags::OSFXSR); + flags.insert(Cr4Flags::OSXMMEXCPT_ENABLE); unsafe { - asm!("mov %cr4, $0" : "=r" (cr4)); - } - cr4.set_bit(9, true); - cr4.set_bit(10, true); - unsafe { - asm!("mov $0, %cr4" :: "r" (cr4) : "memory"); + Cr4::write(flags); } }