diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 12 |
2 files changed, 13 insertions, 4 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 599972211..c47fa9167 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -1534,6 +1534,7 @@ static void SleepThread(Core::System& system, s64 nanoseconds) { | |||
| 1534 | 1534 | ||
| 1535 | if (is_redundant && !system.Kernel().IsMulticore()) { | 1535 | if (is_redundant && !system.Kernel().IsMulticore()) { |
| 1536 | system.Kernel().ExitSVCProfile(); | 1536 | system.Kernel().ExitSVCProfile(); |
| 1537 | system.CoreTiming().AddTicks(1000U); | ||
| 1537 | system.GetCpuManager().PreemptSingleCore(); | 1538 | system.GetCpuManager().PreemptSingleCore(); |
| 1538 | system.Kernel().EnterSVCProfile(); | 1539 | system.Kernel().EnterSVCProfile(); |
| 1539 | } | 1540 | } |
| @@ -1762,6 +1763,10 @@ static u64 GetSystemTick(Core::System& system) { | |||
| 1762 | // Returns the value of cntpct_el0 (https://switchbrew.org/wiki/SVC#svcGetSystemTick) | 1763 | // Returns the value of cntpct_el0 (https://switchbrew.org/wiki/SVC#svcGetSystemTick) |
| 1763 | const u64 result{system.CoreTiming().GetClockTicks()}; | 1764 | const u64 result{system.CoreTiming().GetClockTicks()}; |
| 1764 | 1765 | ||
| 1766 | if (!system.Kernel().IsMulticore()) { | ||
| 1767 | core_timing.AddTicks(400U); | ||
| 1768 | } | ||
| 1769 | |||
| 1765 | return result; | 1770 | return result; |
| 1766 | } | 1771 | } |
| 1767 | 1772 | ||
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 65fedfc9b..d88039a16 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -246,19 +246,23 @@ ResultVal<std::shared_ptr<Thread>> Thread::Create(Core::System& system, ThreadTy | |||
| 246 | #ifdef ARCHITECTURE_x86_64 | 246 | #ifdef ARCHITECTURE_x86_64 |
| 247 | if (owner_process && !owner_process->Is64BitProcess()) { | 247 | if (owner_process && !owner_process->Is64BitProcess()) { |
| 248 | thread->arm_interface = std::make_unique<Core::ARM_Dynarmic_32>( | 248 | thread->arm_interface = std::make_unique<Core::ARM_Dynarmic_32>( |
| 249 | system, kernel.Interrupts(), kernel.GetExclusiveMonitor(), processor_id); | 249 | system, kernel.Interrupts(), kernel.IsMulticore(), kernel.GetExclusiveMonitor(), |
| 250 | processor_id); | ||
| 250 | } else { | 251 | } else { |
| 251 | thread->arm_interface = std::make_unique<Core::ARM_Dynarmic_64>( | 252 | thread->arm_interface = std::make_unique<Core::ARM_Dynarmic_64>( |
| 252 | system, kernel.Interrupts(), kernel.GetExclusiveMonitor(), processor_id); | 253 | system, kernel.Interrupts(), kernel.IsMulticore(), kernel.GetExclusiveMonitor(), |
| 254 | processor_id); | ||
| 253 | } | 255 | } |
| 254 | 256 | ||
| 255 | #else | 257 | #else |
| 256 | if (owner_process && !owner_process->Is64BitProcess()) { | 258 | if (owner_process && !owner_process->Is64BitProcess()) { |
| 257 | thread->arm_interface = std::make_shared<Core::ARM_Unicorn>( | 259 | thread->arm_interface = std::make_shared<Core::ARM_Unicorn>( |
| 258 | system, kernel.Interrupts(), ARM_Unicorn::Arch::AArch32, processor_id); | 260 | system, kernel.Interrupts(), kernel.IsMulticore(), ARM_Unicorn::Arch::AArch32, |
| 261 | processor_id); | ||
| 259 | } else { | 262 | } else { |
| 260 | thread->arm_interface = std::make_shared<Core::ARM_Unicorn>( | 263 | thread->arm_interface = std::make_shared<Core::ARM_Unicorn>( |
| 261 | system, kernel.Interrupts(), ARM_Unicorn::Arch::AArch64, processor_id); | 264 | system, kernel.Interrupts(), kernel.IsMulticore(), ARM_Unicorn::Arch::AArch64, |
| 265 | processor_id); | ||
| 262 | } | 266 | } |
| 263 | LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available"); | 267 | LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available"); |
| 264 | #endif | 268 | #endif |