mirror of
https://github.com/Atmosphere-NX/Atmosphere-libs.git
synced 2025-11-17 18:11:17 +01:00
kern: write cpu tick differential to tls +0x108 on thread switch
This commit is contained in:
parent
6c29455ce8
commit
082cd441f6
@ -270,7 +270,13 @@ namespace ams::kern {
|
|||||||
m_current_thread = next_thread;
|
m_current_thread = next_thread;
|
||||||
|
|
||||||
/* Set the new Thread Local region. */
|
/* Set the new Thread Local region. */
|
||||||
cpu::SwitchThreadLocalRegion(GetInteger(next_thread->GetThreadLocalRegionAddress()));
|
const auto tls_address = GetInteger(next_thread->GetThreadLocalRegionAddress());
|
||||||
|
cpu::SwitchThreadLocalRegion(tls_address);
|
||||||
|
|
||||||
|
/* Update the thread's cpu time differential in TLS, if relevant. */
|
||||||
|
if (tls_address != 0) {
|
||||||
|
static_cast<ams::svc::ThreadLocalRegion *>(next_thread->GetThreadLocalRegionHeapAddress())->thread_cpu_time = next_thread->GetCpuTime() - cur_tick;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KScheduler::ClearPreviousThread(KThread *thread) {
|
void KScheduler::ClearPreviousThread(KThread *thread) {
|
||||||
|
|||||||
@ -25,8 +25,10 @@ namespace ams::svc::arch::arm {
|
|||||||
u32 message_buffer[MessageBufferSize / sizeof(u32)];
|
u32 message_buffer[MessageBufferSize / sizeof(u32)];
|
||||||
volatile u16 disable_count;
|
volatile u16 disable_count;
|
||||||
volatile u16 interrupt_flag;
|
volatile u16 interrupt_flag;
|
||||||
|
volatile u8 cache_maintenance_flag;
|
||||||
|
volatile s64 thread_cpu_time;
|
||||||
/* TODO: Should we bother adding the Nintendo aarch32 thread local context here? */
|
/* TODO: Should we bother adding the Nintendo aarch32 thread local context here? */
|
||||||
uintptr_t TODO[(0x200 - 0x104) / sizeof(uintptr_t)];
|
uintptr_t TODO[(0x200 - 0x110) / sizeof(uintptr_t)];
|
||||||
};
|
};
|
||||||
|
|
||||||
ALWAYS_INLINE ThreadLocalRegion *GetThreadLocalRegion() {
|
ALWAYS_INLINE ThreadLocalRegion *GetThreadLocalRegion() {
|
||||||
|
|||||||
@ -26,12 +26,14 @@ namespace ams::svc::arch::arm64 {
|
|||||||
volatile u16 disable_count;
|
volatile u16 disable_count;
|
||||||
volatile u16 interrupt_flag;
|
volatile u16 interrupt_flag;
|
||||||
volatile u8 cache_maintenance_flag;
|
volatile u8 cache_maintenance_flag;
|
||||||
|
volatile s64 thread_cpu_time;
|
||||||
/* TODO: How should we handle libnx vs Nintendo user thread local space? */
|
/* TODO: How should we handle libnx vs Nintendo user thread local space? */
|
||||||
uintptr_t TODO[(0x200 - 0x108) / sizeof(uintptr_t)];
|
uintptr_t TODO[(0x200 - 0x110) / sizeof(uintptr_t)];
|
||||||
};
|
};
|
||||||
static_assert(__builtin_offsetof(ThreadLocalRegion, disable_count) == 0x100);
|
static_assert(__builtin_offsetof(ThreadLocalRegion, disable_count) == 0x100);
|
||||||
static_assert(__builtin_offsetof(ThreadLocalRegion, interrupt_flag) == 0x102);
|
static_assert(__builtin_offsetof(ThreadLocalRegion, interrupt_flag) == 0x102);
|
||||||
static_assert(__builtin_offsetof(ThreadLocalRegion, cache_maintenance_flag) == 0x104);
|
static_assert(__builtin_offsetof(ThreadLocalRegion, cache_maintenance_flag) == 0x104);
|
||||||
|
static_assert(__builtin_offsetof(ThreadLocalRegion, thread_cpu_time) == 0x108);
|
||||||
|
|
||||||
ALWAYS_INLINE ThreadLocalRegion *GetThreadLocalRegion() {
|
ALWAYS_INLINE ThreadLocalRegion *GetThreadLocalRegion() {
|
||||||
ThreadLocalRegion *tlr;
|
ThreadLocalRegion *tlr;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user