From f454211bc86602a4e98c7cd99aee198d58c2857c Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Thu, 20 Jul 2017 15:18:59 +0200 Subject: [PATCH] MmMapIoSpace and MmUnmapIoSpace : Write-combined addresses are now passed-through --- src/CxbxKrnl/CxbxKrnl.h | 9 ++++++++- src/CxbxKrnl/EmuKrnlMm.cpp | 24 +++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/CxbxKrnl/CxbxKrnl.h b/src/CxbxKrnl/CxbxKrnl.h index 42b124c99..6d3c88763 100644 --- a/src/CxbxKrnl/CxbxKrnl.h +++ b/src/CxbxKrnl/CxbxKrnl.h @@ -84,7 +84,14 @@ typedef uint32 xbaddr; /*! base addresses of various components */ #define XBOX_KERNEL_BASE (MM_SYSTEM_PHYSICAL_MAP + XBE_IMAGE_BASE) -#define XBOX_NV2A_INIT_VECTOR 0xFF000008 + +#define XBOX_WRITE_COMBINED_BASE 0xF0000000 +#define XBOX_WRITE_COMBINED_SIZE 0x08000000 // - 0xF7FFFFF + +#define XBOX_UNCACHED_BASE 0xF8000000 +#define XBOX_UNCACHED_SIZE 0x07F00000 // - 0xFFEFFFFF + +#define XBOX_NV2A_INIT_VECTOR 0xFF000008 #define XBOX_FLASH_ROM_BASE 0xFFF00000 #define XBOX_FLASH_ROM_SIZE 0x00100000 // - 0xFFFFFFF diff --git a/src/CxbxKrnl/EmuKrnlMm.cpp b/src/CxbxKrnl/EmuKrnlMm.cpp index aaeee404d..cb8564198 100644 --- a/src/CxbxKrnl/EmuKrnlMm.cpp +++ b/src/CxbxKrnl/EmuKrnlMm.cpp @@ -414,9 +414,18 @@ XBSYSAPI EXPORTNUM(177) xboxkrnl::PVOID NTAPI xboxkrnl::MmMapIoSpace LOG_FUNC_ARG(ProtectionType) LOG_FUNC_END; - // TODO: should this be aligned? - PVOID pRet = g_MemoryManager.Allocate(NumberOfBytes); - LOG_INCOMPLETE(); + PVOID pRet; + + // Is it a physical address for hardware devices (flash, NV2A, etc) ? + if (PhysicalAddress >= XBOX_WRITE_COMBINED_BASE) { // 0xF0000000 + // Return physical address as virtual (accesses will go through EmuException) : + pRet = (PVOID)PhysicalAddress; + } + else { + // TODO: should this be aligned? + pRet = g_MemoryManager.Allocate(NumberOfBytes); + LOG_INCOMPLETE(); + } RETURN(pRet); } @@ -611,8 +620,13 @@ XBSYSAPI EXPORTNUM(183) xboxkrnl::NTSTATUS NTAPI xboxkrnl::MmUnmapIoSpace LOG_FUNC_ARG(NumberOfBytes) LOG_FUNC_END; - g_MemoryManager.Free(BaseAddress); - LOG_INCOMPLETE(); + if ((xbaddr)BaseAddress >= XBOX_WRITE_COMBINED_BASE) { // 0xF0000000 + // Don't free hardware devices (flash, NV2A, etc) + } + else { + g_MemoryManager.Free(BaseAddress); + LOG_INCOMPLETE(); + } RETURN(STATUS_SUCCESS); }