summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/k_page_table.cpp60
1 files changed, 12 insertions, 48 deletions
diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp
index e47d9ce29..599013cf6 100644
--- a/src/core/hle/kernel/k_page_table.cpp
+++ b/src/core/hle/kernel/k_page_table.cpp
@@ -1682,57 +1682,21 @@ ResultCode KPageTable::UnlockForDeviceAddressSpace(VAddr addr, std::size_t size)
1682} 1682}
1683 1683
1684ResultCode KPageTable::LockForCodeMemory(VAddr addr, std::size_t size) { 1684ResultCode KPageTable::LockForCodeMemory(VAddr addr, std::size_t size) {
1685 KScopedLightLock lk(general_lock); 1685 return this->LockMemoryAndOpen(
1686 1686 nullptr, nullptr, addr, size, KMemoryState::FlagCanCodeMemory,
1687 KMemoryPermission new_perm = KMemoryPermission::NotMapped | KMemoryPermission::KernelReadWrite; 1687 KMemoryState::FlagCanCodeMemory, KMemoryPermission::All, KMemoryPermission::UserReadWrite,
1688 1688 KMemoryAttribute::All, KMemoryAttribute::None,
1689 KMemoryPermission old_perm{}; 1689 static_cast<KMemoryPermission>(KMemoryPermission::NotMapped |
1690 1690 KMemoryPermission::KernelReadWrite),
1691 if (const ResultCode result{CheckMemoryState( 1691 KMemoryAttribute::Locked);
1692 nullptr, &old_perm, nullptr, nullptr, addr, size, KMemoryState::FlagCanCodeMemory,
1693 KMemoryState::FlagCanCodeMemory, KMemoryPermission::All,
1694 KMemoryPermission::UserReadWrite, KMemoryAttribute::All, KMemoryAttribute::None)};
1695 result.IsError()) {
1696 return result;
1697 }
1698
1699 new_perm = (new_perm != KMemoryPermission::None) ? new_perm : old_perm;
1700
1701 block_manager->UpdateLock(
1702 addr, size / PageSize,
1703 [](KMemoryBlockManager::iterator block, KMemoryPermission permission) {
1704 block->ShareToDevice(permission);
1705 },
1706 new_perm);
1707
1708 return ResultSuccess;
1709} 1692}
1710 1693
1711ResultCode KPageTable::UnlockForCodeMemory(VAddr addr, std::size_t size) { 1694ResultCode KPageTable::UnlockForCodeMemory(VAddr addr, std::size_t size) {
1712 KScopedLightLock lk(general_lock); 1695 return this->UnlockMemory(addr, size, KMemoryState::FlagCanCodeMemory,
1713 1696 KMemoryState::FlagCanCodeMemory, KMemoryPermission::None,
1714 KMemoryPermission new_perm = KMemoryPermission::UserReadWrite; 1697 KMemoryPermission::None, KMemoryAttribute::All,
1715 1698 KMemoryAttribute::Locked, KMemoryPermission::UserReadWrite,
1716 KMemoryPermission old_perm{}; 1699 KMemoryAttribute::Locked, nullptr);
1717
1718 if (const ResultCode result{CheckMemoryState(
1719 nullptr, &old_perm, nullptr, nullptr, addr, size, KMemoryState::FlagCanCodeMemory,
1720 KMemoryState::FlagCanCodeMemory, KMemoryPermission::None, KMemoryPermission::None,
1721 KMemoryAttribute::All, KMemoryAttribute::Locked)};
1722 result.IsError()) {
1723 return result;
1724 }
1725
1726 new_perm = (new_perm != KMemoryPermission::None) ? new_perm : old_perm;
1727
1728 block_manager->UpdateLock(
1729 addr, size / PageSize,
1730 [](KMemoryBlockManager::iterator block, KMemoryPermission permission) {
1731 block->UnshareToDevice(permission);
1732 },
1733 new_perm);
1734
1735 return ResultSuccess;
1736} 1700}
1737 1701
1738ResultCode KPageTable::InitializeMemoryLayout(VAddr start, VAddr end) { 1702ResultCode KPageTable::InitializeMemoryLayout(VAddr start, VAddr end) {