mirror of
https://github.com/azahar-emu/azahar.git
synced 2026-06-06 02:33:44 -04:00
core: Move plugin FB address ownership to MemorySystem (#1572)
This commit is contained in:
parent
47cd41cc58
commit
8acdb35798
6 changed files with 23 additions and 30 deletions
|
|
@ -290,7 +290,7 @@ Loader::ResultStatus FileSys::Plugin3GXLoader::Map(
|
||||||
ASSERT(vma_heap.Succeeded());
|
ASSERT(vma_heap.Succeeded());
|
||||||
process.vm_manager.Reprotect(vma_heap.Unwrap(), Kernel::VMAPermission::ReadWriteExecute);
|
process.vm_manager.Reprotect(vma_heap.Unwrap(), Kernel::VMAPermission::ReadWriteExecute);
|
||||||
|
|
||||||
plg_ldr.SetPluginFBAddr(Memory::FCRAM_PADDR + fcram_offset + heap_offset);
|
kernel.memory.Plugin3GXFramebufferAddress() = Memory::FCRAM_PADDR + fcram_offset + heap_offset;
|
||||||
plg_context.plugin_loaded = true;
|
plg_context.plugin_loaded = true;
|
||||||
plg_context.plugin_process_id = process.process_id;
|
plg_context.plugin_process_id = process.process_id;
|
||||||
plg_context.use_user_load_parameters = false;
|
plg_context.use_user_load_parameters = false;
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,6 @@ void PLG_LDR::PluginLoaderContext::serialize(Archive& ar, const unsigned int) {
|
||||||
ar & exe_load_checksum;
|
ar & exe_load_checksum;
|
||||||
ar & load_exe_func;
|
ar & load_exe_func;
|
||||||
ar & load_exe_args;
|
ar & load_exe_args;
|
||||||
ar & plugin_fb_addr;
|
|
||||||
}
|
}
|
||||||
SERIALIZE_IMPL(PLG_LDR::PluginLoaderContext)
|
SERIALIZE_IMPL(PLG_LDR::PluginLoaderContext)
|
||||||
|
|
||||||
|
|
@ -167,6 +166,7 @@ void PLG_LDR::OnProcessExit(Kernel::Process& process, Kernel::KernelSystem& kern
|
||||||
plgldr_context.plugin_loaded = false;
|
plgldr_context.plugin_loaded = false;
|
||||||
plgldr_context.plugin_process_id = UINT32_MAX;
|
plgldr_context.plugin_process_id = UINT32_MAX;
|
||||||
plgldr_context.memory_changed_handle = 0;
|
plgldr_context.memory_changed_handle = 0;
|
||||||
|
kernel.memory.Plugin3GXFramebufferAddress() = 0;
|
||||||
LOG_INFO(Service_PLGLDR, "Plugin unloaded successfully.");
|
LOG_INFO(Service_PLGLDR, "Plugin unloaded successfully.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -81,8 +81,6 @@ public:
|
||||||
std::vector<u32> load_exe_func;
|
std::vector<u32> load_exe_func;
|
||||||
u32_le load_exe_args[4] = {0};
|
u32_le load_exe_args[4] = {0};
|
||||||
|
|
||||||
PAddr plugin_fb_addr = 0;
|
|
||||||
|
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
void serialize(Archive& ar, const unsigned int);
|
void serialize(Archive& ar, const unsigned int);
|
||||||
friend class boost::serialization::access;
|
friend class boost::serialization::access;
|
||||||
|
|
@ -114,12 +112,6 @@ public:
|
||||||
bool GetAllowGameChangeState() {
|
bool GetAllowGameChangeState() {
|
||||||
return plgldr_context.allow_game_change;
|
return plgldr_context.allow_game_change;
|
||||||
}
|
}
|
||||||
void SetPluginFBAddr(PAddr addr) {
|
|
||||||
plgldr_context.plugin_fb_addr = addr;
|
|
||||||
}
|
|
||||||
PAddr GetPluginFBAddr() {
|
|
||||||
return plgldr_context.plugin_fb_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Core::System& system;
|
Core::System& system;
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,8 @@ public:
|
||||||
std::shared_ptr<BackingMem> n3ds_extra_ram_mem;
|
std::shared_ptr<BackingMem> n3ds_extra_ram_mem;
|
||||||
std::shared_ptr<BackingMem> dsp_mem;
|
std::shared_ptr<BackingMem> dsp_mem;
|
||||||
|
|
||||||
|
PAddr plugin_fb_address{};
|
||||||
|
|
||||||
Impl(Core::System& system_);
|
Impl(Core::System& system_);
|
||||||
|
|
||||||
const u8* GetPtr(Region r) const {
|
const u8* GetPtr(Region r) const {
|
||||||
|
|
@ -262,12 +264,8 @@ public:
|
||||||
if (addr >= VRAM_VADDR && addr < VRAM_VADDR_END) {
|
if (addr >= VRAM_VADDR && addr < VRAM_VADDR_END) {
|
||||||
return {vram_mem, addr - VRAM_VADDR};
|
return {vram_mem, addr - VRAM_VADDR};
|
||||||
}
|
}
|
||||||
if (addr >= PLUGIN_3GX_FB_VADDR && addr < PLUGIN_3GX_FB_VADDR_END) {
|
if (addr >= PLUGIN_3GX_FB_VADDR && addr < PLUGIN_3GX_FB_VADDR_END && plugin_fb_address) {
|
||||||
auto plg_ldr = Service::PLGLDR::GetService(system);
|
return {fcram_mem, addr - PLUGIN_3GX_FB_VADDR + plugin_fb_address - FCRAM_PADDR};
|
||||||
if (plg_ldr) {
|
|
||||||
return {fcram_mem,
|
|
||||||
addr - PLUGIN_3GX_FB_VADDR + plg_ldr->GetPluginFBAddr() - FCRAM_PADDR};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
|
@ -306,9 +304,8 @@ public:
|
||||||
CheckRegion(LINEAR_HEAP_VADDR, LINEAR_HEAP_VADDR_END, FCRAM_PADDR);
|
CheckRegion(LINEAR_HEAP_VADDR, LINEAR_HEAP_VADDR_END, FCRAM_PADDR);
|
||||||
CheckRegion(NEW_LINEAR_HEAP_VADDR, NEW_LINEAR_HEAP_VADDR_END, FCRAM_PADDR);
|
CheckRegion(NEW_LINEAR_HEAP_VADDR, NEW_LINEAR_HEAP_VADDR_END, FCRAM_PADDR);
|
||||||
CheckRegion(VRAM_VADDR, VRAM_VADDR_END, VRAM_PADDR);
|
CheckRegion(VRAM_VADDR, VRAM_VADDR_END, VRAM_PADDR);
|
||||||
auto plg_ldr = Service::PLGLDR::GetService(system);
|
if (plugin_fb_address) {
|
||||||
if (plg_ldr && plg_ldr->GetPluginFBAddr()) {
|
CheckRegion(PLUGIN_3GX_FB_VADDR, PLUGIN_3GX_FB_VADDR_END, plugin_fb_address);
|
||||||
CheckRegion(PLUGIN_3GX_FB_VADDR, PLUGIN_3GX_FB_VADDR_END, plg_ldr->GetPluginFBAddr());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -332,6 +329,7 @@ private:
|
||||||
ar & vram_mem;
|
ar & vram_mem;
|
||||||
ar & n3ds_extra_ram_mem;
|
ar & n3ds_extra_ram_mem;
|
||||||
ar & dsp_mem;
|
ar & dsp_mem;
|
||||||
|
ar & plugin_fb_address;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -390,6 +388,10 @@ void MemorySystem::RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode
|
||||||
impl->RasterizerFlushVirtualRegion(start, size, mode);
|
impl->RasterizerFlushVirtualRegion(start, size, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PAddr& Memory::MemorySystem::Plugin3GXFramebufferAddress() {
|
||||||
|
return impl->plugin_fb_address;
|
||||||
|
}
|
||||||
|
|
||||||
void MemorySystem::MapPages(PageTable& page_table, u32 base, u32 size, MemoryRef memory,
|
void MemorySystem::MapPages(PageTable& page_table, u32 base, u32 size, MemoryRef memory,
|
||||||
PageType type) {
|
PageType type) {
|
||||||
LOG_DEBUG(HW_Memory, "Mapping {} onto {:08X}-{:08X}", (void*)memory.GetPtr(),
|
LOG_DEBUG(HW_Memory, "Mapping {} onto {:08X}-{:08X}", (void*)memory.GetPtr(),
|
||||||
|
|
@ -711,12 +713,9 @@ std::vector<VAddr> MemorySystem::PhysicalToVirtualAddressForRasterizer(PAddr add
|
||||||
return {addr - VRAM_PADDR + VRAM_VADDR};
|
return {addr - VRAM_PADDR + VRAM_VADDR};
|
||||||
}
|
}
|
||||||
// NOTE: Order matters here.
|
// NOTE: Order matters here.
|
||||||
auto plg_ldr = Service::PLGLDR::GetService(impl->system);
|
PAddr plg_fb_addr = Plugin3GXFramebufferAddress();
|
||||||
if (plg_ldr) {
|
if (plg_fb_addr && addr >= plg_fb_addr && addr < plg_fb_addr + PLUGIN_3GX_FB_SIZE) {
|
||||||
auto fb_addr = plg_ldr->GetPluginFBAddr();
|
return {addr - plg_fb_addr + PLUGIN_3GX_FB_VADDR};
|
||||||
if (addr >= fb_addr && addr < fb_addr + PLUGIN_3GX_FB_SIZE) {
|
|
||||||
return {addr - fb_addr + PLUGIN_3GX_FB_VADDR};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (addr >= FCRAM_PADDR && addr < FCRAM_PADDR_END) {
|
if (addr >= FCRAM_PADDR && addr < FCRAM_PADDR_END) {
|
||||||
return {addr - FCRAM_PADDR + LINEAR_HEAP_VADDR, addr - FCRAM_PADDR + NEW_LINEAR_HEAP_VADDR};
|
return {addr - FCRAM_PADDR + LINEAR_HEAP_VADDR, addr - FCRAM_PADDR + NEW_LINEAR_HEAP_VADDR};
|
||||||
|
|
|
||||||
|
|
@ -646,6 +646,9 @@ public:
|
||||||
|
|
||||||
void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode);
|
void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode);
|
||||||
|
|
||||||
|
/// Returns a reference to the framebuffer address of the currently loaded 3GX plugin.
|
||||||
|
PAddr& Plugin3GXFramebufferAddress();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T Read(const std::shared_ptr<PageTable>& page_table, const VAddr vaddr);
|
T Read(const std::shared_ptr<PageTable>& page_table, const VAddr vaddr);
|
||||||
|
|
|
||||||
|
|
@ -57,11 +57,10 @@ PAddr GPU::VirtualToPhysicalAddress(VAddr addr) {
|
||||||
if (addr >= Memory::NEW_LINEAR_HEAP_VADDR && addr <= Memory::NEW_LINEAR_HEAP_VADDR_END) {
|
if (addr >= Memory::NEW_LINEAR_HEAP_VADDR && addr <= Memory::NEW_LINEAR_HEAP_VADDR_END) {
|
||||||
return addr - Memory::NEW_LINEAR_HEAP_VADDR + Memory::FCRAM_PADDR;
|
return addr - Memory::NEW_LINEAR_HEAP_VADDR + Memory::FCRAM_PADDR;
|
||||||
}
|
}
|
||||||
if (addr >= Memory::PLUGIN_3GX_FB_VADDR && addr <= Memory::PLUGIN_3GX_FB_VADDR_END) {
|
PAddr plg_fb_addr;
|
||||||
auto plg_ldr = Service::PLGLDR::GetService(impl->system);
|
if (addr >= Memory::PLUGIN_3GX_FB_VADDR && addr <= Memory::PLUGIN_3GX_FB_VADDR_END &&
|
||||||
if (plg_ldr) {
|
(plg_fb_addr = impl->system.Memory().Plugin3GXFramebufferAddress())) {
|
||||||
return addr - Memory::PLUGIN_3GX_FB_VADDR + plg_ldr->GetPluginFBAddr();
|
return addr - Memory::PLUGIN_3GX_FB_VADDR + plg_fb_addr;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x{:08X}", addr);
|
LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x{:08X}", addr);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue