Unschedule threads properly...
...instead of using a shitty yield when opening the Rosalina menu
This commit is contained in:
@@ -78,7 +78,7 @@ extern s32 (*kernelToUsrStrncpy)(char *dst, const char *src, u32 len);
|
||||
|
||||
extern void (*svcFallbackHandler)(u8 svcId);
|
||||
extern void (*kernelpanic)(void);
|
||||
extern void (*PostprocessSvc)(void);
|
||||
extern void (*officialPostProcessSvc)(void);
|
||||
|
||||
extern Result (*SignalDebugEvent)(DebugEventType type, u32 info, ...);
|
||||
|
||||
@@ -96,6 +96,8 @@ extern vu8 *configPage;
|
||||
extern u32 kernelVersion;
|
||||
extern FcramLayout fcramLayout;
|
||||
|
||||
extern KCoreContext *coreCtxs;
|
||||
|
||||
extern void *originalHandlers[8];
|
||||
extern u32 nbSection0Modules;
|
||||
|
||||
@@ -126,5 +128,5 @@ typedef struct PACKED CfwInfo
|
||||
|
||||
extern CfwInfo cfwInfo;
|
||||
|
||||
extern u32 rosalinaState;
|
||||
extern vu32 rosalinaState;
|
||||
extern bool hasStartedRosalinaNetworkFuncsOnce;
|
||||
|
||||
@@ -206,7 +206,7 @@ typedef struct PACKED ALIGN(4) KThread
|
||||
KMutexLinkedList *mutexList;
|
||||
KLinkedList mutexesUsed;
|
||||
s32 dynamicPriority;
|
||||
u32 processor;
|
||||
u32 coreId;
|
||||
KPreemptionTimer *preemptionTimer;
|
||||
u32 unknown_1;
|
||||
bool isAlive;
|
||||
@@ -950,6 +950,7 @@ typedef struct KCoreContext
|
||||
} KCoreContext;
|
||||
|
||||
static KCoreContext * const currentCoreContext = (KCoreContext *)0xFFFF1000;
|
||||
extern KCoreContext *coreCtxs;
|
||||
|
||||
#define DEFINE_CONSOLE_SPECIFIC_STRUCTS(console, nbCores)
|
||||
/* 60 */
|
||||
|
||||
@@ -33,5 +33,6 @@
|
||||
|
||||
extern void *officialSVCs[0x7E];
|
||||
|
||||
void postprocessSvc(void);
|
||||
void svcDefaultHandler(u8 svcId);
|
||||
void *svcHook(u8 *pageEnd);
|
||||
|
||||
@@ -30,6 +30,5 @@
|
||||
#include "kernel.h"
|
||||
#include "svc.h"
|
||||
|
||||
extern u32 rosalinaState;
|
||||
bool shouldSignalSyscallDebugEvent(KProcess *process, u8 svcId);
|
||||
Result KernelSetStateHook(u32 type, u32 varg1, u32 varg2, u32 varg3);
|
||||
|
||||
@@ -34,6 +34,14 @@ typedef KSchedulableInterruptEvent* (*SGI0Handler_t)(KBaseInterruptEvent *this,
|
||||
// http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CCHDIFIJ.html
|
||||
void executeFunctionOnCores(SGI0Handler_t func, u8 targetList, u8 targetListFilter);
|
||||
|
||||
void KScheduler__TriggerCrossCoreInterrupt(KScheduler *this);
|
||||
void KThread__DebugReschedule(KThread *this, bool lock);
|
||||
bool rosalinaThreadLockPredicate(KThread *thread);
|
||||
void rosalinaRescheduleThread(KThread *thread, bool lock);
|
||||
void rosalinaLockThread(KThread *thread);
|
||||
void rosalinaLockAllThreads(void);
|
||||
void rosalinaUnlockAllThreads(void);
|
||||
|
||||
// Taken from ctrulib:
|
||||
|
||||
static inline void __dsb(void)
|
||||
@@ -59,3 +67,53 @@ static inline bool __strex(s32* addr, s32 val)
|
||||
__asm__ __volatile__("strex %[res], %[val], %[addr]" : [res] "=&r" (res) : [val] "r" (val), [addr] "Q" (*addr));
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline s8 __ldrex8(s8* addr)
|
||||
{
|
||||
s8 val;
|
||||
__asm__ __volatile__("ldrexb %[val], %[addr]" : [val] "=r" (val) : [addr] "Q" (*addr));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline bool __strex8(s8* addr, s8 val)
|
||||
{
|
||||
bool res;
|
||||
__asm__ __volatile__("strexb %[res], %[val], %[addr]" : [res] "=&r" (res) : [val] "r" (val), [addr] "Q" (*addr));
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline s16 __ldrex16(s16* addr)
|
||||
{
|
||||
s16 val;
|
||||
__asm__ __volatile__("ldrexh %[val], %[addr]" : [val] "=r" (val) : [addr] "Q" (*addr));
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline bool __strex16(s16* addr, s16 val)
|
||||
{
|
||||
bool res;
|
||||
__asm__ __volatile__("strexh %[res], %[val], %[addr]" : [res] "=&r" (res) : [val] "r" (val), [addr] "Q" (*addr));
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline u32 __get_cpsr(void)
|
||||
{
|
||||
u32 cpsr;
|
||||
__asm__ __volatile__("mrs %0, cpsr" : "=r"(cpsr));
|
||||
return cpsr;
|
||||
}
|
||||
|
||||
static inline void __set_cpsr_cx(u32 cpsr)
|
||||
{
|
||||
__asm__ __volatile__("msr cpsr_cx, %0" :: "r"(cpsr));
|
||||
}
|
||||
|
||||
static inline void __enable_irq(void)
|
||||
{
|
||||
__asm__ __volatile__("cpsie i");
|
||||
}
|
||||
|
||||
static inline void __disable_irq(void)
|
||||
{
|
||||
__asm__ __volatile__("cpsid i");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user