diff options
| -rw-r--r-- | src/core/hle/kernel/k_page_table.cpp | 60 |
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 | ||
| 1684 | ResultCode KPageTable::LockForCodeMemory(VAddr addr, std::size_t size) { | 1684 | ResultCode 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 | ||
| 1711 | ResultCode KPageTable::UnlockForCodeMemory(VAddr addr, std::size_t size) { | 1694 | ResultCode 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 | ||
| 1738 | ResultCode KPageTable::InitializeMemoryLayout(VAddr start, VAddr end) { | 1702 | ResultCode KPageTable::InitializeMemoryLayout(VAddr start, VAddr end) { |