MSR.h 870 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Types.h>
  8. #include <Kernel/Arch/x86/CPUID.h>
  9. namespace Kernel {
  10. class MSR {
  11. uint32_t m_msr;
  12. public:
  13. static bool have()
  14. {
  15. CPUID id(1);
  16. return (id.edx() & (1 << 5)) != 0;
  17. }
  18. MSR(const MSR&) = delete;
  19. MSR& operator=(const MSR&) = delete;
  20. MSR(uint32_t msr)
  21. : m_msr(msr)
  22. {
  23. }
  24. [[nodiscard]] u64 get()
  25. {
  26. u32 low, high;
  27. asm volatile("rdmsr"
  28. : "=a"(low), "=d"(high)
  29. : "c"(m_msr));
  30. return ((u64)high << 32) | low;
  31. }
  32. void set(u64 value)
  33. {
  34. u32 low = value & 0xffffffff;
  35. u32 high = value >> 32;
  36. asm volatile("wrmsr" ::"a"(low), "d"(high), "c"(m_msr));
  37. }
  38. };
  39. }