[APU] Temp XMA context allocation region workaround

This commit is contained in:
Triang3l 2019-08-16 09:47:28 +03:00
parent 0faafd738a
commit 968c337d22
3 changed files with 9 additions and 3 deletions

View File

@ -105,8 +105,11 @@ X_STATUS XmaDecoder::Setup(kernel::KernelState* kernel_state) {
reinterpret_cast<cpu::MMIOWriteCallback>(MMIOWriteRegisterThunk)); reinterpret_cast<cpu::MMIOWriteCallback>(MMIOWriteRegisterThunk));
// Setup XMA context data. // Setup XMA context data.
context_data_first_ptr_ = memory()->SystemHeapAlloc( // TODO(Triang3l): Find out what address is used on a real console and why it
sizeof(XMA_CONTEXT_DATA) * kContextCount, 256, kSystemHeapPhysical); // doesn't work when allocated in 4 KB pages.
context_data_first_ptr_ =
memory()->SystemHeapAlloc(sizeof(XMA_CONTEXT_DATA) * kContextCount, 256,
kSystemHeapPhysical | kSystemHeapLargePages);
context_data_last_ptr_ = context_data_last_ptr_ =
context_data_first_ptr_ + (sizeof(XMA_CONTEXT_DATA) * kContextCount - 1); context_data_first_ptr_ + (sizeof(XMA_CONTEXT_DATA) * kContextCount - 1);
register_file_[XE_XMA_REG_CONTEXT_ARRAY_ADDRESS].u32 = register_file_[XE_XMA_REG_CONTEXT_ARRAY_ADDRESS].u32 =

View File

@ -507,7 +507,9 @@ uint32_t Memory::SystemHeapAlloc(uint32_t size, uint32_t alignment,
uint32_t system_heap_flags) { uint32_t system_heap_flags) {
// TODO(benvanik): lightweight pool. // TODO(benvanik): lightweight pool.
bool is_physical = !!(system_heap_flags & kSystemHeapPhysical); bool is_physical = !!(system_heap_flags & kSystemHeapPhysical);
auto heap = LookupHeapByType(is_physical, 4096); auto heap = LookupHeapByType(
is_physical,
(system_heap_flags & kSystemHeapLargePages) ? (64 * 1024) : 4096);
uint32_t address; uint32_t address;
if (!heap->Alloc(size, alignment, if (!heap->Alloc(size, alignment,
kMemoryAllocationReserve | kMemoryAllocationCommit, kMemoryAllocationReserve | kMemoryAllocationCommit,

View File

@ -31,6 +31,7 @@ class Memory;
enum SystemHeapFlag : uint32_t { enum SystemHeapFlag : uint32_t {
kSystemHeapVirtual = 1 << 0, kSystemHeapVirtual = 1 << 0,
kSystemHeapPhysical = 1 << 1, kSystemHeapPhysical = 1 << 1,
kSystemHeapLargePages = 1 << 2,
kSystemHeapDefault = kSystemHeapVirtual, kSystemHeapDefault = kSystemHeapVirtual,
}; };