kern: add all kthread members

This commit is contained in:
Michael Scire 2020-01-31 00:07:06 -08:00
parent 08cb370a45
commit d9db723bc8
4 changed files with 187 additions and 15 deletions

View file

@ -28,6 +28,8 @@ namespace ams::svc {
#error "Unknown target for svc::Handle"
#endif
static constexpr size_t MaxWaitSynchronizationHandleCount = 0x40;
enum class PseudoHandle : Handle {
CurrentThread = 0xFFFF8000,
CurrentProcess = 0xFFFF8001,

View file

@ -566,6 +566,38 @@ namespace ams::util {
static_assert(std::addressof(GetParent(GetNode(GetReference(DerivedStorage)))) == GetPointer(DerivedStorage));
};
template<auto T, class Derived = util::impl::GetParentType<T>>
class IntrusiveListMemberTraitsDeferredAssert;
template<class Parent, IntrusiveListNode Parent::*Member, class Derived>
class IntrusiveListMemberTraitsDeferredAssert<Member, Derived> {
public:
using ListType = IntrusiveList<Derived, IntrusiveListMemberTraitsDeferredAssert>;
static constexpr bool IsValid() {
TYPED_STORAGE(Derived) DerivedStorage = {};
return std::addressof(GetParent(GetNode(GetReference(DerivedStorage)))) == GetPointer(DerivedStorage);
}
private:
friend class IntrusiveList<Derived, IntrusiveListMemberTraitsDeferredAssert>;
static constexpr IntrusiveListNode &GetNode(Derived &parent) {
return parent.*Member;
}
static constexpr IntrusiveListNode const &GetNode(Derived const &parent) {
return parent.*Member;
}
static constexpr Derived &GetParent(IntrusiveListNode &node) {
return util::GetParentReference<Member, Derived>(&node);
}
static constexpr Derived const &GetParent(IntrusiveListNode const &node) {
return util::GetParentReference<Member, Derived>(&node);
}
};
template<class Derived>
class IntrusiveListBaseNode : public IntrusiveListNode{};

View file

@ -26,13 +26,15 @@ namespace ams::util {
struct OffsetOfUnionHolder {
template<typename ParentType, typename MemberType, size_t Offset>
union UnionImpl {
using PaddingMember = std::array<char, alignof(ParentType)>;
using PaddingMember = char;
static constexpr size_t GetOffset() { return Offset; }
#pragma pack(push, 1)
struct {
PaddingMember padding[Offset];
MemberType members[(sizeof(ParentType) / sizeof(MemberType)) + 1];
} data;
#pragma pack(pop)
UnionImpl<ParentType, MemberType, Offset + 1> next_union;
};
@ -47,12 +49,12 @@ namespace ams::util {
};
template<typename ParentType, typename MemberType>
union UnionImpl<ParentType, MemberType, MaxDepth> { /* Empty */ };
union UnionImpl<ParentType, MemberType, MaxDepth> { /* Empty ... */ };
};
template<typename ParentType, typename MemberType>
struct OffsetOfCalculator {
using UnionHolder = typename OffsetOfUnionHolder<sizeof(MemberType) / alignof(MemberType) + 1>::template UnionImpl<ParentType, MemberType, 0>;
using UnionHolder = typename OffsetOfUnionHolder<sizeof(MemberType)>::template UnionImpl<ParentType, MemberType, 0>;
union Union {
char c;
UnionHolder first_union;
@ -81,15 +83,19 @@ namespace ams::util {
const auto start = std::addressof(cur_union.data.members[0]);
const auto next = GetNextAddress(start, target);
if constexpr (Offset > 0x10) {
__builtin_unreachable();
}
if (next != target) {
if constexpr (Offset < sizeof(MemberType) / alignof(MemberType)) {
if constexpr (Offset < sizeof(MemberType) - 1) {
return OffsetOfImpl(member, cur_union.next_union);
} else {
std::abort();
__builtin_unreachable();
}
}
return (next - start) * sizeof(MemberType) + Offset * alignof(MemberType);
return (next - start) * sizeof(MemberType) + Offset;
}