instructions.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // SPDX-FileCopyrightText: Copyright © 2020 Skyline Team and Contributors
  2. // SPDX-License-Identifier: MPL-2.0
  3. #include "common/bit_field.h"
  4. #include "common/common_types.h"
  5. namespace Core::NCE {
  6. enum SystemRegister : u32 {
  7. TpidrEl0 = 0x5E82,
  8. TpidrroEl0 = 0x5E83,
  9. CntfrqEl0 = 0x5F00,
  10. CntpctEl0 = 0x5F01,
  11. };
  12. // https://developer.arm.com/documentation/ddi0596/2021-12/Base-Instructions/SVC--Supervisor-Call-
  13. union SVC {
  14. constexpr explicit SVC(u32 raw_) : raw{raw_} {}
  15. constexpr bool Verify() {
  16. return (this->GetSig0() == 0x1 && this->GetSig1() == 0x6A0);
  17. }
  18. constexpr u32 GetSig0() {
  19. return decltype(sig0)::ExtractValue(raw);
  20. }
  21. constexpr u32 GetValue() {
  22. return decltype(value)::ExtractValue(raw);
  23. }
  24. constexpr u32 GetSig1() {
  25. return decltype(sig1)::ExtractValue(raw);
  26. }
  27. u32 raw;
  28. private:
  29. BitField<0, 5, u32> sig0; // 0x1
  30. BitField<5, 16, u32> value; // 16-bit immediate
  31. BitField<21, 11, u32> sig1; // 0x6A0
  32. };
  33. static_assert(sizeof(SVC) == sizeof(u32));
  34. static_assert(SVC(0xD40000C1).Verify());
  35. static_assert(SVC(0xD40000C1).GetValue() == 0x6);
  36. // https://developer.arm.com/documentation/ddi0596/2021-12/Base-Instructions/MRS--Move-System-Register-
  37. union MRS {
  38. constexpr explicit MRS(u32 raw_) : raw{raw_} {}
  39. constexpr bool Verify() {
  40. return (this->GetSig() == 0xD53);
  41. }
  42. constexpr u32 GetRt() {
  43. return decltype(rt)::ExtractValue(raw);
  44. }
  45. constexpr u32 GetSystemReg() {
  46. return decltype(system_reg)::ExtractValue(raw);
  47. }
  48. constexpr u32 GetSig() {
  49. return decltype(sig)::ExtractValue(raw);
  50. }
  51. u32 raw;
  52. private:
  53. BitField<0, 5, u32> rt; // destination register
  54. BitField<5, 15, u32> system_reg; // source system register
  55. BitField<20, 12, u32> sig; // 0xD53
  56. };
  57. static_assert(sizeof(MRS) == sizeof(u32));
  58. static_assert(MRS(0xD53BE020).Verify());
  59. static_assert(MRS(0xD53BE020).GetSystemReg() == CntpctEl0);
  60. static_assert(MRS(0xD53BE020).GetRt() == 0x0);
  61. // https://developer.arm.com/documentation/ddi0596/2021-12/Base-Instructions/MSR--register---Move-general-purpose-register-to-System-Register-
  62. union MSR {
  63. constexpr explicit MSR(u32 raw_) : raw{raw_} {}
  64. constexpr bool Verify() {
  65. return this->GetSig() == 0xD51;
  66. }
  67. constexpr u32 GetRt() {
  68. return decltype(rt)::ExtractValue(raw);
  69. }
  70. constexpr u32 GetSystemReg() {
  71. return decltype(system_reg)::ExtractValue(raw);
  72. }
  73. constexpr u32 GetSig() {
  74. return decltype(sig)::ExtractValue(raw);
  75. }
  76. u32 raw;
  77. private:
  78. BitField<0, 5, u32> rt; // source register
  79. BitField<5, 15, u32> system_reg; // destination system register
  80. BitField<20, 12, u32> sig; // 0xD51
  81. };
  82. static_assert(sizeof(MSR) == sizeof(u32));
  83. static_assert(MSR(0xD51BD040).Verify());
  84. static_assert(MSR(0xD51BD040).GetSystemReg() == TpidrEl0);
  85. static_assert(MSR(0xD51BD040).GetRt() == 0x0);
  86. // https://developer.arm.com/documentation/ddi0596/2021-12/Base-Instructions/LDXR--Load-Exclusive-Register-
  87. // https://developer.arm.com/documentation/ddi0596/2021-12/Base-Instructions/LDXP--Load-Exclusive-Pair-of-Registers-
  88. // https://developer.arm.com/documentation/ddi0596/2021-12/Base-Instructions/STXR--Store-Exclusive-Register-
  89. // https://developer.arm.com/documentation/ddi0596/2021-12/Base-Instructions/STXP--Store-Exclusive-Pair-of-registers-
  90. union Exclusive {
  91. constexpr explicit Exclusive(u32 raw_) : raw{raw_} {}
  92. constexpr bool Verify() {
  93. return this->GetSig() == 0x10;
  94. }
  95. constexpr u32 GetSig() {
  96. return decltype(sig)::ExtractValue(raw);
  97. }
  98. constexpr u32 AsOrdered() {
  99. return raw | decltype(o0)::FormatValue(1);
  100. }
  101. u32 raw;
  102. private:
  103. BitField<0, 5, u32> rt; // memory operand
  104. BitField<5, 5, u32> rn; // register operand 1
  105. BitField<10, 5, u32> rt2; // register operand 2
  106. BitField<15, 1, u32> o0; // ordered
  107. BitField<16, 5, u32> rs; // status register
  108. BitField<21, 2, u32> l; // operation type
  109. BitField<23, 7, u32> sig; // 0x10
  110. BitField<30, 2, u32> size; // size
  111. };
  112. static_assert(Exclusive(0xC85FFC00).Verify());
  113. static_assert(Exclusive(0xC85FFC00).AsOrdered() == 0xC85FFC00);
  114. static_assert(Exclusive(0xC85F7C00).AsOrdered() == 0xC85FFC00);
  115. static_assert(Exclusive(0xC8200440).AsOrdered() == 0xC8208440);
  116. } // namespace Core::NCE