ASM_wrapper.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Types.h>
  7. #include <Kernel/Arch/x86/ASM_wrapper.h>
  8. #include <Kernel/Sections.h>
  9. namespace Kernel {
  10. UNMAP_AFTER_INIT void write_cr0(FlatPtr value)
  11. {
  12. asm volatile("mov %%eax, %%cr0" ::"a"(value));
  13. }
  14. UNMAP_AFTER_INIT void write_cr4(FlatPtr value)
  15. {
  16. asm volatile("mov %%eax, %%cr4" ::"a"(value));
  17. }
  18. FlatPtr read_cr0()
  19. {
  20. FlatPtr cr0;
  21. asm("mov %%cr0, %%eax"
  22. : "=a"(cr0));
  23. return cr0;
  24. }
  25. FlatPtr read_cr2()
  26. {
  27. FlatPtr cr2;
  28. asm("mov %%cr2, %%eax"
  29. : "=a"(cr2));
  30. return cr2;
  31. }
  32. FlatPtr read_cr3()
  33. {
  34. FlatPtr cr3;
  35. asm("mov %%cr3, %%eax"
  36. : "=a"(cr3));
  37. return cr3;
  38. }
  39. void write_cr3(FlatPtr cr3)
  40. {
  41. // NOTE: If you're here from a GPF crash, it's very likely that a PDPT entry is incorrect, not this!
  42. asm volatile("mov %%eax, %%cr3" ::"a"(cr3)
  43. : "memory");
  44. }
  45. FlatPtr read_cr4()
  46. {
  47. FlatPtr cr4;
  48. asm("mov %%cr4, %%eax"
  49. : "=a"(cr4));
  50. return cr4;
  51. }
  52. #define DEFINE_DEBUG_REGISTER(index) \
  53. FlatPtr read_dr##index() \
  54. { \
  55. FlatPtr value; \
  56. asm("mov %%dr" #index ", %%eax" \
  57. : "=a"(value)); \
  58. return value; \
  59. } \
  60. void write_dr##index(FlatPtr value) \
  61. { \
  62. asm volatile("mov %%eax, %%dr" #index ::"a"(value)); \
  63. }
  64. DEFINE_DEBUG_REGISTER(0);
  65. DEFINE_DEBUG_REGISTER(1);
  66. DEFINE_DEBUG_REGISTER(2);
  67. DEFINE_DEBUG_REGISTER(3);
  68. DEFINE_DEBUG_REGISTER(6);
  69. DEFINE_DEBUG_REGISTER(7);
  70. }