From 5055bdb23e7d9dad8ee06b8e8832aa72dc728d89 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Sat, 22 Feb 2020 02:53:14 -0800 Subject: [PATCH] kern: correct KClassToken generation --- .../include/mesosphere/kern_k_class_token.hpp | 13 +++--- .../source/kern_k_class_token.cpp | 46 +++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 libraries/libmesosphere/source/kern_k_class_token.cpp diff --git a/libraries/libmesosphere/include/mesosphere/kern_k_class_token.hpp b/libraries/libmesosphere/include/mesosphere/kern_k_class_token.hpp index fbbfe0abf..c37c88f1a 100644 --- a/libraries/libmesosphere/include/mesosphere/kern_k_class_token.hpp +++ b/libraries/libmesosphere/include/mesosphere/kern_k_class_token.hpp @@ -64,10 +64,10 @@ namespace ams::kern { static constexpr inline TokenBaseType GetClassToken() { static_assert(std::is_base_of::value); if constexpr (std::is_same::value) { - static_assert(T::ObjectType == ObjectType::BaseClassesStart); - return BaseClassToken<0>; + static_assert(T::ObjectType == ObjectType::KAutoObject); + return 0; } else if constexpr (!std::is_final::value) { - static_assert(ObjectType::BaseClassesStart < T::ObjectType && T::ObjectType < ObjectType::BaseClassesEnd); + static_assert(ObjectType::BaseClassesStart <= T::ObjectType && T::ObjectType < ObjectType::BaseClassesEnd); constexpr auto ClassIndex = static_cast(T::ObjectType) - static_cast(ObjectType::BaseClassesStart); return BaseClassToken | GetClassToken(); } else if constexpr (ObjectType::FinalClassesStart <= T::ObjectType && T::ObjectType < ObjectType::FinalClassesEnd) { @@ -79,10 +79,11 @@ namespace ams::kern { }; public: enum class ObjectType { - BaseClassesStart = 0, + KAutoObject, - KAutoObject = BaseClassesStart, - KSynchronizationObject, + BaseClassesStart, + + KSynchronizationObject = BaseClassesStart, KReadableEvent, BaseClassesEnd, diff --git a/libraries/libmesosphere/source/kern_k_class_token.cpp b/libraries/libmesosphere/source/kern_k_class_token.cpp new file mode 100644 index 000000000..566716f5f --- /dev/null +++ b/libraries/libmesosphere/source/kern_k_class_token.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2020 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include + +namespace ams::kern { + + /* Ensure that we generate correct class tokens for all types. */ + 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); + /* TODO: static_assert(ClassToken == 0b00100011'00000001); */ + /* TODO: static_assert(ClassToken == 0b01000011'00000001); */ + /* TODO: static_assert(ClassToken == 0b10000011'00000001); */ + /* TODO: 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); + /* TODO: static_assert(ClassToken == 0b10001001'00000000); */ + /* TODO: static_assert(ClassToken == 0b00110001'00000000); */ + /* TODO: 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); + +}