/* * Copyright (c) 2018-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace Kernel { class MSR { uint32_t m_msr; public: static bool have() { CPUID id(1); return (id.edx() & (1 << 5)) != 0; } MSR(const MSR&) = delete; MSR& operator=(const MSR&) = delete; MSR(uint32_t msr) : m_msr(msr) { } void get(u32& low, u32& high) { asm volatile("rdmsr" : "=a"(low), "=d"(high) : "c"(m_msr)); } void set(u32 low, u32 high) { asm volatile("wrmsr" ::"a"(low), "d"(high), "c"(m_msr)); } }; }