k_class_token.cpp 7.2 KB

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