diff --git a/src/xenia/cpu/x64/x64_emit_control.cc b/src/xenia/cpu/x64/x64_emit_control.cc index 29f2b898b..90a4341cf 100644 --- a/src/xenia/cpu/x64/x64_emit_control.cc +++ b/src/xenia/cpu/x64/x64_emit_control.cc @@ -636,7 +636,7 @@ XEEMITTER(mtspr, 0x7C0003A6, XFX)(X64Emitter& e, X86Compiler& c, InstrDat // else // SPR(n) <- (RS)[32:63] - GpVar& v = e.gpr_value(i.XFX.RT); + GpVar v = e.gpr_value(i.XFX.RT); const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F); switch (n) { diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc index 468152e84..f26250cab 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc @@ -121,6 +121,11 @@ SHIM_CALL NtFreeVirtualMemory_shim( region_size_ptr, region_size_value, free_type, unknown); + if (!base_addr_value) { + SHIM_SET_RETURN(X_STATUS_MEMORY_NOT_ALLOCATED); + return; + } + // Free. uint32_t flags = 0; uint32_t freed_size = xe_memory_heap_free(state->memory(), base_addr_value, diff --git a/src/xenia/kernel/xbox.h b/src/xenia/kernel/xbox.h index 66d807f40..9cf21c425 100644 --- a/src/xenia/kernel/xbox.h +++ b/src/xenia/kernel/xbox.h @@ -41,6 +41,7 @@ typedef uint32_t X_STATUS; #define X_STATUS_BUFFER_TOO_SMALL ((uint32_t)0xC0000023L) #define X_STATUS_OBJECT_TYPE_MISMATCH ((uint32_t)0xC0000024L) #define X_STATUS_INVALID_PAGE_PROTECTION ((uint32_t)0xC0000045L) +#define X_STATUS_MEMORY_NOT_ALLOCATED ((uint32_t)0xC00000A0L) // MEM_*, used by NtAllocateVirtualMemory