k_class_token.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Copyright 2021 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/hle/kernel/k_auto_object.h"
  5. #include "core/hle/kernel/k_class_token.h"
  6. #include "core/hle/kernel/k_client_port.h"
  7. #include "core/hle/kernel/k_client_session.h"
  8. #include "core/hle/kernel/k_code_memory.h"
  9. #include "core/hle/kernel/k_event.h"
  10. #include "core/hle/kernel/k_port.h"
  11. #include "core/hle/kernel/k_process.h"
  12. #include "core/hle/kernel/k_readable_event.h"
  13. #include "core/hle/kernel/k_resource_limit.h"
  14. #include "core/hle/kernel/k_server_port.h"
  15. #include "core/hle/kernel/k_server_session.h"
  16. #include "core/hle/kernel/k_session.h"
  17. #include "core/hle/kernel/k_shared_memory.h"
  18. #include "core/hle/kernel/k_synchronization_object.h"
  19. #include "core/hle/kernel/k_thread.h"
  20. #include "core/hle/kernel/k_transfer_memory.h"
  21. #include "core/hle/kernel/k_writable_event.h"
  22. namespace Kernel {
  23. // Ensure that we generate correct class tokens for all types.
  24. // Ensure that the absolute token values are correct.
  25. static_assert(ClassToken<KAutoObject> == 0b00000000'00000000);
  26. static_assert(ClassToken<KSynchronizationObject> == 0b00000000'00000001);
  27. static_assert(ClassToken<KReadableEvent> == 0b00000000'00000011);
  28. // static_assert(ClassToken<KInterruptEvent> == 0b00000111'00000011);
  29. // static_assert(ClassToken<KDebug> == 0b00001011'00000001);
  30. static_assert(ClassToken<KThread> == 0b00010011'00000001);
  31. static_assert(ClassToken<KServerPort> == 0b00100011'00000001);
  32. static_assert(ClassToken<KServerSession> == 0b01000011'00000001);
  33. static_assert(ClassToken<KClientPort> == 0b10000011'00000001);
  34. static_assert(ClassToken<KClientSession> == 0b00001101'00000000);
  35. static_assert(ClassToken<KProcess> == 0b00010101'00000001);
  36. static_assert(ClassToken<KResourceLimit> == 0b00100101'00000000);
  37. // static_assert(ClassToken<KLightSession> == 0b01000101'00000000);
  38. static_assert(ClassToken<KPort> == 0b10000101'00000000);
  39. static_assert(ClassToken<KSession> == 0b00011001'00000000);
  40. static_assert(ClassToken<KSharedMemory> == 0b00101001'00000000);
  41. static_assert(ClassToken<KEvent> == 0b01001001'00000000);
  42. static_assert(ClassToken<KWritableEvent> == 0b10001001'00000000);
  43. // static_assert(ClassToken<KLightClientSession> == 0b00110001'00000000);
  44. // static_assert(ClassToken<KLightServerSession> == 0b01010001'00000000);
  45. static_assert(ClassToken<KTransferMemory> == 0b10010001'00000000);
  46. // static_assert(ClassToken<KDeviceAddressSpace> == 0b01100001'00000000);
  47. // static_assert(ClassToken<KSessionRequest> == 0b10100001'00000000);
  48. static_assert(ClassToken<KCodeMemory> == 0b11000001'00000000);
  49. // Ensure that the token hierarchy is correct.
  50. // Base classes
  51. static_assert(ClassToken<KAutoObject> == (0b00000000));
  52. static_assert(ClassToken<KSynchronizationObject> == (0b00000001 | ClassToken<KAutoObject>));
  53. static_assert(ClassToken<KReadableEvent> == (0b00000010 | ClassToken<KSynchronizationObject>));
  54. // Final classes
  55. // static_assert(ClassToken<KInterruptEvent> == ((0b00000111 << 8) | ClassToken<KReadableEvent>));
  56. // static_assert(ClassToken<KDebug> == ((0b00001011 << 8) | ClassToken<KSynchronizationObject>));
  57. static_assert(ClassToken<KThread> == ((0b00010011 << 8) | ClassToken<KSynchronizationObject>));
  58. static_assert(ClassToken<KServerPort> == ((0b00100011 << 8) | ClassToken<KSynchronizationObject>));
  59. static_assert(ClassToken<KServerSession> ==
  60. ((0b01000011 << 8) | ClassToken<KSynchronizationObject>));
  61. static_assert(ClassToken<KClientPort> == ((0b10000011 << 8) | ClassToken<KSynchronizationObject>));
  62. static_assert(ClassToken<KClientSession> == ((0b00001101 << 8) | ClassToken<KAutoObject>));
  63. static_assert(ClassToken<KProcess> == ((0b00010101 << 8) | ClassToken<KSynchronizationObject>));
  64. static_assert(ClassToken<KResourceLimit> == ((0b00100101 << 8) | ClassToken<KAutoObject>));
  65. // static_assert(ClassToken<KLightSession> == ((0b01000101 << 8) | ClassToken<KAutoObject>));
  66. static_assert(ClassToken<KPort> == ((0b10000101 << 8) | ClassToken<KAutoObject>));
  67. static_assert(ClassToken<KSession> == ((0b00011001 << 8) | ClassToken<KAutoObject>));
  68. static_assert(ClassToken<KSharedMemory> == ((0b00101001 << 8) | ClassToken<KAutoObject>));
  69. static_assert(ClassToken<KEvent> == ((0b01001001 << 8) | ClassToken<KAutoObject>));
  70. static_assert(ClassToken<KWritableEvent> == ((0b10001001 << 8) | ClassToken<KAutoObject>));
  71. // static_assert(ClassToken<KLightClientSession> == ((0b00110001 << 8) | ClassToken<KAutoObject>));
  72. // static_assert(ClassToken<KLightServerSession> == ((0b01010001 << 8) | ClassToken<KAutoObject>));
  73. static_assert(ClassToken<KTransferMemory> == ((0b10010001 << 8) | ClassToken<KAutoObject>));
  74. // static_assert(ClassToken<KDeviceAddressSpace> == ((0b01100001 << 8) | ClassToken<KAutoObject>));
  75. // static_assert(ClassToken<KSessionRequest> == ((0b10100001 << 8) | ClassToken<KAutoObject>));
  76. static_assert(ClassToken<KCodeMemory> == ((0b11000001 << 8) | ClassToken<KAutoObject>));
  77. // Ensure that the token hierarchy reflects the class hierarchy.
  78. // Base classes.
  79. static_assert(!std::is_final_v<KSynchronizationObject> &&
  80. std::is_base_of_v<KAutoObject, KSynchronizationObject>);
  81. static_assert(!std::is_final_v<KReadableEvent> &&
  82. std::is_base_of_v<KSynchronizationObject, KReadableEvent>);
  83. // Final classes
  84. // static_assert(std::is_final_v<KInterruptEvent> &&
  85. // std::is_base_of_v<KReadableEvent, KInterruptEvent>);
  86. // static_assert(std::is_final_v<KDebug> &&
  87. // std::is_base_of_v<KSynchronizationObject, KDebug>);
  88. static_assert(std::is_final_v<KThread> && std::is_base_of_v<KSynchronizationObject, KThread>);
  89. static_assert(std::is_final_v<KServerPort> &&
  90. std::is_base_of_v<KSynchronizationObject, KServerPort>);
  91. static_assert(std::is_final_v<KServerSession> &&
  92. std::is_base_of_v<KSynchronizationObject, KServerSession>);
  93. static_assert(std::is_final_v<KClientPort> &&
  94. std::is_base_of_v<KSynchronizationObject, KClientPort>);
  95. static_assert(std::is_final_v<KClientSession> && std::is_base_of_v<KAutoObject, KClientSession>);
  96. static_assert(std::is_final_v<KProcess> && std::is_base_of_v<KSynchronizationObject, KProcess>);
  97. static_assert(std::is_final_v<KResourceLimit> && std::is_base_of_v<KAutoObject, KResourceLimit>);
  98. // static_assert(std::is_final_v<KLightSession> &&
  99. // std::is_base_of_v<KAutoObject, KLightSession>);
  100. static_assert(std::is_final_v<KPort> && std::is_base_of_v<KAutoObject, KPort>);
  101. static_assert(std::is_final_v<KSession> && std::is_base_of_v<KAutoObject, KSession>);
  102. static_assert(std::is_final_v<KSharedMemory> && std::is_base_of_v<KAutoObject, KSharedMemory>);
  103. static_assert(std::is_final_v<KEvent> && std::is_base_of_v<KAutoObject, KEvent>);
  104. static_assert(std::is_final_v<KWritableEvent> && std::is_base_of_v<KAutoObject, KWritableEvent>);
  105. // static_assert(std::is_final_v<KLightClientSession> &&
  106. // std::is_base_of_v<KAutoObject, KLightClientSession>);
  107. // static_assert(std::is_final_v<KLightServerSession> &&
  108. // std::is_base_of_v<KAutoObject, KLightServerSession>);
  109. static_assert(std::is_final_v<KTransferMemory> && std::is_base_of_v<KAutoObject, KTransferMemory>);
  110. // static_assert(std::is_final_v<KDeviceAddressSpace> &&
  111. // std::is_base_of_v<KAutoObject, KDeviceAddressSpace>);
  112. // static_assert(std::is_final_v<KSessionRequest> &&
  113. // std::is_base_of_v<KAutoObject, KSessionRequest>);
  114. // static_assert(std::is_final_v<KCodeMemory> &&
  115. // std::is_base_of_v<KAutoObject, KCodeMemory>);
  116. } // namespace Kernel