From b11288ea44f003c96bbcdbf09cb24d40131f27f0 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Mon, 21 May 2018 16:57:11 -0400 Subject: [PATCH] In jitTransitionToWritable() and jitTransitionToExecutable(), only run the JitType_CodeMemory handling code when it's actually needed. Actually free j->rx_addr in jitClose() for JitType_JitMemory. --- nx/include/switch/kernel/jit.h | 1 + nx/source/kernel/jit.c | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/nx/include/switch/kernel/jit.h b/nx/include/switch/kernel/jit.h index 978e3f14..f6261663 100644 --- a/nx/include/switch/kernel/jit.h +++ b/nx/include/switch/kernel/jit.h @@ -20,6 +20,7 @@ typedef struct { void* src_addr; void* rx_addr; void* rw_addr; + bool is_executable; Handle handle; } Jit; diff --git a/nx/source/kernel/jit.c b/nx/source/kernel/jit.c index f9f2cc59..5715048c 100644 --- a/nx/source/kernel/jit.c +++ b/nx/source/kernel/jit.c @@ -40,6 +40,7 @@ Result jitCreate(Jit* j, size_t size) j->src_addr = src_addr; j->rx_addr = virtmemReserve(j->size); j->handle = INVALID_HANDLE; + j->is_executable = 0; Result rc = 0; @@ -94,7 +95,7 @@ Result jitTransitionToWritable(Jit* j) switch (j->type) { case JitType_CodeMemory: - rc = svcUnmapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size); + if (j->is_executable) rc = svcUnmapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size); break; case JitType_JitMemory: @@ -102,6 +103,8 @@ Result jitTransitionToWritable(Jit* j) break; } + if (R_SUCCEEDED(rc)) j->is_executable = 0; + return rc; } @@ -111,13 +114,15 @@ Result jitTransitionToExecutable(Jit* j) switch (j->type) { case JitType_CodeMemory: - rc = svcMapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size); + if (!j->is_executable) { + rc = svcMapProcessCodeMemory(envGetOwnProcessHandle(), (u64) j->rx_addr, (u64) j->src_addr, j->size); - if (R_SUCCEEDED(rc)) { - rc = svcSetProcessMemoryPermission(envGetOwnProcessHandle(), (u64) j->rx_addr, j->size, Perm_Rx); + if (R_SUCCEEDED(rc)) { + rc = svcSetProcessMemoryPermission(envGetOwnProcessHandle(), (u64) j->rx_addr, j->size, Perm_Rx); - if (R_FAILED(rc)) { - jitTransitionToWritable(j); + if (R_FAILED(rc)) { + jitTransitionToWritable(j); + } } } break; @@ -128,6 +133,8 @@ Result jitTransitionToExecutable(Jit* j) break; } + if (R_SUCCEEDED(rc)) j->is_executable = 1; + return rc; } @@ -154,7 +161,7 @@ Result jitClose(Jit* j) rc = svcControlCodeMemory(j->handle, CodeMapOperation_UnmapSlave, j->rx_addr, j->size, 0); if (R_SUCCEEDED(rc)) { - virtmemFree(j->rw_addr, j->size); + virtmemFree(j->rx_addr, j->size); svcCloseHandle(j->handle); } }