mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-23 03:06:52 -04:00
kern: implement SvcArbitrateLock, SvcArbitrateUnlock
This commit is contained in:
parent
f4fd4cbbb2
commit
4f12449acf
3 changed files with 114 additions and 6 deletions
|
@ -21,28 +21,48 @@ namespace ams::kern::svc {
|
|||
|
||||
namespace {
|
||||
|
||||
constexpr bool IsKernelAddress(uintptr_t address) {
|
||||
return KernelVirtualAddressSpaceBase <= address && address < KernelVirtualAddressSpaceEnd;
|
||||
}
|
||||
|
||||
Result ArbitrateLock(ams::svc::Handle thread_handle, uintptr_t address, uint32_t tag) {
|
||||
/* Validate the input address. */
|
||||
R_UNLESS(!IsKernelAddress(address), svc::ResultInvalidCurrentMemory());
|
||||
R_UNLESS(util::IsAligned(address, sizeof(u32)), svc::ResultInvalidAddress());
|
||||
|
||||
MESOSPHERE_LOG("%lx: ArbitrateLock(%08x, %lx, %08x)\n", GetCurrentThread().GetId(), thread_handle, address, tag);
|
||||
return GetCurrentProcess().WaitForAddress(thread_handle, address, tag);
|
||||
}
|
||||
|
||||
Result ArbitrateUnlock(uintptr_t address) {
|
||||
/* Validate the input address. */
|
||||
R_UNLESS(!IsKernelAddress(address), svc::ResultInvalidCurrentMemory());
|
||||
R_UNLESS(util::IsAligned(address, sizeof(u32)), svc::ResultInvalidAddress());
|
||||
|
||||
MESOSPHERE_LOG("%lx: ArbitrateUnlock(%lx)\n", GetCurrentThread().GetId(), address);
|
||||
return GetCurrentProcess().SignalToAddress(address);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ============================= 64 ABI ============================= */
|
||||
|
||||
Result ArbitrateLock64(ams::svc::Handle thread_handle, ams::svc::Address address, uint32_t tag) {
|
||||
MESOSPHERE_PANIC("Stubbed SvcArbitrateLock64 was called.");
|
||||
return ArbitrateLock(thread_handle, address, tag);
|
||||
}
|
||||
|
||||
Result ArbitrateUnlock64(ams::svc::Address address) {
|
||||
MESOSPHERE_PANIC("Stubbed SvcArbitrateUnlock64 was called.");
|
||||
return ArbitrateUnlock(address);
|
||||
}
|
||||
|
||||
/* ============================= 64From32 ABI ============================= */
|
||||
|
||||
Result ArbitrateLock64From32(ams::svc::Handle thread_handle, ams::svc::Address address, uint32_t tag) {
|
||||
MESOSPHERE_PANIC("Stubbed SvcArbitrateLock64From32 was called.");
|
||||
return ArbitrateLock(thread_handle, address, tag);
|
||||
}
|
||||
|
||||
Result ArbitrateUnlock64From32(ams::svc::Address address) {
|
||||
MESOSPHERE_PANIC("Stubbed SvcArbitrateUnlock64From32 was called.");
|
||||
return ArbitrateUnlock(address);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue