Integrate new result macros. (#1780)

* result: try out some experimental shenanigans

* result: sketch out some more shenanigans

* result: see what it looks like to convert kernel to use result conds instead of guards

* make rest of kernel use experimental new macro-ing
This commit is contained in:
SciresM 2022-02-14 14:45:32 -08:00 committed by GitHub
parent 375ba615be
commit 96f95b9f95
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
109 changed files with 1355 additions and 1380 deletions

View file

@ -334,7 +334,7 @@ namespace ams::kern::board::nintendo::nx {
for (size_t i = 0; i < num_reserved; i++) {
this->ReleaseImpl(out[i]);
}
return svc::ResultOutOfResource();
R_THROW(svc::ResultOutOfResource());
}
void Release(u8 asid) {
@ -788,7 +788,7 @@ namespace ams::kern::board::nintendo::nx {
}
/* Ensure that we clean up the tables on failure. */
auto table_guard = SCOPE_GUARD {
ON_RESULT_FAILURE {
for (size_t i = start_index; i <= end_index; ++i) {
if (m_tables[i] != Null<KVirtualAddress> && ptm.Close(m_tables[i], 1)) {
ptm.Free(m_tables[i]);
@ -834,8 +834,7 @@ namespace ams::kern::board::nintendo::nx {
}
/* We succeeded. */
table_guard.Cancel();
return ResultSuccess();
R_SUCCEED();
}
void KDevicePageTable::Finalize() {
@ -915,14 +914,15 @@ namespace ams::kern::board::nintendo::nx {
if (ReadMcRegister(reg_offset) != new_val) {
WriteMcRegister(reg_offset, old_val);
SmmuSynchronizationBarrier();
return svc::ResultNotFound();
R_THROW(svc::ResultNotFound());
}
}
/* Mark the device as attached. */
m_attached_device |= (1ul << device_name);
return ResultSuccess();
R_SUCCEED();
}
Result KDevicePageTable::Detach(ams::svc::DeviceName device_name) {
@ -962,7 +962,7 @@ namespace ams::kern::board::nintendo::nx {
/* Mark the device as detached. */
m_attached_device &= ~(1ul << device_name);
return ResultSuccess();
R_SUCCEED();
}
bool KDevicePageTable::IsFree(KDeviceVirtualAddress address, u64 size) const {
@ -1112,7 +1112,7 @@ namespace ams::kern::board::nintendo::nx {
}
}
return ResultSuccess();
R_SUCCEED();
}
Result KDevicePageTable::MapImpl(KProcessPageTable *page_table, KProcessAddress process_address, size_t size, KDeviceVirtualAddress device_address, ams::svc::MemoryPermission device_perm, bool is_aligned) {
@ -1120,7 +1120,7 @@ namespace ams::kern::board::nintendo::nx {
R_UNLESS(this->IsFree(device_address, size), svc::ResultInvalidCurrentMemory());
/* Ensure that if we fail, we unmap anything we mapped. */
auto unmap_guard = SCOPE_GUARD { this->UnmapImpl(device_address, size, false); };
ON_RESULT_FAILURE { this->UnmapImpl(device_address, size, false); };
/* Iterate, mapping device pages. */
KDeviceVirtualAddress cur_addr = device_address;
@ -1148,10 +1148,7 @@ namespace ams::kern::board::nintendo::nx {
mapped_size += cur_size;
}
/* We're done, so cancel our guard. */
unmap_guard.Cancel();
return ResultSuccess();
R_SUCCEED();
}
void KDevicePageTable::UnmapImpl(KDeviceVirtualAddress address, u64 size, bool force) {
@ -1423,7 +1420,7 @@ namespace ams::kern::board::nintendo::nx {
MESOSPHERE_ASSERT(((device_address + size - 1) & ~DeviceVirtualAddressMask) == 0);
/* Map the pages. */
return this->MapImpl(page_table, process_address, size, device_address, device_perm, is_aligned);
R_RETURN(this->MapImpl(page_table, process_address, size, device_address, device_perm, is_aligned));
}
Result KDevicePageTable::Unmap(KProcessPageTable *page_table, KProcessAddress process_address, size_t size, KDeviceVirtualAddress device_address) {
@ -1437,7 +1434,7 @@ namespace ams::kern::board::nintendo::nx {
/* Unmap the pages. */
this->UnmapImpl(device_address, size, false);
return ResultSuccess();
R_SUCCEED();
}
}

View file

@ -256,7 +256,7 @@ namespace ams::kern::board::nintendo::nx {
g_secure_applet_memory_used = true;
*out = g_secure_applet_memory_address;
return ResultSuccess();
R_SUCCEED();
}
void FreeSecureMemoryForApplet(KVirtualAddress address, size_t size) {
@ -475,7 +475,7 @@ namespace ams::kern::board::nintendo::nx {
R_UNLESS(AMS_LIKELY(util::IsAligned(address, sizeof(u32))), svc::ResultInvalidAddress());
R_UNLESS(AMS_LIKELY(IsRegisterAccessibleToUser(address)), svc::ResultInvalidAddress());
R_UNLESS(AMS_LIKELY(smc::ReadWriteRegister(out, address, mask, value)), svc::ResultInvalidAddress());
return ResultSuccess();
R_SUCCEED();
}
/* Randomness. */
@ -622,7 +622,7 @@ namespace ams::kern::board::nintendo::nx {
Result KSystemControl::AllocateSecureMemory(KVirtualAddress *out, size_t size, u32 pool) {
/* Applet secure memory is handled separately. */
if (pool == KMemoryManager::Pool_Applet) {
return AllocateSecureMemoryForApplet(out, size);
R_RETURN(AllocateSecureMemoryForApplet(out, size));
}
/* Ensure the size is aligned. */
@ -635,7 +635,7 @@ namespace ams::kern::board::nintendo::nx {
R_UNLESS(paddr != Null<KPhysicalAddress>, svc::ResultOutOfMemory());
/* Ensure we don't leak references to the memory on error. */
auto mem_guard = SCOPE_GUARD { Kernel::GetMemoryManager().Close(paddr, num_pages); };
ON_RESULT_FAILURE { Kernel::GetMemoryManager().Close(paddr, num_pages); };
/* If the memory isn't already secure, set it as secure. */
if (pool != KMemoryManager::Pool_System) {
@ -644,9 +644,8 @@ namespace ams::kern::board::nintendo::nx {
}
/* We succeeded. */
mem_guard.Cancel();
*out = KPageTable::GetHeapVirtualAddress(paddr);
return ResultSuccess();
R_SUCCEED();
}
void KSystemControl::FreeSecureMemory(KVirtualAddress address, size_t size, u32 pool) {

View file

@ -392,7 +392,7 @@ namespace ams::kern::board::nintendo::nx::lps {
/* Instruct BPMP to enable suspend-to-sc7. */
R_UNLESS(BpmpEnableSuspend(TEGRA_BPMP_PM_SC7, 0) == 0, svc::ResultInvalidState());
return ResultSuccess();
R_SUCCEED();
}
void InvokeCpuSleepHandler(uintptr_t arg, uintptr_t entry) {