early-access version 1393
This commit is contained in:
parent
05304127e5
commit
20a3b9c2b1
7 changed files with 26 additions and 7 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 1392.
|
This is the source code for early-access 1393.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@ __declspec(dllimport) void __stdcall DebugBreak(void);
|
||||||
{ \
|
{ \
|
||||||
if (!(expr)) { \
|
if (!(expr)) { \
|
||||||
if (res.IsError()) { \
|
if (res.IsError()) { \
|
||||||
LOG_CRITICAL(Kernel, "Failed with error {}", res.raw); \
|
LOG_ERROR(Kernel, "Failed with result: {}", res.raw); \
|
||||||
} \
|
} \
|
||||||
return res; \
|
return res; \
|
||||||
} \
|
} \
|
||||||
|
|
|
@ -255,6 +255,9 @@ void ARM_Dynarmic_32::ChangeProcessorID(std::size_t new_core_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) {
|
void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) {
|
||||||
|
if (!jit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Dynarmic::A32::Context context;
|
Dynarmic::A32::Context context;
|
||||||
jit->SaveContext(context);
|
jit->SaveContext(context);
|
||||||
ctx.cpu_registers = context.Regs();
|
ctx.cpu_registers = context.Regs();
|
||||||
|
@ -264,6 +267,9 @@ void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) {
|
void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) {
|
||||||
|
if (!jit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Dynarmic::A32::Context context;
|
Dynarmic::A32::Context context;
|
||||||
context.Regs() = ctx.cpu_registers;
|
context.Regs() = ctx.cpu_registers;
|
||||||
context.ExtRegs() = ctx.extension_registers;
|
context.ExtRegs() = ctx.extension_registers;
|
||||||
|
|
|
@ -294,6 +294,9 @@ void ARM_Dynarmic_64::ChangeProcessorID(std::size_t new_core_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) {
|
void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) {
|
||||||
|
if (!jit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
ctx.cpu_registers = jit->GetRegisters();
|
ctx.cpu_registers = jit->GetRegisters();
|
||||||
ctx.sp = jit->GetSP();
|
ctx.sp = jit->GetSP();
|
||||||
ctx.pc = jit->GetPC();
|
ctx.pc = jit->GetPC();
|
||||||
|
@ -305,6 +308,9 @@ void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) {
|
void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) {
|
||||||
|
if (!jit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
jit->SetRegisters(ctx.cpu_registers);
|
jit->SetRegisters(ctx.cpu_registers);
|
||||||
jit->SetSP(ctx.sp);
|
jit->SetSP(ctx.sp);
|
||||||
jit->SetPC(ctx.pc);
|
jit->SetPC(ctx.pc);
|
||||||
|
|
|
@ -54,7 +54,7 @@ void KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the current thread as a waiter on the owner.
|
// Add the current thread as a waiter on the owner.
|
||||||
KThread* owner_thread = reinterpret_cast<KThread*>(_owner & ~1ul);
|
KThread* owner_thread = reinterpret_cast<KThread*>(_owner & ~1ULL);
|
||||||
cur_thread->SetAddressKey(reinterpret_cast<uintptr_t>(std::addressof(tag)));
|
cur_thread->SetAddressKey(reinterpret_cast<uintptr_t>(std::addressof(tag)));
|
||||||
owner_thread->AddWaiter(cur_thread);
|
owner_thread->AddWaiter(cur_thread);
|
||||||
|
|
||||||
|
@ -67,7 +67,6 @@ void KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) {
|
||||||
|
|
||||||
if (owner_thread->IsSuspended()) {
|
if (owner_thread->IsSuspended()) {
|
||||||
owner_thread->ContinueIfHasKernelWaiters();
|
owner_thread->ContinueIfHasKernelWaiters();
|
||||||
KScheduler::SetSchedulerUpdateNeeded(kernel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,6 +76,7 @@ void KLightLock::LockSlowPath(uintptr_t _owner, uintptr_t _cur_thread) {
|
||||||
KThread* owner_thread = cur_thread->GetLockOwner();
|
KThread* owner_thread = cur_thread->GetLockOwner();
|
||||||
if (owner_thread) {
|
if (owner_thread) {
|
||||||
owner_thread->RemoveWaiter(cur_thread);
|
owner_thread->RemoveWaiter(cur_thread);
|
||||||
|
KScheduler::SetSchedulerUpdateNeeded(kernel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ void KLightLock::UnlockSlowPath(uintptr_t _cur_thread) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KLightLock::IsLockedByCurrentThread() const {
|
bool KLightLock::IsLockedByCurrentThread() const {
|
||||||
return (tag | 0x1ul) == (reinterpret_cast<uintptr_t>(GetCurrentThreadPointer(kernel)) | 0x1ul);
|
return (tag | 1ULL) == (reinterpret_cast<uintptr_t>(GetCurrentThreadPointer(kernel)) | 1ULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
|
|
@ -247,6 +247,7 @@ void KThread::Finalize() {
|
||||||
// Decrement the parent process's thread count.
|
// Decrement the parent process's thread count.
|
||||||
if (parent != nullptr) {
|
if (parent != nullptr) {
|
||||||
parent->DecrementThreadCount();
|
parent->DecrementThreadCount();
|
||||||
|
parent->GetResourceLimit()->Release(ResourceType::Threads, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,12 +41,18 @@ constexpr char ACC_SAVE_AVATORS_BASE_PATH[] = "/system/save/8000000000000010/su/
|
||||||
ProfileManager::ProfileManager() {
|
ProfileManager::ProfileManager() {
|
||||||
ParseUserSaveFile();
|
ParseUserSaveFile();
|
||||||
|
|
||||||
if (user_count == 0)
|
// Create an user if none are present
|
||||||
|
if (user_count == 0) {
|
||||||
CreateNewUser(UUID::Generate(), "yuzu");
|
CreateNewUser(UUID::Generate(), "yuzu");
|
||||||
|
}
|
||||||
|
|
||||||
auto current = std::clamp<int>(Settings::values.current_user, 0, MAX_USERS - 1);
|
auto current = std::clamp<int>(Settings::values.current_user, 0, MAX_USERS - 1);
|
||||||
if (UserExistsIndex(current))
|
|
||||||
|
// If user index don't exist. Load the first user and change the active user
|
||||||
|
if (!UserExistsIndex(current)) {
|
||||||
current = 0;
|
current = 0;
|
||||||
|
Settings::values.current_user = 0;
|
||||||
|
}
|
||||||
|
|
||||||
OpenUser(*GetUser(current));
|
OpenUser(*GetUser(current));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue