tmem: Add tmemCloseHandle(), tmemWaitForPermission()

Edit nv.c to use those functions
This commit is contained in:
MasaGratoR 2023-04-14 09:12:07 +02:00 committed by GitHub
parent 2c756d1435
commit 754d8d6816
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 17 deletions

View File

@ -72,9 +72,26 @@ static inline void* tmemGetAddr(TransferMemory* t){
return t->map_addr;
}
/**
* @brief Closes handle of a transfer memory object.
* @param t Transfer memory information structure.
* @return Result code.
*/
Result tmemCloseHandle(TransferMemory* t);
/**
* @brief Waits until source backing memory permissions match perm.
* @param t Transfer memory information structure.
* @param perm Permissions which the source backing memory is expected to have before return.
* @return Result code.
*/
Result tmemWaitForPermission(TransferMemory* t, Permission perm);
/**
* @brief Frees up resources used by a transfer memory object, unmapping and closing handles, etc.
* @param t Transfer memory information structure.
* @return Result code.
*/
Result tmemClose(TransferMemory* t);
Result tmemClose(TransferMemory* t);

View File

@ -100,6 +100,45 @@ Result tmemUnmap(TransferMemory* t)
return rc;
}
Result tmemCloseHandle(TransferMemory* t)
{
Result rc = 0;
if (t->handle != INVALID_HANDLE) {
rc = svcCloseHandle(t->handle);
t->handle = INVALID_HANDLE;
}
return rc;
}
Result tmemWaitForPermission(TransferMemory* t, Permission perm)
{
Result rc = 0;
if ((t->perm & perm) != perm) {
MemoryInfo m = {0};
u32 p = 0;
rc = svcQueryMemory(&m, &p, (u64)(t->src_addr));
if (R_FAILED(rc)) {
return rc;
}
while ((m.perm & perm) != perm) {
rc = svcQueryMemory(&m, &p, (u64)(t->src_addr));
if (R_FAILED(rc)) {
return rc;
}
svcSleepThread(100000);
}
}
return rc;
}
Result tmemClose(TransferMemory* t)
{
Result rc = 0;
@ -114,21 +153,6 @@ Result tmemClose(TransferMemory* t)
}
if (t->src_addr != NULL) {
if ((t->perm & Perm_Rw) != Perm_Rw) {
MemoryInfo m = {0};
u32 p = 0;
rc = svcQueryMemory(&m, &p, (u64)(t->src_addr));
if (R_FAILED(rc)) {
return rc;
}
while ((m.perm & Perm_Rw) != Perm_Rw) {
rc = svcQueryMemory(&m, &p, (u64)(t->src_addr));
if (R_FAILED(rc)) {
return rc;
}
svcSleepThread(100000);
}
}
__libnx_free(t->src_addr);
}
@ -137,4 +161,4 @@ Result tmemClose(TransferMemory* t)
}
return rc;
}
}

View File

@ -54,6 +54,9 @@ Result _nvInitialize(void) {
if (R_SUCCEEDED(rc))
rc = _nvCmdInitialize(CUR_PROCESS_HANDLE, g_nvTransfermem.handle, tmem_size);
if (R_SUCCEEDED(rc))
rc = tmemCloseHandle(&g_nvTransfermem);
// Clone the session handle - the cloned session is used to execute certain commands in parallel
if (R_SUCCEEDED(rc))
@ -73,6 +76,7 @@ Result _nvInitialize(void) {
void _nvCleanup(void) {
serviceClose(&g_nvSrvClone);
serviceClose(&g_nvSrv);
tmemWaitForPermission(&g_nvTransfermem, Perm_Rw);
tmemClose(&g_nvTransfermem);
}