summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZephyron <zephyron@citron-emu.org>2025-02-03 16:13:21 +1000
committerMike Lothian <mike@fireburn.co.uk>2025-05-11 14:54:45 +0100
commitd5d5f7a9c1da22ec2b24e6715241a1820344d841 (patch)
treedb7976d25f5ab225d2b6d0ea14351dacb2611588
parent35fbaef772567ac6bd2c84451a37ae48a824a9f7 (diff)
kernel/svc: Refactor UnmapProcessCodeMemory validation
Improve the validation logic in UnmapProcessCodeMemory by: - Add missing size validation check at the start - Reorganize validation checks into logical groups - Simplify error handling using R_UNLESS macros - Remove redundant page table range check - Add copyright notice for Citron Emulator Project - Add ResultInvalidSize constant definition The changes make the validation code more concise and easier to follow while maintaining the same validation requirements. Error handling is now more consistent with other SVC implementations.
-rw-r--r--src/core/hle/kernel/svc.h3
-rw-r--r--src/core/hle/kernel/svc/svc_process_memory.cpp62
2 files changed, 20 insertions, 45 deletions
diff --git a/src/core/hle/kernel/svc.h b/src/core/hle/kernel/svc.h
index 828f39611..28d36318c 100644
--- a/src/core/hle/kernel/svc.h
+++ b/src/core/hle/kernel/svc.h
@@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
// This file is automatically generated using svc_generator.py.
@@ -17,6 +18,8 @@ class System;
namespace Kernel::Svc {
+constexpr Result ResultInvalidSize{ErrorModule::Kernel, 104};
+
// clang-format off
Result SetHeapSize(Core::System& system, uint64_t* out_address, uint64_t size);
Result SetMemoryPermission(Core::System& system, uint64_t address, uint64_t size, MemoryPermission perm);
diff --git a/src/core/hle/kernel/svc/svc_process_memory.cpp b/src/core/hle/kernel/svc/svc_process_memory.cpp
index e1427947b..4c74a45f0 100644
--- a/src/core/hle/kernel/svc/svc_process_memory.cpp
+++ b/src/core/hle/kernel/svc/svc_process_memory.cpp
@@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-FileCopyrightText: Copyright 2025 Citron Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/core.h"
@@ -191,62 +192,33 @@ Result MapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst
}
Result UnmapProcessCodeMemory(Core::System& system, Handle process_handle, u64 dst_address,
- u64 src_address, u64 size) {
+ u64 src_address, u64 size) {
LOG_DEBUG(Kernel_SVC,
"called. process_handle=0x{:08X}, dst_address=0x{:016X}, src_address=0x{:016X}, "
"size=0x{:016X}",
process_handle, dst_address, src_address, size);
- if (!Common::Is4KBAligned(dst_address)) {
- LOG_ERROR(Kernel_SVC, "dst_address is not page-aligned (dst_address=0x{:016X}).",
- dst_address);
- R_THROW(ResultInvalidAddress);
- }
-
- if (!Common::Is4KBAligned(src_address)) {
- LOG_ERROR(Kernel_SVC, "src_address is not page-aligned (src_address=0x{:016X}).",
- src_address);
- R_THROW(ResultInvalidAddress);
- }
-
- if (size == 0 || !Common::Is4KBAligned(size)) {
- LOG_ERROR(Kernel_SVC, "Size is zero or not page-aligned (size=0x{:016X}).", size);
- R_THROW(ResultInvalidSize);
- }
+ // Add size validation
+ R_UNLESS(size != 0, ResultInvalidSize);
+ R_UNLESS(Common::IsAligned(size, PageSize), ResultInvalidSize);
- if (!IsValidAddressRange(dst_address, size)) {
- LOG_ERROR(Kernel_SVC,
- "Destination address range overflows the address space (dst_address=0x{:016X}, "
- "size=0x{:016X}).",
- dst_address, size);
- R_THROW(ResultInvalidCurrentMemory);
- }
+ // Validate address alignment
+ R_UNLESS(Common::IsAligned(dst_address, PageSize), ResultInvalidAddress);
+ R_UNLESS(Common::IsAligned(src_address, PageSize), ResultInvalidAddress);
- if (!IsValidAddressRange(src_address, size)) {
- LOG_ERROR(Kernel_SVC,
- "Source address range overflows the address space (src_address=0x{:016X}, "
- "size=0x{:016X}).",
- src_address, size);
- R_THROW(ResultInvalidCurrentMemory);
- }
+ // Validate address ranges
+ R_UNLESS(IsValidAddressRange(dst_address, size), ResultInvalidCurrentMemory);
+ R_UNLESS(IsValidAddressRange(src_address, size), ResultInvalidCurrentMemory);
- const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable();
- KScopedAutoObject process = handle_table.GetObject<KProcess>(process_handle);
- if (process.IsNull()) {
- LOG_ERROR(Kernel_SVC, "Invalid process handle specified (handle=0x{:08X}).",
- process_handle);
- R_THROW(ResultInvalidHandle);
- }
+ // Get the process from its handle
+ KScopedAutoObject process =
+ GetCurrentProcess(system.Kernel()).GetHandleTable().GetObject<KProcess>(process_handle);
+ R_UNLESS(process.IsNotNull(), ResultInvalidHandle);
+ // Get the page table
auto& page_table = process->GetPageTable();
- if (!page_table.Contains(src_address, size)) {
- LOG_ERROR(Kernel_SVC,
- "Source address range is not within the address space (src_address=0x{:016X}, "
- "size=0x{:016X}).",
- src_address, size);
- R_THROW(ResultInvalidCurrentMemory);
- }
+ // Perform the unmapping
R_RETURN(page_table.UnmapCodeMemory(dst_address, src_address, size));
}