Просмотр исходного кода

core: hle: kernel: Add KEventInfo.

bunnei 3 лет назад
Родитель
Сommit
37b17252d1

+ 1 - 0
src/core/CMakeLists.txt

@@ -196,6 +196,7 @@ add_library(core STATIC
     hle/kernel/k_dynamic_slab_heap.h
     hle/kernel/k_event.cpp
     hle/kernel/k_event.h
+    hle/kernel/k_event_info.h
     hle/kernel/k_handle_table.cpp
     hle/kernel/k_handle_table.h
     hle/kernel/k_interrupt_manager.cpp

+ 64 - 0
src/core/hle/kernel/k_event_info.h

@@ -0,0 +1,64 @@
+// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <array>
+
+#include <boost/intrusive/list.hpp>
+
+#include "core/hle/kernel/slab_helpers.h"
+#include "core/hle/kernel/svc_types.h"
+
+namespace Kernel {
+
+class KEventInfo : public KSlabAllocated<KEventInfo>, public boost::intrusive::list_base_hook<> {
+public:
+    struct InfoCreateThread {
+        u32 thread_id{};
+        uintptr_t tls_address{};
+    };
+
+    struct InfoExitProcess {
+        Svc::ProcessExitReason reason{};
+    };
+
+    struct InfoExitThread {
+        Svc::ThreadExitReason reason{};
+    };
+
+    struct InfoException {
+        Svc::DebugException exception_type{};
+        s32 exception_data_count{};
+        uintptr_t exception_address{};
+        std::array<uintptr_t, 4> exception_data{};
+    };
+
+    struct InfoSystemCall {
+        s64 tick{};
+        s32 id{};
+    };
+
+public:
+    KEventInfo() = default;
+    ~KEventInfo() = default;
+
+public:
+    Svc::DebugEvent event{};
+    u32 thread_id{};
+    u32 flags{};
+    bool is_attached{};
+    bool continue_flag{};
+    bool ignore_continue{};
+    bool close_once{};
+    union {
+        InfoCreateThread create_thread;
+        InfoExitProcess exit_process;
+        InfoExitThread exit_thread;
+        InfoException exception;
+        InfoSystemCall system_call;
+    } info{};
+    KThread* debug_thread{};
+};
+
+} // namespace Kernel

+ 1 - 1
src/core/hle/kernel/svc.cpp

@@ -2246,7 +2246,7 @@ static u64 GetSystemTick(Core::System& system) {
     auto& core_timing = system.CoreTiming();
 
     // Returns the value of cntpct_el0 (https://switchbrew.org/wiki/SVC#svcGetSystemTick)
-    const u64 result{system.CoreTiming().GetClockTicks()};
+    const u64 result{core_timing.GetClockTicks()};
 
     if (!system.Kernel().IsMulticore()) {
         core_timing.AddTicks(400U);

+ 36 - 0
src/core/hle/kernel/svc_types.h

@@ -32,6 +32,7 @@ enum class MemoryState : u32 {
     GeneratedCode = 0x14,
     CodeOut = 0x15,
     Coverage = 0x16,
+    Insecure = 0x17,
 };
 DECLARE_ENUM_FLAG_OPERATORS(MemoryState);
 
@@ -83,6 +84,13 @@ enum class YieldType : s64 {
     ToAnyThread = -2,
 };
 
+enum class ThreadExitReason : u32 {
+    ExitThread = 0,
+    TerminateThread = 1,
+    ExitProcess = 2,
+    TerminateProcess = 3,
+};
+
 enum class ThreadActivity : u32 {
     Runnable = 0,
     Paused = 1,
@@ -108,6 +116,34 @@ enum class ProcessState : u32 {
     DebugBreak = 7,
 };
 
+enum class ProcessExitReason : u32 {
+    ExitProcess = 0,
+    TerminateProcess = 1,
+    Exception = 2,
+};
+
 constexpr inline size_t ThreadLocalRegionSize = 0x200;
 
+// Debug types.
+enum class DebugEvent : u32 {
+    CreateProcess = 0,
+    CreateThread = 1,
+    ExitProcess = 2,
+    ExitThread = 3,
+    Exception = 4,
+};
+
+enum class DebugException : u32 {
+    UndefinedInstruction = 0,
+    InstructionAbort = 1,
+    DataAbort = 2,
+    AlignmentFault = 3,
+    DebuggerAttached = 4,
+    BreakPoint = 5,
+    UserBreak = 6,
+    DebuggerBreak = 7,
+    UndefinedSystemCall = 8,
+    MemorySystemError = 9,
+};
+
 } // namespace Kernel::Svc