ReXGlue SDK
Toggle main menu visibility
Loading...
Searching...
No Matches
thread_state.h
1
11
12
#pragma once
13
14
#include <array>
15
#include <atomic>
16
#include <string>
17
18
#include <
rex/platform.h
>
19
#include <
rex/types.h
>
20
#include <
rex/kernel/heap.h
>
21
#include <
rex/ppc/context.h
>
22
23
namespace
rex
{
24
namespace
kernel
{
25
class
TitleRuntime
;
26
}
// namespace kernel
27
}
// namespace rex
28
29
namespace
rex::kernel
{
30
32
struct
DPCSaveArea
{
33
std::array<PPCRegister, 32> fpr{};
35
u32
csr
= 0;
36
std::array<PPCVRegister, 128> vr{};
37
PPCVSCRRegister vscr;
38
};
39
40
class
REX_KERNEL_API
ThreadState
{
41
public
:
50
ThreadState
(u32 thread_id, u32 stack_base, u32 pcr_address,
GuestAddressSpace
*
memory
,
51
TitleRuntime
* runtime);
53
~ThreadState
();
54
55
GuestAddressSpace
* GetAddressSpace()
const
{
return
memory_; }
56
58
void
RequestStop
() { stop_requested_.store(
true
, std::memory_order_release); }
59
60
bool
IsStopRequested()
const
{
return
stop_requested_.load(std::memory_order_acquire); }
61
63
void
ClearStop
() { stop_requested_.store(
false
, std::memory_order_release); }
64
::PPCContext
* GetContext()
const
{
return
context_; }
65
66
u32 GetThreadID()
const
{
return
thread_id_; }
67
69
TitleRuntime
*
GetRuntime
()
const
{
return
runtime_; }
70
71
DPCSaveArea
& GetDPCSaveArea() {
return
dpc_save_area_; }
72
74
char
*&
GetStrtokContext
() {
return
strtok_context_; }
75
81
static
void
Bind
(
ThreadState
* state);
83
static
ThreadState
*
Get
();
87
static
u32
GetBoundThreadID
();
88
89
private
:
90
GuestAddressSpace
* memory_;
91
TitleRuntime
* runtime_;
92
93
u32 thread_id_ = 0;
94
95
alignas
(64)
::PPCContext
context_storage_{};
96
::PPCContext
* context_ = &context_storage_;
97
DPCSaveArea
dpc_save_area_;
98
char
* strtok_context_ =
nullptr
;
99
std::atomic<bool> stop_requested_{
false
};
100
};
101
102
namespace
detail {
103
105
[[noreturn]]
REX_KERNEL_API
void
AbortNoRuntime();
106
107
}
// namespace detail
108
110
inline
TitleRuntime
&
GetCurrent
() {
111
ThreadState
* state =
ThreadState::Get
();
112
if
(state ==
nullptr
|| state->
GetRuntime
() ==
nullptr
) [[unlikely]] {
113
detail::AbortNoRuntime();
114
}
115
return
*state->
GetRuntime
();
116
}
117
118
}
// namespace rex::kernel
rex::kernel::GuestAddressSpace
Definition
heap.h:594
rex::kernel::ThreadState
Definition
thread_state.h:40
rex::kernel::ThreadState::Bind
static void Bind(ThreadState *state)
rex::kernel::ThreadState::ThreadState
ThreadState(u32 thread_id, u32 stack_base, u32 pcr_address, GuestAddressSpace *memory, TitleRuntime *runtime)
rex::kernel::ThreadState::GetBoundThreadID
static u32 GetBoundThreadID()
rex::kernel::ThreadState::GetRuntime
TitleRuntime * GetRuntime() const
Definition
thread_state.h:69
rex::kernel::ThreadState::Get
static ThreadState * Get()
rex::kernel::ThreadState::RequestStop
void RequestStop()
Definition
thread_state.h:58
rex::kernel::ThreadState::~ThreadState
~ThreadState()
rex::kernel::ThreadState::GetStrtokContext
char *& GetStrtokContext()
Definition
thread_state.h:74
rex::kernel::ThreadState::ClearStop
void ClearStop()
Definition
thread_state.h:63
rex::kernel::TitleRuntime
Definition
title_runtime.h:85
context.h
heap.h
rex::kernel
Definition
export.h:24
rex::kernel::GetCurrent
TitleRuntime & GetCurrent()
Definition
thread_state.h:110
rex::memory
Definition
endian.h:27
rex
Definition
app.h:36
platform.h
Platform flags, packing macros and export markers.
REX_KERNEL_API
#define REX_KERNEL_API
Definition
platform.h:297
PPCContext
Definition
context.h:387
rex::kernel::DPCSaveArea
Definition
thread_state.h:32
rex::kernel::DPCSaveArea::csr
u32 csr
Definition
thread_state.h:35
types.h
Integer types, byte order wrappers and size literals.
rex
kernel
thread_state.h
Generated by
1.18.0