mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Core: Improve APT Shared Font hack
Should fix invalid read loops in some games
This commit is contained in:
		
							parent
							
								
									32e279c0ca
								
							
						
					
					
						commit
						687d973980
					
				| @ -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…
	
		Reference in New Issue
	
	Block a user
	 Yuri Kunde Schlesner
						Yuri Kunde Schlesner