From 80b115ef57f3277e4f35c57fc62b30c9112cbdf5 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Wed, 19 Feb 2020 21:21:44 -0800 Subject: [PATCH] kern: implement user thread start, el0 code now runs --- .../arch/arm64/kern_k_page_table_entry.hpp | 2 +- .../include/mesosphere/kern_k_capabilities.hpp | 1 - .../source/arch/arm64/kern_k_thread_context.cpp | 15 ++++++++++++++- .../source/arch/arm64/kern_k_thread_context_asm.s | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/libraries/libmesosphere/include/mesosphere/arch/arm64/kern_k_page_table_entry.hpp b/libraries/libmesosphere/include/mesosphere/arch/arm64/kern_k_page_table_entry.hpp index a5ae42229..09d7df979 100644 --- a/libraries/libmesosphere/include/mesosphere/arch/arm64/kern_k_page_table_entry.hpp +++ b/libraries/libmesosphere/include/mesosphere/arch/arm64/kern_k_page_table_entry.hpp @@ -145,7 +145,7 @@ namespace ams::kern::arch::arm64 { constexpr ALWAYS_INLINE decltype(auto) SetAccessFlag(AccessFlag f) { this->SetBitsDirect(10, 1, f); return *this; } constexpr ALWAYS_INLINE decltype(auto) SetShareable(Shareable s) { this->SetBitsDirect(8, 2, s); return *this; } constexpr ALWAYS_INLINE decltype(auto) SetReadOnly(bool en) { this->SetBit(7, en); return *this; } - constexpr ALWAYS_INLINE decltype(auto) SetUserAccessible(bool en) { this->SetBit(7, en); return *this; } + constexpr ALWAYS_INLINE decltype(auto) SetUserAccessible(bool en) { this->SetBit(6, en); return *this; } constexpr ALWAYS_INLINE decltype(auto) SetPageAttribute(PageAttribute a) { this->SetBitsDirect(2, 3, a); return *this; } constexpr ALWAYS_INLINE u64 GetEntryTemplate() const { diff --git a/libraries/libmesosphere/include/mesosphere/kern_k_capabilities.hpp b/libraries/libmesosphere/include/mesosphere/kern_k_capabilities.hpp index 54390cf89..851fad45b 100644 --- a/libraries/libmesosphere/include/mesosphere/kern_k_capabilities.hpp +++ b/libraries/libmesosphere/include/mesosphere/kern_k_capabilities.hpp @@ -222,7 +222,6 @@ namespace ams::kern { } bool SetSvcAllowed(u32 id) { - constexpr size_t BitsPerWord = BITSIZEOF(this->svc_access_flags[0]); if (id < BITSIZEOF(this->svc_access_flags)) { SetSvcAllowedImpl(this->svc_access_flags, id); return true; diff --git a/libraries/libmesosphere/source/arch/arm64/kern_k_thread_context.cpp b/libraries/libmesosphere/source/arch/arm64/kern_k_thread_context.cpp index 1abd5dc3a..67a18aee3 100644 --- a/libraries/libmesosphere/source/arch/arm64/kern_k_thread_context.cpp +++ b/libraries/libmesosphere/source/arch/arm64/kern_k_thread_context.cpp @@ -22,7 +22,20 @@ namespace ams::kern::arch::arm64 { void SupervisorModeThreadStarter(); void OnThreadStart() { - MESOSPHERE_TODO_IMPLEMENT(); + MESOSPHERE_ASSERT(!KInterruptManager::AreInterruptsEnabled()); + /* Send KDebug event for this thread's creation. */ + { + KScopedInterruptEnable ei; + /* TODO */ + } + + /* Handle any pending dpc. */ + while (GetCurrentThread().HasDpc()) { + KDpcManager::HandleDpc(); + } + + /* Clear our status as in an exception handler */ + GetCurrentThread().ClearInExceptionHandler(); } namespace { diff --git a/mesosphere/kernel/source/arch/arm64/kern_k_thread_context_asm.s b/mesosphere/kernel/source/arch/arm64/kern_k_thread_context_asm.s index 7582e622d..b6867cb4e 100644 --- a/mesosphere/kernel/source/arch/arm64/kern_k_thread_context_asm.s +++ b/mesosphere/kernel/source/arch/arm64/kern_k_thread_context_asm.s @@ -39,7 +39,7 @@ _ZN3ams4kern4arch5arm6421UserModeThreadStarterEv: msr sp_el0, x19 msr elr_el1, x20 msr spsr_el1, x21 - msr tpidr_el1, x22 + msr tpidr_el0, x22 ldp x0, x1, [sp, #(8 * 0)] ldp x2, x3, [sp, #(8 * 2)]