From f04c7b866146b68f31684ca777e4905a8c797e5e Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Sat, 2 Aug 2014 16:23:02 -0700 Subject: [PATCH] ExAllocatePoolTypeWithTag --- src/xenia/kernel/xboxkrnl_memory.cc | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/xenia/kernel/xboxkrnl_memory.cc b/src/xenia/kernel/xboxkrnl_memory.cc index ab153a625..9f10b4fba 100644 --- a/src/xenia/kernel/xboxkrnl_memory.cc +++ b/src/xenia/kernel/xboxkrnl_memory.cc @@ -448,6 +448,44 @@ SHIM_CALL MmGetPhysicalAddress_shim( } +SHIM_CALL ExAllocatePoolTypeWithTag_shim( + PPCContext* ppc_state, KernelState* state) { + uint32_t size = SHIM_GET_ARG_32(0); + uint32_t tag = SHIM_GET_ARG_32(1); + uint32_t zero = SHIM_GET_ARG_32(2); + + XELOGD( + "ExAllocatePoolTypeWithTag(%d, %.8X, %d)", + size, tag, zero); + + uint32_t alignment = 8; + uint32_t adjusted_size = size; + if (adjusted_size < 4 * 1024) { + adjusted_size = XEROUNDUP(adjusted_size, 4 * 1024); + } else { + alignment = 4 * 1024; + } + + uint32_t addr = (uint32_t)state->memory()->HeapAlloc( + 0, adjusted_size, MEMORY_FLAG_ZERO, alignment); + + SHIM_SET_RETURN_32(addr); +} + + + +SHIM_CALL ExFreePool_shim( + PPCContext* ppc_state, KernelState* state) { + uint32_t base_address = SHIM_GET_ARG_32(0); + + XELOGD( + "ExFreePool(%.8X)", + base_address); + + state->memory()->HeapFree(base_address, 0); +} + + SHIM_CALL KeLockL2_shim( PPCContext* ppc_state, KernelState* state) { // Ignored for now. This is just a perf optimization, I think. @@ -483,6 +521,9 @@ void xe::kernel::xboxkrnl::RegisterMemoryExports( SHIM_SET_MAPPING("xboxkrnl.exe", MmQueryStatistics, state); SHIM_SET_MAPPING("xboxkrnl.exe", MmGetPhysicalAddress, state); + SHIM_SET_MAPPING("xboxkrnl.exe", ExAllocatePoolTypeWithTag, state); + SHIM_SET_MAPPING("xboxkrnl.exe", ExFreePool, state); + SHIM_SET_MAPPING("xboxkrnl.exe", KeLockL2, state); SHIM_SET_MAPPING("xboxkrnl.exe", KeUnlockL2, state); }