From 8f5052a514706eb8a15d4f2d80573b1291f37b69 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 23 Apr 2021 22:11:03 -0700 Subject: hle: kernel: KClassToken: Ensure class tokens are correct. --- src/core/hle/kernel/k_class_token.cpp | 128 +++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 1 deletion(-) (limited to 'src/core/hle/kernel/k_class_token.cpp') diff --git a/src/core/hle/kernel/k_class_token.cpp b/src/core/hle/kernel/k_class_token.cpp index ec2f8ccad..beb8a2a05 100644 --- a/src/core/hle/kernel/k_class_token.cpp +++ b/src/core/hle/kernel/k_class_token.cpp @@ -2,6 +2,132 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "core/hle/kernel/k_auto_object.h" #include "core/hle/kernel/k_class_token.h" +#include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_client_session.h" +#include "core/hle/kernel/k_event.h" +#include "core/hle/kernel/k_port.h" +#include "core/hle/kernel/k_process.h" +#include "core/hle/kernel/k_readable_event.h" +#include "core/hle/kernel/k_resource_limit.h" +#include "core/hle/kernel/k_server_port.h" +#include "core/hle/kernel/k_server_session.h" +#include "core/hle/kernel/k_session.h" +#include "core/hle/kernel/k_shared_memory.h" +#include "core/hle/kernel/k_synchronization_object.h" +#include "core/hle/kernel/k_thread.h" +#include "core/hle/kernel/k_transfer_memory.h" +#include "core/hle/kernel/k_writable_event.h" -namespace Kernel {} // namespace Kernel +namespace Kernel { + +// Ensure that we generate correct class tokens for all types. + +// Ensure that the absolute token values are correct. +static_assert(ClassToken == 0b00000000'00000000); +static_assert(ClassToken == 0b00000000'00000001); +static_assert(ClassToken == 0b00000000'00000011); +// static_assert(ClassToken == 0b00000111'00000011); +// static_assert(ClassToken == 0b00001011'00000001); +static_assert(ClassToken == 0b00010011'00000001); +static_assert(ClassToken == 0b00100011'00000001); +static_assert(ClassToken == 0b01000011'00000001); +static_assert(ClassToken == 0b10000011'00000001); +static_assert(ClassToken == 0b00001101'00000000); +static_assert(ClassToken == 0b00010101'00000001); +static_assert(ClassToken == 0b00100101'00000000); +// static_assert(ClassToken == 0b01000101'00000000); +static_assert(ClassToken == 0b10000101'00000000); +static_assert(ClassToken == 0b00011001'00000000); +static_assert(ClassToken == 0b00101001'00000000); +static_assert(ClassToken == 0b01001001'00000000); +static_assert(ClassToken == 0b10001001'00000000); +// static_assert(ClassToken == 0b00110001'00000000); +// static_assert(ClassToken == 0b01010001'00000000); +static_assert(ClassToken == 0b10010001'00000000); +// static_assert(ClassToken == 0b01100001'00000000); +// static_assert(ClassToken == 0b10100001'00000000); +// static_assert(ClassToken == 0b11000001'00000000); + +// Ensure that the token hierarchy is correct. + +// Base classes +static_assert(ClassToken == (0b00000000)); +static_assert(ClassToken == (0b00000001 | ClassToken)); +static_assert(ClassToken == (0b00000010 | ClassToken)); + +// Final classes +// static_assert(ClassToken == ((0b00000111 << 8) | ClassToken)); +// static_assert(ClassToken == ((0b00001011 << 8) | ClassToken)); +static_assert(ClassToken == ((0b00010011 << 8) | ClassToken)); +static_assert(ClassToken == ((0b00100011 << 8) | ClassToken)); +static_assert(ClassToken == + ((0b01000011 << 8) | ClassToken)); +static_assert(ClassToken == ((0b10000011 << 8) | ClassToken)); +static_assert(ClassToken == ((0b00001101 << 8) | ClassToken)); +static_assert(ClassToken == ((0b00010101 << 8) | ClassToken)); +static_assert(ClassToken == ((0b00100101 << 8) | ClassToken)); +// static_assert(ClassToken == ((0b01000101 << 8) | ClassToken)); +static_assert(ClassToken == ((0b10000101 << 8) | ClassToken)); +static_assert(ClassToken == ((0b00011001 << 8) | ClassToken)); +static_assert(ClassToken == ((0b00101001 << 8) | ClassToken)); +static_assert(ClassToken == ((0b01001001 << 8) | ClassToken)); +static_assert(ClassToken == ((0b10001001 << 8) | ClassToken)); +// static_assert(ClassToken == ((0b00110001 << 8) | ClassToken)); +// static_assert(ClassToken == ((0b01010001 << 8) | ClassToken)); +static_assert(ClassToken == ((0b10010001 << 8) | ClassToken)); +// static_assert(ClassToken == ((0b01100001 << 8) | ClassToken)); +// static_assert(ClassToken == ((0b10100001 << 8) | ClassToken)); +// static_assert(ClassToken == ((0b11000001 << 8) | ClassToken)); + +// Ensure that the token hierarchy reflects the class hierarchy. + +// Base classes. +static_assert(!std::is_final::value && + std::is_base_of::value); +static_assert(!std::is_final::value && + std::is_base_of::value); + +// Final classes +// static_assert(std::is_final::value && +// std::is_base_of::value); +// static_assert(std::is_final::value && +// std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +// static_assert(std::is_final::value && +// std::is_base_of::value); +static_assert(std::is_final::value && std::is_base_of::value); +static_assert(std::is_final::value && std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +static_assert(std::is_final::value && std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +// static_assert(std::is_final::value && +// std::is_base_of::value); +// static_assert(std::is_final::value && +// std::is_base_of::value); +static_assert(std::is_final::value && + std::is_base_of::value); +// static_assert(std::is_final::value && +// std::is_base_of::value); +// static_assert(std::is_final::value && +// std::is_base_of::value); +// static_assert(std::is_final::value && +// std::is_base_of::value); + +} // namespace Kernel -- cgit v1.2.3