diff --git a/Kernel/Arch/x86/MSR.h b/Kernel/Arch/x86/MSR.h index 462390467e..4638b81c59 100644 --- a/Kernel/Arch/x86/MSR.h +++ b/Kernel/Arch/x86/MSR.h @@ -30,15 +30,19 @@ public: { } - void get(u32& low, u32& high) + [[nodiscard]] u64 get() { + u32 low, high; asm volatile("rdmsr" : "=a"(low), "=d"(high) : "c"(m_msr)); + return ((u64)high << 32) | low; } - void set(u32 low, u32 high) + void set(u64 value) { + u32 low = value & 0xffffffff; + u32 high = value >> 32; asm volatile("wrmsr" ::"a"(low), "d"(high), "c"(m_msr)); } }; diff --git a/Kernel/Arch/x86/common/Processor.cpp b/Kernel/Arch/x86/common/Processor.cpp index 652aa05144..90a2b3af3b 100644 --- a/Kernel/Arch/x86/common/Processor.cpp +++ b/Kernel/Arch/x86/common/Processor.cpp @@ -1128,7 +1128,7 @@ UNMAP_AFTER_INIT void Processor::gdt_init() #if ARCH(X86_64) MSR gs_base(MSR_GS_BASE); - gs_base.set((size_t)this & 0xffffffff, (size_t)this >> 32); + gs_base.set((u64)this); #else asm volatile( "mov %%ax, %%ds\n" diff --git a/Kernel/Interrupts/APIC.cpp b/Kernel/Interrupts/APIC.cpp index fe8de2a2c8..d56743e8de 100644 --- a/Kernel/Interrupts/APIC.cpp +++ b/Kernel/Interrupts/APIC.cpp @@ -136,18 +136,15 @@ UNMAP_AFTER_INIT void APIC::initialize() PhysicalAddress APIC::get_base() { - u32 lo, hi; MSR msr(APIC_BASE_MSR); - msr.get(lo, hi); - return PhysicalAddress(lo & 0xfffff000); + auto base = msr.get(); + return PhysicalAddress(base & 0xfffff000); } void APIC::set_base(const PhysicalAddress& base) { - u32 hi = 0; - u32 lo = base.get() | 0x800; MSR msr(APIC_BASE_MSR); - msr.set(lo, hi); + msr.set(base.get() | 0x800); } void APIC::write_register(u32 offset, u32 value)