mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #1075 from yuriks/ControlMem-fixes
Fix heap-management regressions
This commit is contained in:
		
						commit
						2978b5fbc8
					
				
					 4 changed files with 37 additions and 4 deletions
				
			
		|  | @ -174,6 +174,10 @@ ResultCode Process::HeapFree(VAddr target, u32 size) { | ||||||
|         return ERR_INVALID_ADDRESS; |         return ERR_INVALID_ADDRESS; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (size == 0) { | ||||||
|  |         return RESULT_SUCCESS; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     ResultCode result = vm_manager.UnmapRange(target, size); |     ResultCode result = vm_manager.UnmapRange(target, size); | ||||||
|     if (result.IsError()) return result; |     if (result.IsError()) return result; | ||||||
| 
 | 
 | ||||||
|  | @ -226,6 +230,10 @@ ResultCode Process::LinearFree(VAddr target, u32 size) { | ||||||
|         return ERR_INVALID_ADDRESS; |         return ERR_INVALID_ADDRESS; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (size == 0) { | ||||||
|  |         return RESULT_SUCCESS; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     VAddr heap_end = GetLinearHeapBase() + (u32)linheap_memory->size(); |     VAddr heap_end = GetLinearHeapBase() + (u32)linheap_memory->size(); | ||||||
|     if (target + size > heap_end) { |     if (target + size > heap_end) { | ||||||
|         return ERR_INVALID_ADDRESS_STATE; |         return ERR_INVALID_ADDRESS_STATE; | ||||||
|  |  | ||||||
|  | @ -20,6 +20,7 @@ SharedPtr<SharedMemory> SharedMemory::Create(u32 size, MemoryPermission permissi | ||||||
| 
 | 
 | ||||||
|     shared_memory->name = std::move(name); |     shared_memory->name = std::move(name); | ||||||
|     shared_memory->base_address = 0x0; |     shared_memory->base_address = 0x0; | ||||||
|  |     shared_memory->fixed_address = 0x0; | ||||||
|     shared_memory->size = size; |     shared_memory->size = size; | ||||||
|     shared_memory->permissions = permissions; |     shared_memory->permissions = permissions; | ||||||
|     shared_memory->other_permissions = other_permissions; |     shared_memory->other_permissions = other_permissions; | ||||||
|  | @ -30,9 +31,31 @@ SharedPtr<SharedMemory> SharedMemory::Create(u32 size, MemoryPermission permissi | ||||||
| ResultCode SharedMemory::Map(VAddr address, MemoryPermission permissions, | ResultCode SharedMemory::Map(VAddr address, MemoryPermission permissions, | ||||||
|         MemoryPermission other_permissions) { |         MemoryPermission other_permissions) { | ||||||
| 
 | 
 | ||||||
|  |     if (base_address != 0) { | ||||||
|  |         LOG_ERROR(Kernel, "cannot map id=%u, address=0x%08X name=%s: already mapped at 0x%08X!", | ||||||
|  |             GetObjectId(), address, name.c_str(), base_address); | ||||||
|  |         // TODO: Verify error code with hardware
 | ||||||
|  |         return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel, | ||||||
|  |             ErrorSummary::InvalidArgument, ErrorLevel::Permanent); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (fixed_address != 0) { | ||||||
|  |          if (address != 0 && address != fixed_address) { | ||||||
|  |             LOG_ERROR(Kernel, "cannot map id=%u, address=0x%08X name=%s: fixed_addres is 0x%08X!", | ||||||
|  |                     GetObjectId(), address, name.c_str(), fixed_address); | ||||||
|  |             // TODO: Verify error code with hardware
 | ||||||
|  |             return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel, | ||||||
|  |                 ErrorSummary::InvalidArgument, ErrorLevel::Permanent); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // HACK(yuriks): This is only here to support the APT shared font mapping right now.
 | ||||||
|  |         // Later, this should actually map the memory block onto the address space.
 | ||||||
|  |         return RESULT_SUCCESS; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     if (address < Memory::SHARED_MEMORY_VADDR || address + size >= Memory::SHARED_MEMORY_VADDR_END) { |     if (address < Memory::SHARED_MEMORY_VADDR || address + size >= Memory::SHARED_MEMORY_VADDR_END) { | ||||||
|         LOG_ERROR(Kernel, "cannot map id=%u, address=0x%08X outside of shared mem bounds!", |         LOG_ERROR(Kernel, "cannot map id=%u, address=0x%08X name=%s outside of shared mem bounds!", | ||||||
|                 GetObjectId(), address); |                 GetObjectId(), address, name.c_str()); | ||||||
|         // TODO: Verify error code with hardware
 |         // TODO: Verify error code with hardware
 | ||||||
|         return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel, |         return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::Kernel, | ||||||
|                 ErrorSummary::InvalidArgument, ErrorLevel::Permanent); |                 ErrorSummary::InvalidArgument, ErrorLevel::Permanent); | ||||||
|  |  | ||||||
|  | @ -61,6 +61,8 @@ public: | ||||||
| 
 | 
 | ||||||
|     /// Address of shared memory block in the process.
 |     /// Address of shared memory block in the process.
 | ||||||
|     VAddr base_address; |     VAddr base_address; | ||||||
|  |     /// Fixed address to allow mapping to. Used for blocks created from the linear heap.
 | ||||||
|  |     VAddr fixed_address; | ||||||
|     /// Size of the memory block. Page-aligned.
 |     /// Size of the memory block. Page-aligned.
 | ||||||
|     u32 size; |     u32 size; | ||||||
|     /// Permission restrictions applied to the process which created the block.
 |     /// Permission restrictions applied to the process which created the block.
 | ||||||
|  |  | ||||||
|  | @ -78,8 +78,8 @@ void GetSharedFont(Service::Interface* self) { | ||||||
|     if (shared_font != nullptr) { |     if (shared_font != nullptr) { | ||||||
|         // TODO(yuriks): This is a hack to keep this working right now even with our completely
 |         // TODO(yuriks): This is a hack to keep this working right now even with our completely
 | ||||||
|         // broken shared memory system.
 |         // broken shared memory system.
 | ||||||
|         shared_font_mem->base_address = SHARED_FONT_VADDR; |         shared_font_mem->fixed_address = SHARED_FONT_VADDR; | ||||||
|         Kernel::g_current_process->vm_manager.MapMemoryBlock(shared_font_mem->base_address, |         Kernel::g_current_process->vm_manager.MapMemoryBlock(shared_font_mem->fixed_address, | ||||||
|                 shared_font, 0, shared_font_mem->size, Kernel::MemoryState::Shared); |                 shared_font, 0, shared_font_mem->size, Kernel::MemoryState::Shared); | ||||||
| 
 | 
 | ||||||
|         cmd_buff[0] = IPC::MakeHeader(0x44, 2, 2); |         cmd_buff[0] = IPC::MakeHeader(0x44, 2, 2); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue