diff --git a/src/xenia/kernel/kernel.h b/src/xenia/kernel/kernel.h index 2e9fbf700..5fe073206 100644 --- a/src/xenia/kernel/kernel.h +++ b/src/xenia/kernel/kernel.h @@ -11,5 +11,6 @@ #define XENIA_KERNEL_KERNEL_H_ #include +#include #endif // XENIA_KERNEL_KERNEL_H_ diff --git a/src/xenia/kernel/modules/xam/sources.gypi b/src/xenia/kernel/modules/xam/sources.gypi index 7c4445d55..a82e712a5 100644 --- a/src/xenia/kernel/modules/xam/sources.gypi +++ b/src/xenia/kernel/modules/xam/sources.gypi @@ -6,6 +6,7 @@ 'xam_module.cc', 'xam_module.h', 'xam_ordinals.h', + 'xam_private.h', 'xam_state.cc', 'xam_state.h', 'xam_table.inc', diff --git a/src/xenia/kernel/modules/xam/xam_info.cc b/src/xenia/kernel/modules/xam/xam_info.cc index a65f55f7e..70f9daa29 100644 --- a/src/xenia/kernel/modules/xam/xam_info.cc +++ b/src/xenia/kernel/modules/xam/xam_info.cc @@ -10,8 +10,8 @@ #include #include -#include -#include +#include +#include using namespace xe; diff --git a/src/xenia/kernel/modules/xam/xam_info.h b/src/xenia/kernel/modules/xam/xam_info.h index e7db6dbd1..a8ed93d96 100644 --- a/src/xenia/kernel/modules/xam/xam_info.h +++ b/src/xenia/kernel/modules/xam/xam_info.h @@ -10,8 +10,10 @@ #ifndef XENIA_KERNEL_MODULES_XAM_INFO_H_ #define XENIA_KERNEL_MODULES_XAM_INFO_H_ -#include -#include +#include +#include + +#include namespace xe { @@ -19,7 +21,6 @@ namespace kernel { namespace xam { -void RegisterInfoExports(ExportResolver* export_resolver, XamState* state); } // namespace xam diff --git a/src/xenia/kernel/modules/xam/xam_module.cc b/src/xenia/kernel/modules/xam/xam_module.cc index a44104a6f..c17a07cf8 100644 --- a/src/xenia/kernel/modules/xam/xam_module.cc +++ b/src/xenia/kernel/modules/xam/xam_module.cc @@ -10,7 +10,8 @@ #include #include -#include +#include +#include using namespace xe; @@ -18,6 +19,9 @@ using namespace xe::kernel; using namespace xe::kernel::xam; +XamState* xe::kernel::xam::shared_xam_state_ = NULL; + + XamModule::XamModule(Runtime* runtime) : KernelModule(runtime) { // Build the export table used for resolution. @@ -32,9 +36,15 @@ XamModule::XamModule(Runtime* runtime) : // Setup the xam state instance. xam_state = auto_ptr(new XamState(memory_, export_resolver_)); + // Setup the shared global state object. + XEASSERTNULL(shared_xam_state_); + shared_xam_state_ = xam_state.get(); + // Register all exported functions. RegisterInfoExports(export_resolver_.get(), xam_state.get()); } XamModule::~XamModule() { + // Clear the shared XAM state. + shared_xam_state_ = NULL; } diff --git a/src/xenia/kernel/modules/xam/xam_module.h b/src/xenia/kernel/modules/xam/xam_module.h index 6f42aa6ac..33c068188 100644 --- a/src/xenia/kernel/modules/xam/xam_module.h +++ b/src/xenia/kernel/modules/xam/xam_module.h @@ -17,6 +17,9 @@ #include #include +// All of the exported functions: +#include + namespace xe { namespace kernel { diff --git a/src/xenia/kernel/modules/xam/xam_private.h b/src/xenia/kernel/modules/xam/xam_private.h new file mode 100644 index 000000000..cfc0b3533 --- /dev/null +++ b/src/xenia/kernel/modules/xam/xam_private.h @@ -0,0 +1,41 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2013 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_KERNEL_MODULES_XAM_PRIVATE_H_ +#define XENIA_KERNEL_MODULES_XAM_PRIVATE_H_ + +#include +#include + +#include + + +namespace xe { +namespace kernel { +namespace xam { + +class XamState; + + +// This is a global object initialized with the XamModule. +// It references the current xam state object that all xam methods should +// be using to stash their variables. +extern XamState* shared_xam_state_; + + +// Registration functions, one per file. +void RegisterInfoExports(ExportResolver* export_resolver, XamState* state); + + +} // namespace xam +} // namespace kernel +} // namespace xe + + +#endif // XENIA_KERNEL_MODULES_XAM_PRIVATE_H_ diff --git a/src/xenia/kernel/modules/xboxkrnl/module.cc b/src/xenia/kernel/modules/xboxkrnl/module.cc index 56d66954b..40c5cfaaa 100644 --- a/src/xenia/kernel/modules/xboxkrnl/module.cc +++ b/src/xenia/kernel/modules/xboxkrnl/module.cc @@ -16,12 +16,6 @@ #include #include -#include -#include -#include -#include -#include - using namespace xe; using namespace xe::kernel; diff --git a/src/xenia/kernel/modules/xboxkrnl/module.h b/src/xenia/kernel/modules/xboxkrnl/module.h index 91f46caba..d2ccd3277 100644 --- a/src/xenia/kernel/modules/xboxkrnl/module.h +++ b/src/xenia/kernel/modules/xboxkrnl/module.h @@ -17,6 +17,13 @@ #include #include +// All of the exported functions: +#include +#include +#include +#include +#include + namespace xe { namespace kernel { diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_hal.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_hal.cc index c3f8b9874..38c15e7f4 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_hal.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_hal.cc @@ -10,7 +10,8 @@ #include #include -#include +#include +#include using namespace xe; diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_hal.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_hal.h index c69896500..39994d8d4 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_hal.h +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_hal.h @@ -10,8 +10,10 @@ #ifndef XENIA_KERNEL_MODULES_XBOXKRNL_HAL_H_ #define XENIA_KERNEL_MODULES_XBOXKRNL_HAL_H_ -#include -#include +#include +#include + +#include namespace xe { @@ -19,7 +21,6 @@ namespace kernel { namespace xboxkrnl { -void RegisterHalExports(ExportResolver* export_resolver, KernelState* state); } // namespace xboxkrnl diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc index bc0e9b2d1..bed256013 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.cc @@ -10,7 +10,7 @@ #include #include -#include +#include #include @@ -113,14 +113,40 @@ SHIM_CALL NtAllocateVirtualMemory_shim( SHIM_SET_RETURN(result); } -SHIM_CALL NtFreeVirtualMemory_shim( - xe_ppc_state_t* ppc_state, KernelState* state) { +X_STATUS xeNtFreeVirtualMemory( + uint32_t* base_addr_ptr, uint32_t* region_size_ptr, + uint32_t free_type, uint32_t unknown) { + KernelState* state = shared_kernel_state_; + XEASSERTNOTNULL(state); + // NTSTATUS // _Inout_ PVOID *BaseAddress, // _Inout_ PSIZE_T RegionSize, // _In_ ULONG FreeType // ? handle? + // I've only seen zero. + XEASSERT(unknown == 0); + + if (!*base_addr_ptr) { + return X_STATUS_MEMORY_NOT_ALLOCATED; + } + + // Free. + uint32_t flags = 0; + uint32_t freed_size = xe_memory_heap_free(state->memory(), *base_addr_ptr, + flags); + if (!freed_size) { + return X_STATUS_UNSUCCESSFUL; + } + + // Stash back. + *region_size_ptr = freed_size; + return X_STATUS_SUCCESS; +} + +SHIM_CALL NtFreeVirtualMemory_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { uint32_t base_addr_ptr = SHIM_GET_ARG_32(0); uint32_t base_addr_value = SHIM_MEM_32(base_addr_ptr); uint32_t region_size_ptr = SHIM_GET_ARG_32(1); @@ -129,33 +155,21 @@ SHIM_CALL NtFreeVirtualMemory_shim( uint32_t free_type = SHIM_GET_ARG_32(2); uint32_t unknown = SHIM_GET_ARG_32(3); - // I've only seen zero. - XEASSERT(unknown == 0); - XELOGD( "NtFreeVirtualMemory(%.8X(%.8X), %.8X(%.8X), %.8X, %.8X)", base_addr_ptr, base_addr_value, region_size_ptr, region_size_value, free_type, unknown); - if (!base_addr_value) { - SHIM_SET_RETURN(X_STATUS_MEMORY_NOT_ALLOCATED); - return; - } + X_STATUS result = xeNtFreeVirtualMemory( + &base_addr_value, ®ion_size_value, + free_type, unknown); - // Free. - uint32_t flags = 0; - uint32_t freed_size = xe_memory_heap_free(state->memory(), base_addr_value, - flags); - if (!freed_size) { - SHIM_SET_RETURN(X_STATUS_UNSUCCESSFUL); - return; + if (XSUCCEEDED(result)) { + SHIM_SET_MEM_32(base_addr_ptr, base_addr_value); + SHIM_SET_MEM_32(region_size_ptr, region_size_value); } - - // Stash back. - SHIM_SET_MEM_32(base_addr_ptr, base_addr_value); - SHIM_SET_MEM_32(region_size_ptr, freed_size); - SHIM_SET_RETURN(X_STATUS_SUCCESS); + SHIM_SET_RETURN(result); } diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.h index 4363e4878..b93d2bb3d 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.h +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_memory.h @@ -10,8 +10,10 @@ #ifndef XENIA_KERNEL_MODULES_XBOXKRNL_MEMORY_H_ #define XENIA_KERNEL_MODULES_XBOXKRNL_MEMORY_H_ -#include -#include +#include +#include + +#include namespace xe { @@ -24,8 +26,9 @@ X_STATUS xeNtAllocateVirtualMemory( uint32_t allocation_type, uint32_t protect_bits, uint32_t unknown); - -void RegisterMemoryExports(ExportResolver* export_resolver, KernelState* state); +X_STATUS xeNtFreeVirtualMemory( + uint32_t* base_addr_ptr, uint32_t* region_size_ptr, + uint32_t free_type, uint32_t unknown); } // namespace xboxkrnl diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_module.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_module.cc index 09191992a..07d6bdf6e 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_module.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_module.cc @@ -10,8 +10,9 @@ #include #include -#include #include +#include +#include #include diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_module.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_module.h index a4294abfd..5e0714b65 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_module.h +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_module.h @@ -10,8 +10,10 @@ #ifndef XENIA_KERNEL_MODULES_XBOXKRNL_MODULE_IMPL_H_ #define XENIA_KERNEL_MODULES_XBOXKRNL_MODULE_IMPL_H_ -#include -#include +#include +#include + +#include namespace xe { @@ -19,7 +21,7 @@ namespace kernel { namespace xboxkrnl { -void RegisterModuleExports(ExportResolver* export_resolver, KernelState* state); + } // namespace xboxkrnl diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h index 9dac45f7e..b78355d92 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_private.h @@ -13,6 +13,8 @@ #include #include +#include + namespace xe { namespace kernel { @@ -20,10 +22,22 @@ namespace xboxkrnl { class KernelState; - + +// This is a global object initialized with the XboxkrnlModule. +// It references the current kernel state object that all kernel methods should +// be using to stash their variables. extern KernelState* shared_kernel_state_; +// Registration functions, one per file. +void RegisterHalExports(ExportResolver* export_resolver, KernelState* state); +void RegisterMemoryExports(ExportResolver* export_resolver, KernelState* state); +void RegisterModuleExports(ExportResolver* export_resolver, KernelState* state); +void RegisterRtlExports(ExportResolver* export_resolver, KernelState* state); +void RegisterThreadingExports(ExportResolver* export_resolver, + KernelState* state); + + } // namespace xboxkrnl } // namespace kernel } // namespace xe diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_rtl.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_rtl.cc index 6ea0d37f7..955a71884 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_rtl.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_rtl.cc @@ -10,8 +10,9 @@ #include #include -#include #include +#include +#include #include #include diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_rtl.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_rtl.h index dbda7b931..becfa6ddf 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_rtl.h +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_rtl.h @@ -10,8 +10,10 @@ #ifndef XENIA_KERNEL_MODULES_XBOXKRNL_RTL_H_ #define XENIA_KERNEL_MODULES_XBOXKRNL_RTL_H_ -#include -#include +#include +#include + +#include namespace xe { @@ -19,7 +21,7 @@ namespace kernel { namespace xboxkrnl { -void RegisterRtlExports(ExportResolver* export_resolver, KernelState* state); + } // namespace xboxkrnl diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.cc index 37a27348b..442e9c94b 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.cc @@ -10,7 +10,8 @@ #include #include -#include +#include +#include #include diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.h index 9a7b13d9b..66dac14ac 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.h +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.h @@ -10,8 +10,10 @@ #ifndef XENIA_KERNEL_MODULES_XBOXKRNL_THREADING_H_ #define XENIA_KERNEL_MODULES_XBOXKRNL_THREADING_H_ -#include -#include +#include +#include + +#include namespace xe { @@ -19,8 +21,7 @@ namespace kernel { namespace xboxkrnl { -void RegisterThreadingExports(ExportResolver* export_resolver, - KernelState* state); + } // namespace xboxkrnl