|
|
|
@ -622,7 +622,6 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
|
|
|
|
|
|
|
|
|
|
// Kill the current thread
|
|
|
|
|
current_thread->Stop();
|
|
|
|
|
system.PrepareReschedule();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1004,6 +1003,7 @@ static ResultCode UnmapPhysicalMemory(Core::System& system, VAddr addr, u64 size
|
|
|
|
|
/// Sets the thread activity
|
|
|
|
|
static ResultCode SetThreadActivity(Core::System& system, Handle handle, u32 activity) {
|
|
|
|
|
LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, activity=0x{:08X}", handle, activity);
|
|
|
|
|
UNIMPLEMENTED();
|
|
|
|
|
if (activity > static_cast<u32>(ThreadActivity::Paused)) {
|
|
|
|
|
return ERR_INVALID_ENUM_VALUE;
|
|
|
|
|
}
|
|
|
|
@ -1032,7 +1032,6 @@ static ResultCode SetThreadActivity(Core::System& system, Handle handle, u32 act
|
|
|
|
|
|
|
|
|
|
thread->SetActivity(static_cast<ThreadActivity>(activity));
|
|
|
|
|
|
|
|
|
|
system.PrepareReschedule(thread->GetProcessorID());
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1385,6 +1384,7 @@ static ResultCode UnmapProcessCodeMemory(Core::System& system, Handle process_ha
|
|
|
|
|
/// Exits the current process
|
|
|
|
|
static void ExitProcess(Core::System& system) {
|
|
|
|
|
auto* current_process = system.Kernel().CurrentProcess();
|
|
|
|
|
UNIMPLEMENTED();
|
|
|
|
|
|
|
|
|
|
LOG_INFO(Kernel_SVC, "Process {} exiting", current_process->GetProcessID());
|
|
|
|
|
ASSERT_MSG(current_process->GetStatus() == ProcessStatus::Running,
|
|
|
|
@ -1394,8 +1394,6 @@ static void ExitProcess(Core::System& system) {
|
|
|
|
|
|
|
|
|
|
// Kill the current thread
|
|
|
|
|
system.CurrentScheduler().GetCurrentThread()->Stop();
|
|
|
|
|
|
|
|
|
|
system.PrepareReschedule();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Creates a new thread
|
|
|
|
@ -1458,8 +1456,6 @@ static ResultCode CreateThread(Core::System& system, Handle* out_handle, VAddr e
|
|
|
|
|
thread->SetName(
|
|
|
|
|
fmt::format("thread[entry_point={:X}, handle={:X}]", entry_point, *new_thread_handle));
|
|
|
|
|
|
|
|
|
|
system.PrepareReschedule(thread->GetProcessorID());
|
|
|
|
|
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1545,6 +1541,8 @@ static ResultCode WaitProcessWideKeyAtomic(Core::System& system, VAddr mutex_add
|
|
|
|
|
return ERR_INVALID_ADDRESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UNIMPLEMENTED();
|
|
|
|
|
|
|
|
|
|
ASSERT(condition_variable_addr == Common::AlignDown(condition_variable_addr, 4));
|
|
|
|
|
|
|
|
|
|
auto* const current_process = system.Kernel().CurrentProcess();
|
|
|
|
@ -1569,7 +1567,6 @@ static ResultCode WaitProcessWideKeyAtomic(Core::System& system, VAddr mutex_add
|
|
|
|
|
|
|
|
|
|
// Note: Deliberately don't attempt to inherit the lock owner's priority.
|
|
|
|
|
|
|
|
|
|
system.PrepareReschedule(current_thread->GetProcessorID());
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1580,6 +1577,8 @@ static void SignalProcessWideKey(Core::System& system, VAddr condition_variable_
|
|
|
|
|
|
|
|
|
|
ASSERT(condition_variable_addr == Common::AlignDown(condition_variable_addr, 4));
|
|
|
|
|
|
|
|
|
|
UNIMPLEMENTED();
|
|
|
|
|
|
|
|
|
|
// Retrieve a list of all threads that are waiting for this condition variable.
|
|
|
|
|
auto* const current_process = system.Kernel().CurrentProcess();
|
|
|
|
|
std::vector<std::shared_ptr<Thread>> waiting_threads =
|
|
|
|
@ -1634,7 +1633,6 @@ static void SignalProcessWideKey(Core::System& system, VAddr condition_variable_
|
|
|
|
|
thread->SetMutexWaitAddress(0);
|
|
|
|
|
thread->SetWaitHandle(0);
|
|
|
|
|
thread->SetWaitSynchronizationResult(RESULT_SUCCESS);
|
|
|
|
|
system.PrepareReschedule(thread->GetProcessorID());
|
|
|
|
|
} else {
|
|
|
|
|
// The mutex is already owned by some other thread, make this thread wait on it.
|
|
|
|
|
const Handle owner_handle = static_cast<Handle>(mutex_val & Mutex::MutexOwnerMask);
|
|
|
|
@ -1646,7 +1644,6 @@ static void SignalProcessWideKey(Core::System& system, VAddr condition_variable_
|
|
|
|
|
thread->SetStatus(ThreadStatus::WaitMutex);
|
|
|
|
|
|
|
|
|
|
owner->AddMutexWaiter(thread);
|
|
|
|
|
system.PrepareReschedule(thread->GetProcessorID());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1661,6 +1658,7 @@ static ResultCode WaitForAddress(Core::System& system, VAddr address, u32 type,
|
|
|
|
|
LOG_TRACE(Kernel_SVC, "called, address=0x{:X}, type=0x{:X}, value=0x{:X}, timeout={}", address,
|
|
|
|
|
type, value, timeout);
|
|
|
|
|
|
|
|
|
|
UNIMPLEMENTED();
|
|
|
|
|
// If the passed address is a kernel virtual address, return invalid memory state.
|
|
|
|
|
if (Core::Memory::IsKernelVirtualAddress(address)) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "Address is a kernel virtual address, address={:016X}", address);
|
|
|
|
@ -1677,9 +1675,6 @@ static ResultCode WaitForAddress(Core::System& system, VAddr address, u32 type,
|
|
|
|
|
auto& address_arbiter = system.Kernel().CurrentProcess()->GetAddressArbiter();
|
|
|
|
|
const ResultCode result =
|
|
|
|
|
address_arbiter.WaitForAddress(address, arbitration_type, value, timeout);
|
|
|
|
|
if (result == RESULT_SUCCESS) {
|
|
|
|
|
system.PrepareReschedule();
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1689,6 +1684,8 @@ static ResultCode SignalToAddress(Core::System& system, VAddr address, u32 type,
|
|
|
|
|
LOG_TRACE(Kernel_SVC, "called, address=0x{:X}, type=0x{:X}, value=0x{:X}, num_to_wake=0x{:X}",
|
|
|
|
|
address, type, value, num_to_wake);
|
|
|
|
|
|
|
|
|
|
UNIMPLEMENTED();
|
|
|
|
|
|
|
|
|
|
// If the passed address is a kernel virtual address, return invalid memory state.
|
|
|
|
|
if (Core::Memory::IsKernelVirtualAddress(address)) {
|
|
|
|
|
LOG_ERROR(Kernel_SVC, "Address is a kernel virtual address, address={:016X}", address);
|
|
|
|
@ -1945,7 +1942,6 @@ static ResultCode SignalEvent(Core::System& system, Handle handle) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
writable_event->Signal();
|
|
|
|
|
system.PrepareReschedule();
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|