move address ranges into AddressRanges header file
This commit is contained in:
parent
7bfd1c795b
commit
2ead1e0fe0
|
@ -25,9 +25,53 @@
|
|||
// *
|
||||
// ******************************************************************
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
#include <Windows.h> // For PAGE_READWRITE, PAGE_EXECUTE_READWRITE, and PAGE_NOACCESS
|
||||
|
||||
#include "util/std_extend.hpp"
|
||||
#include "AddressRanges.h"
|
||||
|
||||
// NOTE: Cannot be use in the header file.
|
||||
// For InitialMemoryProtection field only. Memory page protection usage, for use by VirtualAlloc
|
||||
// Shortend symbol aliasses for memory page protection
|
||||
#define PROT_UNH 0 // UNHANDLED
|
||||
#define PROT_RW PAGE_READWRITE
|
||||
#define PROT_XRW PAGE_EXECUTE_READWRITE
|
||||
#define PROT_NAC PAGE_NOACCESS
|
||||
|
||||
const _XboxAddressRanges XboxAddressRanges[] = {
|
||||
#ifdef DEBUG
|
||||
#define RANGE_ENTRY(START, END, SIZE, PROT, FLAGS, COMMENT) { START, END, SIZE, PROT, FLAGS, COMMENT }
|
||||
#else
|
||||
#define RANGE_ENTRY(START, END, SIZE, PROT, FLAGS, COMMENT) { START, SIZE, PROT, FLAGS }
|
||||
#endif
|
||||
// See http://xboxdevwiki.net/Memory
|
||||
// and http://xboxdevwiki.net/Boot_Process#Paging
|
||||
// Entry : Start , End , Size , Protect , RangeFlags , Comment
|
||||
RANGE_ENTRY(0x00010000, 0x03FFFFFF, MB( 64) - KB(64), PROT_XRW, SYSTEM_ALL | MAY_FAIL, "MemLowVirtual (General Xbox type) lower 64 MB Optional (already reserved via virtual_memory_placeholder)"),
|
||||
RANGE_ENTRY(0x04000000, 0x07FFFFFF, MB( 64) , PROT_XRW, SYSTEM_128MB | MAY_FAIL, "MemLowVirtual (Chihiro / DevKit) ^ + upper 64 MB"),
|
||||
RANGE_ENTRY(0x80000000, 0x83FFFFFF, MB( 64) , PROT_UNH, SYSTEM_ALL , "MemPhysical (General Xbox type) lower 64 MB"),
|
||||
RANGE_ENTRY(0x84000000, 0x87FFFFFF, MB( 64) , PROT_UNH, SYSTEM_128MB , "MemPhysical (Chihiro / DevKit) ^ + upper 64 MB"),
|
||||
RANGE_ENTRY(0xB0000000, 0xBFFFFFFF, MB(256) , PROT_NAC, SYSTEM_DEVKIT , "DevKitMemory"), // TODO : Check reserved range (might behave like MemTiled)
|
||||
RANGE_ENTRY(0xC0000000, 0xC03FFFFF, MB( 4) , PROT_RW, SYSTEM_ALL , "MemPageTable"), // See PAGE_TABLES_SIZE, which contains one 4 byte entry per PAGE_SIZE
|
||||
RANGE_ENTRY(0xD0000000, 0xEFFFFFFF, MB(512) , PROT_RW, SYSTEM_ALL | MAY_FAIL, "SystemMemory Optional"), // TODO : Check reserved range (might behave like MemTiled)
|
||||
RANGE_ENTRY(0xF0000000, 0xF3FFFFFF, MB( 64) , PROT_UNH, SYSTEM_ALL , "MemTiled Optional (even though it can't be reserved, MapViewOfFileEx to this range still works!?)"),
|
||||
RANGE_ENTRY(0xFD000000, 0xFD6FFFFF, MB( 7) , PROT_NAC, SYSTEM_ALL , "DeviceNV2A_a (GPU)"),
|
||||
RANGE_ENTRY(0xFD700000, 0xFD7FFFFF, MB( 1) , PROT_RW, SYSTEM_ALL , "MemNV2APRAMIN"),
|
||||
RANGE_ENTRY(0xFD800000, 0xFDFFFFFF, MB( 8) , PROT_NAC, SYSTEM_ALL , "DeviceNV2A_b (GPU)"),
|
||||
RANGE_ENTRY(0xFE800000, 0xFE87FFFF, KB(512) , PROT_NAC, SYSTEM_ALL , "DeviceAPU"),
|
||||
RANGE_ENTRY(0xFEC00000, 0xFEC00FFF, KB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceAC97 (ACI)"),
|
||||
RANGE_ENTRY(0xFED00000, 0xFED00FFF, KB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceUSB"),
|
||||
RANGE_ENTRY(0xFEF00000, 0xFEF003FF, KB( 1) , PROT_NAC, SYSTEM_ALL , "DeviceNVNet"),
|
||||
RANGE_ENTRY(0xFF000000, 0xFF3FFFFF, MB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceFlash_a (Flash mirror 1)"),
|
||||
RANGE_ENTRY(0xFF400000, 0xFF7FFFFF, MB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceFlash_b (Flash mirror 2)"),
|
||||
RANGE_ENTRY(0xFF800000, 0xFFBFFFFF, MB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceFlash_c (Flash mirror 3)"),
|
||||
RANGE_ENTRY(0xFFC00000, 0xFFFFFFFF, MB( 4) , PROT_NAC, SYSTEM_ALL | MAY_FAIL, "DeviceFlash_d (Flash mirror 4) Optional (will probably fail reservation, which is acceptable - the 3 other mirrors work just fine"),
|
||||
#undef RANGE_ENTRY
|
||||
};
|
||||
|
||||
const size_t XboxAddressRanges_size = ARRAY_SIZE(XboxAddressRanges);
|
||||
|
||||
bool AddressRangeMatchesFlags(const int index, const unsigned int flags)
|
||||
{
|
||||
return XboxAddressRanges[index].RangeFlags & flags;
|
||||
|
|
|
@ -29,31 +29,90 @@
|
|||
|
||||
#include <cstdint> // For uint32_t
|
||||
|
||||
#ifndef CXBXR_EMU_EXPORTS // Only trim Windows symbols in cxbxr-ldr.exe, not in cxbxr-emu.dll (TODO : What about cxbxr.exe and cxbx.exe?)
|
||||
#include <SDKDDKVer.h>
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
#endif // CXBXR_EMU_EXPORTS
|
||||
|
||||
#undef FIELD_OFFSET // prevent macro redefinition warnings
|
||||
#include <windows.h> // For DWORD, CALLBACK, VirtualAlloc, LPVOID, SIZE_T, HMODULE
|
||||
|
||||
#define KB(x) ((x) * 1024 ) // = 0x00000400
|
||||
#define MB(x) ((x) * KB(1024)) // = 0x00100000
|
||||
|
||||
// Base addresses of various components
|
||||
#define KSEG0_BASE 0x80000000
|
||||
|
||||
#define PHYSICAL_MAP_BASE 0x80000000
|
||||
#define PHYSICAL_MAP_SIZE (MB(256)) // = 0x10000000
|
||||
#define PHYSICAL_MAP_END (PHYSICAL_MAP_BASE + PHYSICAL_MAP_SIZE - 1) // 0x8FFFFFFF
|
||||
|
||||
#define CONTIGUOUS_MEMORY_BASE KSEG0_BASE // = 0x80000000
|
||||
#define XBOX_CONTIGUOUS_MEMORY_SIZE (MB(64))
|
||||
#define CHIHIRO_CONTIGUOUS_MEMORY_SIZE (MB(128))
|
||||
|
||||
#define DEVKIT_MEMORY_BASE 0xB0000000
|
||||
#define DEVKIT_MEMORY_SIZE (MB(256)) // = 0x10000000
|
||||
#define DEVKIT_MEMORY_END (DEVKIT_MEMORY_BASE + DEVKIT_MEMORY_SIZE - 1) // 0xBFFFFFFF
|
||||
|
||||
#define PAGE_TABLES_BASE 0xC0000000
|
||||
#define PAGE_TABLES_SIZE (MB(4)) // = 0x00400000
|
||||
#define PAGE_TABLES_END (PAGE_TABLES_BASE + PAGE_TABLES_SIZE - 1) // 0xC03FFFFF
|
||||
|
||||
#define SYSTEM_MEMORY_BASE 0xD0000000
|
||||
#define SYSTEM_MEMORY_SIZE (MB(512)) // = 0x20000000
|
||||
#define SYSTEM_MEMORY_END (SYSTEM_MEMORY_BASE + SYSTEM_MEMORY_SIZE - 1) // 0xEFFFFFFF
|
||||
|
||||
#define XBOX_WRITE_COMBINED_BASE 0xF0000000 // WC (The WC memory is another name of the tiled memory)
|
||||
#define XBOX_WRITE_COMBINED_SIZE (MB(128)) // = 0x08000000
|
||||
#define XBOX_WRITE_COMBINED_END (XBOX_WRITE_COMBINED_BASE + XBOX_WRITE_COMBINED_SIZE - 1) // 0xF7FFFFFF
|
||||
|
||||
#define XBOX_UNCACHED_BASE 0xF8000000 // UC
|
||||
#define XBOX_UNCACHED_SIZE (MB(128 - 4)) // = 0x07C00000
|
||||
#define XBOX_UNCACHED_END (XBOX_UNCACHED_BASE + XBOX_UNCACHED_SIZE - 1) // - 0xFFBFFFFF
|
||||
|
||||
#define XBOX_FLASH_ROM_BASE 0xFFF00000
|
||||
#define XBOX_FLASH_ROM_SIZE (MB(1)) // = 0x00100000
|
||||
#define XBOX_FLASH_ROM_END (XBOX_FLASH_ROM_BASE + XBOX_FLASH_ROM_SIZE - 1) // - 0xFFFFFFF
|
||||
|
||||
// Miscellaneous base addresses
|
||||
#define XBE_IMAGE_BASE 0x00010000
|
||||
#define PAGE_DIRECTORY_BASE 0xC0300000
|
||||
#define NV2A_INIT_VECTOR 0xFF000008
|
||||
|
||||
// Define virtual base and alternate virtual base of kernel
|
||||
#define XBOX_KERNEL_BASE (PHYSICAL_MAP_BASE + XBE_IMAGE_BASE)
|
||||
#define KERNEL_PHYSICAL_ADDRESS XBE_IMAGE_BASE // = 0x10000
|
||||
#define KERNEL_SIZE sizeof(DUMMY_KERNEL)
|
||||
#define KERNEL_STACK_SIZE 12288 // 0x03000, needed by PsCreateSystemThreadEx, however the current implementation doesn't use it
|
||||
|
||||
// Miscellaneous memory variables
|
||||
// Xbox pages are (1 << 12) = 0x00001000 = 4096 bytes in size. Large pages are 4 MiB instead
|
||||
// NOTE: PAGE_SIZE is also defined in xfile.h (oxdk) and linux_wrapper.h (oxdk)
|
||||
#define PAGE_SHIFT 12 // 2^12 = 4 KiB
|
||||
#define PAGE_SIZE (1 << PAGE_SHIFT)
|
||||
#define PAGE_MASK (PAGE_SIZE - 1)
|
||||
|
||||
#define LARGE_PAGE_SHIFT 22 // 2^22 = 4 MiB
|
||||
#define LARGE_PAGE_SIZE (1 << LARGE_PAGE_SHIFT) // = 0x00400000 = 4 MiB
|
||||
#define LARGE_PAGE_MASK (LARGE_PAGE_SIZE - 1)
|
||||
|
||||
#define BYTES_IN_PHYSICAL_MAP (MB(256)) // this refers to the system RAM physical window 0x80000000 - 0x8FFFFFFF
|
||||
#define MAXIMUM_ZERO_BITS 21 // for XbAllocateVirtualMemory
|
||||
#define MAX_VIRTUAL_ADDRESS 0xFFFFFFFF
|
||||
|
||||
#define LOWEST_USER_ADDRESS XBE_IMAGE_BASE // = 0x00010000
|
||||
#define HIGHEST_USER_ADDRESS 0x7FFEFFFF
|
||||
#define HIGHEST_VMA_ADDRESS (HIGHEST_USER_ADDRESS - X64KB) // for NtAllocateVirtualMemory
|
||||
#define USER_MEMORY_SIZE (HIGHEST_USER_ADDRESS - LOWEST_USER_ADDRESS + 1) // 0x7FFE0000 = 2 GiB - 128 KiB
|
||||
|
||||
// Memory size per system
|
||||
#define XBOX_MEMORY_SIZE (MB(64))
|
||||
#define CHIHIRO_MEMORY_SIZE (MB(128))
|
||||
|
||||
// Windows' address space allocation granularity;
|
||||
// See https://blogs.msdn.microsoft.com/oldnewthing/20031008-00/?p=42223
|
||||
const int BLOCK_SIZE = KB(64);
|
||||
|
||||
// One allocation block consists of 16 pages (since PAGE_SIZE is 4 kilobytes)
|
||||
const int PAGE_SIZE = KB(4);
|
||||
|
||||
const struct {
|
||||
extern const struct _XboxAddressRanges {
|
||||
uint32_t Start;
|
||||
#ifdef DEBUG
|
||||
uint32_t End; // TODO : Add validation that this End corresponds to specified Size
|
||||
#endif
|
||||
uint32_t Size;
|
||||
DWORD InitialMemoryProtection; // Memory page protection, for use by VirtualAlloc
|
||||
unsigned long InitialMemoryProtection; // Memory page protection, for use by VirtualAlloc
|
||||
// Shortend symbol aliasses for memory page protection
|
||||
#define PROT_UNH 0 // UNHANDLED
|
||||
#define PROT_RW PAGE_READWRITE
|
||||
|
@ -72,36 +131,9 @@ const struct {
|
|||
#ifdef DEBUG
|
||||
const char *Comment;
|
||||
#endif
|
||||
} XboxAddressRanges[] = {
|
||||
#ifdef DEBUG
|
||||
#define RANGE_ENTRY(START, END, SIZE, PROT, FLAGS, COMMENT) { START, END, SIZE, PROT, FLAGS, COMMENT }
|
||||
#else
|
||||
#define RANGE_ENTRY(START, END, SIZE, PROT, FLAGS, COMMENT) { START, SIZE, PROT, FLAGS }
|
||||
#endif
|
||||
// See http://xboxdevwiki.net/Memory
|
||||
// and http://xboxdevwiki.net/Boot_Process#Paging
|
||||
// Entry : Start , End , Size , Protect , RangeFlags , Comment
|
||||
RANGE_ENTRY(0x00010000, 0x03FFFFFF, MB( 64) - KB(64), PROT_XRW, SYSTEM_ALL | MAY_FAIL, "MemLowVirtual (General Xbox type) lower 64 MB Optional (already reserved via virtual_memory_placeholder)"),
|
||||
RANGE_ENTRY(0x04000000, 0x07FFFFFF, MB( 64) , PROT_XRW, SYSTEM_128MB | MAY_FAIL, "MemLowVirtual (Chihiro / DevKit) ^ + upper 64 MB"),
|
||||
RANGE_ENTRY(0x80000000, 0x83FFFFFF, MB( 64) , PROT_UNH, SYSTEM_ALL , "MemPhysical (General Xbox type) lower 64 MB"),
|
||||
RANGE_ENTRY(0x84000000, 0x87FFFFFF, MB( 64) , PROT_UNH, SYSTEM_128MB , "MemPhysical (Chihiro / DevKit) ^ + upper 64 MB"),
|
||||
RANGE_ENTRY(0xB0000000, 0xBFFFFFFF, MB(256) , PROT_NAC, SYSTEM_DEVKIT , "DevKitMemory"), // TODO : Check reserved range (might behave like MemTiled)
|
||||
RANGE_ENTRY(0xC0000000, 0xC03FFFFF, MB( 4) , PROT_RW, SYSTEM_ALL , "MemPageTable"), // See PAGE_TABLES_SIZE, which contains one 4 byte entry per PAGE_SIZE
|
||||
RANGE_ENTRY(0xD0000000, 0xEFFFFFFF, MB(512) , PROT_RW, SYSTEM_ALL | MAY_FAIL, "SystemMemory Optional"), // TODO : Check reserved range (might behave like MemTiled)
|
||||
RANGE_ENTRY(0xF0000000, 0xF3FFFFFF, MB( 64) , PROT_UNH, SYSTEM_ALL , "MemTiled Optional (even though it can't be reserved, MapViewOfFileEx to this range still works!?)"),
|
||||
RANGE_ENTRY(0xFD000000, 0xFD6FFFFF, MB( 7) , PROT_NAC, SYSTEM_ALL , "DeviceNV2A_a (GPU)"),
|
||||
RANGE_ENTRY(0xFD700000, 0xFD7FFFFF, MB( 1) , PROT_RW, SYSTEM_ALL , "MemNV2APRAMIN"),
|
||||
RANGE_ENTRY(0xFD800000, 0xFDFFFFFF, MB( 8) , PROT_NAC, SYSTEM_ALL , "DeviceNV2A_b (GPU)"),
|
||||
RANGE_ENTRY(0xFE800000, 0xFE87FFFF, KB(512) , PROT_NAC, SYSTEM_ALL , "DeviceAPU"),
|
||||
RANGE_ENTRY(0xFEC00000, 0xFEC00FFF, KB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceAC97 (ACI)"),
|
||||
RANGE_ENTRY(0xFED00000, 0xFED00FFF, KB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceUSB"),
|
||||
RANGE_ENTRY(0xFEF00000, 0xFEF003FF, KB( 1) , PROT_NAC, SYSTEM_ALL , "DeviceNVNet"),
|
||||
RANGE_ENTRY(0xFF000000, 0xFF3FFFFF, MB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceFlash_a (Flash mirror 1)"),
|
||||
RANGE_ENTRY(0xFF400000, 0xFF7FFFFF, MB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceFlash_b (Flash mirror 2)"),
|
||||
RANGE_ENTRY(0xFF800000, 0xFFBFFFFF, MB( 4) , PROT_NAC, SYSTEM_ALL , "DeviceFlash_c (Flash mirror 3)"),
|
||||
RANGE_ENTRY(0xFFC00000, 0xFFFFFFFF, MB( 4) , PROT_NAC, SYSTEM_ALL | MAY_FAIL, "DeviceFlash_d (Flash mirror 4) Optional (will probably fail reservation, which is acceptable - the 3 other mirrors work just fine"),
|
||||
#undef RANGE_ENTRY
|
||||
};
|
||||
} XboxAddressRanges[];
|
||||
|
||||
extern const size_t XboxAddressRanges_size;
|
||||
|
||||
#define BLOCK_REGION_DEVKIT_INDEX_BEGIN 0
|
||||
#define BLOCK_REGION_DEVKIT_INDEX_END 4096
|
||||
|
|
|
@ -26,6 +26,9 @@
|
|||
// *
|
||||
// ******************************************************************
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
#include <Windows.h> // For DWORD, CALLBACK, VirtualAlloc, LPVOID, SIZE_T, HMODULE
|
||||
|
||||
// NOTE: Cannot be use in loader project due to force exclude std libraries.
|
||||
//#define DEBUG // Uncomment whenever need to verify memory leaks or bad configure.
|
||||
|
||||
|
@ -204,7 +207,7 @@ void FreeMemoryRange(int index, uint32_t blocks_reserved[384])
|
|||
|
||||
bool ReserveAddressRanges(const unsigned int system, uint32_t blocks_reserved[384]) {
|
||||
// Loop over all Xbox address ranges
|
||||
for (size_t i = 0; i < ARRAY_SIZE(XboxAddressRanges); i++) {
|
||||
for (size_t i = 0; i < XboxAddressRanges_size; i++) {
|
||||
// Skip address ranges that don't match the given flags
|
||||
if (!AddressRangeMatchesFlags(i, system))
|
||||
continue;
|
||||
|
@ -228,7 +231,7 @@ void FreeAddressRanges(const unsigned int system, unsigned int release_systems,
|
|||
return;
|
||||
}
|
||||
// Loop over all Xbox address ranges
|
||||
for (size_t i = 0; i < ARRAY_SIZE(XboxAddressRanges); i++) {
|
||||
for (size_t i = 0; i < XboxAddressRanges_size; i++) {
|
||||
// Skip address ranges that do match specific flag
|
||||
if (AddressRangeMatchesFlags(i, system))
|
||||
continue;
|
||||
|
@ -247,7 +250,7 @@ bool AttemptReserveAddressRanges(unsigned int* p_reserved_systems, uint32_t bloc
|
|||
size_t iLast = 0;
|
||||
unsigned int reserved_systems = *p_reserved_systems, clear_systems = 0;
|
||||
// Loop over all Xbox address ranges
|
||||
for (size_t i = 0; i < ARRAY_SIZE(XboxAddressRanges); i++) {
|
||||
for (size_t i = 0; i < XboxAddressRanges_size; i++) {
|
||||
|
||||
// Once back to original spot, let's resume.
|
||||
if (i == iLast && clear_systems) {
|
||||
|
|
|
@ -42,6 +42,7 @@ namespace xboxkrnl
|
|||
#include "common\crypto\EmuRsa.h" // For the RSA functions
|
||||
#include "core\hle\XAPI\Xapi.h" // For LDT_FROM_DASHBOARD
|
||||
#include "core\hle\D3D8\Direct3D9\Direct3D9.h" // For CxbxInitWindow
|
||||
#include "common/AddressRanges.h"
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#define CXBXKRNL_H
|
||||
|
||||
#include "Cxbx.h"
|
||||
#include "common\AddressRanges.h"
|
||||
#include "common\xbe\Xbe.h"
|
||||
#include "Logging.h"
|
||||
|
||||
|
@ -51,76 +52,6 @@ extern "C" {
|
|||
#define XBADDR_BITS 32
|
||||
#define XBADDR_MAX UINT32_MAX
|
||||
|
||||
// Base addresses of various components
|
||||
#define KSEG0_BASE 0x80000000
|
||||
|
||||
#define PHYSICAL_MAP_BASE 0x80000000
|
||||
#define PHYSICAL_MAP_SIZE (256 * ONE_MB) // = 0x10000000
|
||||
#define PHYSICAL_MAP_END (PHYSICAL_MAP_BASE + PHYSICAL_MAP_SIZE - 1) // 0x8FFFFFFF
|
||||
|
||||
#define CONTIGUOUS_MEMORY_BASE KSEG0_BASE // = 0x80000000
|
||||
#define XBOX_CONTIGUOUS_MEMORY_SIZE (64 * ONE_MB)
|
||||
#define CHIHIRO_CONTIGUOUS_MEMORY_SIZE (128 * ONE_MB)
|
||||
|
||||
#define DEVKIT_MEMORY_BASE 0xB0000000
|
||||
#define DEVKIT_MEMORY_SIZE (256 * ONE_MB) // = 0x10000000
|
||||
#define DEVKIT_MEMORY_END (DEVKIT_MEMORY_BASE + DEVKIT_MEMORY_SIZE - 1) // 0xBFFFFFFF
|
||||
|
||||
#define PAGE_TABLES_BASE 0xC0000000
|
||||
#define PAGE_TABLES_SIZE (4 * ONE_MB) // = 0x00400000
|
||||
#define PAGE_TABLES_END (PAGE_TABLES_BASE + PAGE_TABLES_SIZE - 1)
|
||||
|
||||
#define SYSTEM_MEMORY_BASE 0xD0000000
|
||||
#define SYSTEM_MEMORY_SIZE (512 * ONE_MB) // = 0x20000000
|
||||
#define SYSTEM_MEMORY_END (SYSTEM_MEMORY_BASE + SYSTEM_MEMORY_SIZE - 1) // 0xEFFFFFFF
|
||||
|
||||
#define XBOX_WRITE_COMBINED_BASE 0xF0000000 // WC (The WC memory is another name of the tiled memory)
|
||||
#define XBOX_WRITE_COMBINED_SIZE (128 * ONE_MB) // = 0x08000000
|
||||
#define XBOX_WRITE_COMBINED_END (XBOX_WRITE_COMBINED_BASE + XBOX_WRITE_COMBINED_SIZE - 1) // - 0xF7FFFFFF
|
||||
|
||||
#define XBOX_UNCACHED_BASE 0xF8000000 // UC
|
||||
#define XBOX_UNCACHED_SIZE ((128 - 4) * ONE_MB) // = 0x07C00000
|
||||
#define XBOX_UNCACHED_END (XBOX_UNCACHED_BASE + XBOX_UNCACHED_SIZE - 1) // - 0xFFBFFFFF
|
||||
|
||||
#define XBOX_FLASH_ROM_BASE 0xFFF00000
|
||||
#define XBOX_FLASH_ROM_SIZE (1 * ONE_MB) // = 0x00100000
|
||||
#define XBOX_FLASH_ROM_END (XBOX_FLASH_ROM_BASE + XBOX_FLASH_ROM_SIZE - 1) // - 0xFFFFFFF
|
||||
|
||||
// Miscellaneous base addresses
|
||||
#define XBE_IMAGE_BASE 0x00010000
|
||||
#define PAGE_DIRECTORY_BASE 0xC0300000
|
||||
#define NV2A_INIT_VECTOR 0xFF000008
|
||||
|
||||
// Define virtual base and alternate virtual base of kernel
|
||||
#define XBOX_KERNEL_BASE (PHYSICAL_MAP_BASE + XBE_IMAGE_BASE)
|
||||
#define KERNEL_PHYSICAL_ADDRESS XBE_IMAGE_BASE // = 0x10000
|
||||
#define KERNEL_SIZE sizeof(DUMMY_KERNEL)
|
||||
#define KERNEL_STACK_SIZE 12288 // 0x03000, needed by PsCreateSystemThreadEx, however the current implementation doesn't use it
|
||||
|
||||
// Miscellaneous memory variables
|
||||
// Xbox pages are (1 << 12) = 0x00001000 = 4096 bytes in size. Large pages are 4 MiB instead
|
||||
// NOTE: PAGE_SIZE is also defined in xfile.h (oxdk) and linux_wrapper.h (oxdk)
|
||||
#define PAGE_SHIFT 12 // 2^12 = 4 KiB
|
||||
#define PAGE_SIZE (1 << PAGE_SHIFT)
|
||||
#define PAGE_MASK (PAGE_SIZE - 1)
|
||||
|
||||
#define LARGE_PAGE_SHIFT 22 // 2^22 = 4 MiB
|
||||
#define LARGE_PAGE_SIZE (1 << LARGE_PAGE_SHIFT) // = 0x00400000 = 4 MiB
|
||||
#define LARGE_PAGE_MASK (LARGE_PAGE_SIZE - 1)
|
||||
|
||||
#define BYTES_IN_PHYSICAL_MAP (256 * ONE_MB) // this refers to the system RAM physical window 0x80000000 - 0x8FFFFFFF
|
||||
#define MAXIMUM_ZERO_BITS 21 // for XbAllocateVirtualMemory
|
||||
#define MAX_VIRTUAL_ADDRESS 0xFFFFFFFF
|
||||
|
||||
#define LOWEST_USER_ADDRESS XBE_IMAGE_BASE // = 0x00010000
|
||||
#define HIGHEST_USER_ADDRESS 0x7FFEFFFF
|
||||
#define HIGHEST_VMA_ADDRESS (HIGHEST_USER_ADDRESS - X64KB) // for NtAllocateVirtualMemory
|
||||
#define USER_MEMORY_SIZE (HIGHEST_USER_ADDRESS - LOWEST_USER_ADDRESS + 1) // 0x7FFE0000 = 2 GiB - 128 KiB
|
||||
|
||||
// Memory size per system
|
||||
#define XBOX_MEMORY_SIZE (64 * ONE_MB)
|
||||
#define CHIHIRO_MEMORY_SIZE (128 * ONE_MB)
|
||||
|
||||
// Define virtual base addresses used by the system.
|
||||
#define XBOX_CONTIGUOUS_MEMORY_LIMIT 0x03FDF
|
||||
#define XBOX_INSTANCE_PHYSICAL_PAGE 0x03FE0
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
#define LOG_PREFIX CXBXR_MODULE::VMEM
|
||||
|
||||
#include "common/AddressRanges.h"
|
||||
#include "PoolManager.h"
|
||||
#include "Logging.h"
|
||||
#include "EmuShared.h"
|
||||
|
|
|
@ -28,16 +28,6 @@
|
|||
#ifndef VMMANAGER_H
|
||||
#define VMMANAGER_H
|
||||
|
||||
// TODO: Need to move defines below into one header files.
|
||||
#define SYSTEM_XBOX (1 << 1)
|
||||
#define SYSTEM_DEVKIT (1 << 2)
|
||||
#define SYSTEM_CHIHIRO (1 << 3)
|
||||
|
||||
#define BLOCK_REGION_DEVKIT_INDEX_BEGIN 0
|
||||
#define BLOCK_REGION_DEVKIT_INDEX_END 4096
|
||||
#define BLOCK_REGION_SYSTEM_INDEX_BEGIN 4096
|
||||
#define BLOCK_REGION_SYSTEM_INDEX_END 12288
|
||||
|
||||
#include "PhysicalMemory.h"
|
||||
|
||||
|
||||
|
|
|
@ -26,6 +26,9 @@
|
|||
// *
|
||||
// ******************************************************************
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
#include <Windows.h> // For LPTSTR, FormatMessage, GetSystemInfo, etc
|
||||
|
||||
#include "..\Common\AddressRanges.h"
|
||||
#include "..\Common\ReserveAddressRanges.h"
|
||||
|
||||
|
|
Loading…
Reference in New Issue