Merge pull request #510 from PatrickvL/add_flash_read
Introduce flash handling
This commit is contained in:
commit
737feaa849
|
@ -2070,8 +2070,8 @@ XC_VALUE_INDEX, *PXC_VALUE_INDEX;
|
|||
typedef struct _XBOX_HARDWARE_INFO
|
||||
{
|
||||
ULONG Flags;
|
||||
UCHAR Unknown1;
|
||||
UCHAR Unknown2;
|
||||
UCHAR GpuRevision;
|
||||
UCHAR McpRevision;
|
||||
UCHAR Unknown3;
|
||||
UCHAR Unknown4;
|
||||
}
|
||||
|
|
|
@ -392,6 +392,7 @@ void CxbxKrnlMain(int argc, char* argv[])
|
|||
}
|
||||
|
||||
// TODO : Instead of loading an Xbe here, initialize the kernel so that it will launch the Xbe on itself.
|
||||
// using XeLoadImage from LaunchDataPage->Header.szLaunchPath
|
||||
|
||||
// Now we can load and run the XBE :
|
||||
// MapAndRunXBE(XbePath, DCHandle);
|
||||
|
|
|
@ -84,7 +84,17 @@ 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
|
||||
|
||||
// For now, virtual addresses are somewhat limited, as we use
|
||||
// these soley for loading XBE sections. The largest that we
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -58,8 +58,11 @@ XBSYSAPI EXPORTNUM(321) xboxkrnl::XBOX_KEY_DATA xboxkrnl::XboxEEPROMKey = { 0 };
|
|||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(322) xboxkrnl::XBOX_HARDWARE_INFO xboxkrnl::XboxHardwareInfo =
|
||||
{
|
||||
0xC0000035,
|
||||
0,0,0,0
|
||||
0xC0000031, // Flags: 1=INTERNAL_USB, 2=DEVKIT, 4=MACROVISION, 8=CHIHIRO
|
||||
0xA2, // GpuRevision, byte read from NV2A first register, at 0xFD0000000 - see NV_PMC_BOOT_0
|
||||
0xD3, // McpRevision, Retail 1.6 - see https://github.com/JayFoxRox/xqemu-jfr/wiki/MCPX-and-bootloader
|
||||
0, // unknown
|
||||
0 // unknown
|
||||
};
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -128,6 +128,22 @@ void EmuX86_Mem_Write8(xbaddr addr, uint8_t value)
|
|||
*(uint8_t*)addr = value;
|
||||
}
|
||||
|
||||
uint32_t EmuFlash_Read32(xbaddr addr) // TODO : Move to EmuFlash.cpp
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
switch (addr) {
|
||||
case 0x78: // ROM_VERSION
|
||||
r = 0x90; // Luke's hardware revision 1.6 Xbox returns this (also since XboxKrnlVersion is set to 5838)
|
||||
break;
|
||||
default:
|
||||
EmuWarning("EmuX86 Read32 FLASH_ROM (0x%.8X) [Unknown address]", addr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
DbgPrintf("EmuX86 Read32 FLASH_ROM (0x%.8X) = 0x%.8X [HANDLED]\n", addr, r);
|
||||
return r;
|
||||
}
|
||||
|
||||
//
|
||||
// Read & write handlers for memory-mapped hardware devices
|
||||
|
@ -148,8 +164,10 @@ uint32_t EmuX86_Read32Aligned(xbaddr addr)
|
|||
// Access NV2A regardless weither HLE is disabled or not
|
||||
value = EmuNV2A_Read(addr - NV2A_ADDR, 32);
|
||||
// Note : EmuNV2A_Read32 does it's own logging
|
||||
} if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
|
||||
} else if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
|
||||
value = EmuNVNet_Read(addr - NVNET_ADDR, 32);
|
||||
} else if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
|
||||
value = EmuFlash_Read32(addr - XBOX_FLASH_ROM_BASE);
|
||||
} else {
|
||||
if (g_bEmuException) {
|
||||
EmuWarning("EmuX86_Read32Aligned(0x%08X) [Unknown address]", addr);
|
||||
|
@ -193,6 +211,8 @@ uint16_t EmuX86_Read16(xbaddr addr)
|
|||
// Note : EmuNV2A_Read32 does it's own logging
|
||||
} else if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
|
||||
value = EmuNVNet_Read(addr - NVNET_ADDR, 16);
|
||||
} else if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
|
||||
value = EmuFlash_Read32(addr - XBOX_FLASH_ROM_BASE);
|
||||
} else {
|
||||
if (g_bEmuException) {
|
||||
EmuWarning("EmuX86_Read16(0x%08X) [Unknown address]", addr);
|
||||
|
@ -222,6 +242,8 @@ uint8_t EmuX86_Read8(xbaddr addr)
|
|||
// Note : EmuNV2A_Read32 does it's own logging
|
||||
} else if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
|
||||
value = EmuNVNet_Read(addr - NVNET_ADDR, 8);
|
||||
} else if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
|
||||
value = EmuFlash_Read32(addr - XBOX_FLASH_ROM_BASE);
|
||||
} else {
|
||||
if (g_bEmuException) {
|
||||
EmuWarning("EmuX86_Read8(0x%08X) [Unknown address]", addr);
|
||||
|
@ -258,6 +280,11 @@ void EmuX86_Write32Aligned(xbaddr addr, uint32_t value)
|
|||
return;
|
||||
}
|
||||
|
||||
if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
|
||||
EmuWarning("EmuX86_Write32Aligned(0x%08X, 0x%08X) [FLASH_ROM]", addr, value);
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_bEmuException) {
|
||||
EmuWarning("EmuX86_Write32Aligned(0x%08X, 0x%08X) [Unknown address]", addr, value);
|
||||
return;
|
||||
|
@ -296,6 +323,11 @@ void EmuX86_Write16(xbaddr addr, uint16_t value)
|
|||
return;
|
||||
}
|
||||
|
||||
if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
|
||||
EmuWarning("EmuX86_Write16(0x%08X, 0x%08X) [FLASH_ROM]", addr, value);
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_bEmuException) {
|
||||
EmuWarning("EmuX86_Write16(0x%08X, 0x%04X) [Unknown address]", addr, value);
|
||||
return;
|
||||
|
@ -326,6 +358,11 @@ void EmuX86_Write8(xbaddr addr, uint8_t value)
|
|||
return;
|
||||
}
|
||||
|
||||
if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
|
||||
EmuWarning("EmuX86_Write8(0x%08X, 0x%08X) [FLASH_ROM]", addr, value);
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_bEmuException) {
|
||||
EmuWarning("EmuX86_Write8(0x%08X, 0x%02X) [Unknown address]", addr, value);
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue