diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/k_page_table.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp index 2635d8148..73d96de42 100644 --- a/src/core/hle/kernel/k_page_table.cpp +++ b/src/core/hle/kernel/k_page_table.cpp | |||
| @@ -947,6 +947,9 @@ Result KPageTable::SetupForIpcServer(VAddr* out_addr, size_t size, VAddr src_add | |||
| 947 | 947 | ||
| 948 | ON_RESULT_FAILURE { | 948 | ON_RESULT_FAILURE { |
| 949 | if (cur_mapped_addr != dst_addr) { | 949 | if (cur_mapped_addr != dst_addr) { |
| 950 | // HACK: Manually close the pages. | ||
| 951 | HACK_ClosePages(dst_addr, (cur_mapped_addr - dst_addr) / PageSize); | ||
| 952 | |||
| 950 | ASSERT(Operate(dst_addr, (cur_mapped_addr - dst_addr) / PageSize, | 953 | ASSERT(Operate(dst_addr, (cur_mapped_addr - dst_addr) / PageSize, |
| 951 | KMemoryPermission::None, OperationType::Unmap) | 954 | KMemoryPermission::None, OperationType::Unmap) |
| 952 | .IsSuccess()); | 955 | .IsSuccess()); |
| @@ -1022,6 +1025,9 @@ Result KPageTable::SetupForIpcServer(VAddr* out_addr, size_t size, VAddr src_add | |||
| 1022 | // Map the page. | 1025 | // Map the page. |
| 1023 | R_TRY(Operate(cur_mapped_addr, 1, test_perm, OperationType::Map, start_partial_page)); | 1026 | R_TRY(Operate(cur_mapped_addr, 1, test_perm, OperationType::Map, start_partial_page)); |
| 1024 | 1027 | ||
| 1028 | // HACK: Manually open the pages. | ||
| 1029 | HACK_OpenPages(start_partial_page, 1); | ||
| 1030 | |||
| 1025 | // Update tracking extents. | 1031 | // Update tracking extents. |
| 1026 | cur_mapped_addr += PageSize; | 1032 | cur_mapped_addr += PageSize; |
| 1027 | cur_block_addr += PageSize; | 1033 | cur_block_addr += PageSize; |
| @@ -1050,6 +1056,9 @@ Result KPageTable::SetupForIpcServer(VAddr* out_addr, size_t size, VAddr src_add | |||
| 1050 | R_TRY(Operate(cur_mapped_addr, cur_block_size / PageSize, test_perm, OperationType::Map, | 1056 | R_TRY(Operate(cur_mapped_addr, cur_block_size / PageSize, test_perm, OperationType::Map, |
| 1051 | cur_block_addr)); | 1057 | cur_block_addr)); |
| 1052 | 1058 | ||
| 1059 | // HACK: Manually open the pages. | ||
| 1060 | HACK_OpenPages(cur_block_addr, cur_block_size / PageSize); | ||
| 1061 | |||
| 1053 | // Update tracking extents. | 1062 | // Update tracking extents. |
| 1054 | cur_mapped_addr += cur_block_size; | 1063 | cur_mapped_addr += cur_block_size; |
| 1055 | cur_block_addr = next_entry.phys_addr; | 1064 | cur_block_addr = next_entry.phys_addr; |
| @@ -1069,6 +1078,9 @@ Result KPageTable::SetupForIpcServer(VAddr* out_addr, size_t size, VAddr src_add | |||
| 1069 | R_TRY(Operate(cur_mapped_addr, last_block_size / PageSize, test_perm, OperationType::Map, | 1078 | R_TRY(Operate(cur_mapped_addr, last_block_size / PageSize, test_perm, OperationType::Map, |
| 1070 | cur_block_addr)); | 1079 | cur_block_addr)); |
| 1071 | 1080 | ||
| 1081 | // HACK: Manually open the pages. | ||
| 1082 | HACK_OpenPages(cur_block_addr, last_block_size / PageSize); | ||
| 1083 | |||
| 1072 | // Update tracking extents. | 1084 | // Update tracking extents. |
| 1073 | cur_mapped_addr += last_block_size; | 1085 | cur_mapped_addr += last_block_size; |
| 1074 | cur_block_addr += last_block_size; | 1086 | cur_block_addr += last_block_size; |
| @@ -1100,6 +1112,9 @@ Result KPageTable::SetupForIpcServer(VAddr* out_addr, size_t size, VAddr src_add | |||
| 1100 | 1112 | ||
| 1101 | // Map the page. | 1113 | // Map the page. |
| 1102 | R_TRY(Operate(cur_mapped_addr, 1, test_perm, OperationType::Map, end_partial_page)); | 1114 | R_TRY(Operate(cur_mapped_addr, 1, test_perm, OperationType::Map, end_partial_page)); |
| 1115 | |||
| 1116 | // HACK: Manually open the pages. | ||
| 1117 | HACK_OpenPages(end_partial_page, 1); | ||
| 1103 | } | 1118 | } |
| 1104 | 1119 | ||
| 1105 | // Update memory blocks to reflect our changes | 1120 | // Update memory blocks to reflect our changes |
| @@ -1202,6 +1217,9 @@ Result KPageTable::CleanupForIpcServer(VAddr address, size_t size, KMemoryState | |||
| 1202 | const size_t aligned_size = aligned_end - aligned_start; | 1217 | const size_t aligned_size = aligned_end - aligned_start; |
| 1203 | const size_t aligned_num_pages = aligned_size / PageSize; | 1218 | const size_t aligned_num_pages = aligned_size / PageSize; |
| 1204 | 1219 | ||
| 1220 | // HACK: Manually close the pages. | ||
| 1221 | HACK_ClosePages(aligned_start, aligned_num_pages); | ||
| 1222 | |||
| 1205 | // Unmap the pages. | 1223 | // Unmap the pages. |
| 1206 | R_TRY(Operate(aligned_start, aligned_num_pages, KMemoryPermission::None, OperationType::Unmap)); | 1224 | R_TRY(Operate(aligned_start, aligned_num_pages, KMemoryPermission::None, OperationType::Unmap)); |
| 1207 | 1225 | ||