HLE: implement assorted stubs and minor functionality

This is stuff encountered in the VSH boot research.

sceRtc_driver, scePower_driver, sceImpose_driver, ThreadManForKernel funcs,
sceRtcGetAlarmTick, sceHprm_driver/sceHprmReadLatch

sceVshBridge_Driver imports sceKernelResumeDispatchThread, SuspendDispatchThread,
and NotifyCallback from ThreadManForKernel, but they were only registered under
ThreadManForUser. Added sceKernelGetUserLevel and sceKernelIsUserModeThread (new).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9
This commit is contained in:
Henrik RydgårdandClaude Sonnet 5 committed 2026-08-19 18:38:03 +02:00
1 parent 0686802715
commit 43dccd5903
12 files changed
+123 -3

No files matched your search

+17
View File
@@ -2121,6 +2121,23 @@ bool __KernelIsDispatchEnabled() {
return dispatchEnabled && __InterruptsEnabled();
}
// PPSSPP doesn't track a real per-module "user level" (set via the owning module's
// PSP_MODULE_INFO attribute on real firmware, e.g. 0 for kernel-mode modules like the VSH's
// bridge driver, 4 for a regular user-mode game). Approximate it from the calling thread's
// kernel/user attr instead - the two levels VSH code actually seems to check for are "kernel"
// vs "not kernel", so this is enough to avoid it treating itself as an ordinary user thread.
int sceKernelGetUserLevel() {
PSPThread *t = __GetCurrentThread();
int level = (t && (t->nt.attr & PSP_THREAD_ATTR_KERNEL)) ? 0 : 4;
return hleLogDebug(Log::sceKernel, level);
}
int sceKernelIsUserModeThread() {
PSPThread *t = __GetCurrentThread();
int isUser = (t && (t->nt.attr & PSP_THREAD_ATTR_KERNEL)) ? 0 : 1;
return hleLogDebug(Log::sceKernel, isUser);
}
int KernelRotateThreadReadyQueue(int priority) {
PSPThread *cur = __GetCurrentThread();