diff --git a/src/xenia/cpu/export_resolver.h b/src/xenia/cpu/export_resolver.h index ad79c2b89..8e08f2b2a 100644 --- a/src/xenia/cpu/export_resolver.h +++ b/src/xenia/cpu/export_resolver.h @@ -44,6 +44,7 @@ struct ExportTag { static const type kUserProfiles = 1u << 16; static const type kNetworking = 1u << 17; static const type kMemory = 1u << 18; + static const type kDebug = 1u << 19; // Export will be logged on each call. static const type kLog = 1u << 30; diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index 79127fa28..ef9c4694d 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -32,6 +32,7 @@ #include "xenia/kernel/util/gameinfo_utils.h" #include "xenia/kernel/util/xdbf_utils.h" #include "xenia/kernel/xam/xam_module.h" +#include "xenia/kernel/xbdm/xbdm_module.h" #include "xenia/kernel/xboxkrnl/xboxkrnl_module.h" #include "xenia/memory.h" #include "xenia/ui/imgui_dialog.h" @@ -167,6 +168,7 @@ X_STATUS Emulator::Setup( // HLE kernel modules. kernel_state_->LoadKernelModule(); kernel_state_->LoadKernelModule(); + kernel_state_->LoadKernelModule(); // Initialize emulator fallback exception handling last. ExceptionHandler::Install(Emulator::ExceptionCallbackThunk, this); diff --git a/src/xenia/kernel/util/shim_utils.h b/src/xenia/kernel/util/shim_utils.h index 6ac6a26fa..c29345756 100644 --- a/src/xenia/kernel/util/shim_utils.h +++ b/src/xenia/kernel/util/shim_utils.h @@ -405,6 +405,7 @@ void AppendParam(StringBuffer* string_buffer, pointer_t param) { enum class KernelModuleId { xboxkrnl, xam, + xbdm, }; template @@ -518,6 +519,7 @@ using xe::cpu::ExportTag; &name, #name, tags)); #define DECLARE_XAM_EXPORT(name, tags) DECLARE_EXPORT(xam, name, tags) +#define DECLARE_XBDM_EXPORT(name, tags) DECLARE_EXPORT(xbdm, name, tags) #define DECLARE_XBOXKRNL_EXPORT(name, tags) DECLARE_EXPORT(xboxkrnl, name, tags) } // namespace kernel diff --git a/src/xenia/kernel/xbdm/xbdm_misc.cc b/src/xenia/kernel/xbdm/xbdm_misc.cc new file mode 100644 index 000000000..b2e86da15 --- /dev/null +++ b/src/xenia/kernel/xbdm/xbdm_misc.cc @@ -0,0 +1,52 @@ +/** + ****************************************************************************** + * 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. * + ****************************************************************************** + */ + +#include "xenia/base/logging.h" +#include "xenia/kernel/kernel_state.h" +#include "xenia/kernel/util/shim_utils.h" +#include "xenia/kernel/xbdm/xbdm_private.h" +#include "xenia/kernel/xthread.h" +#include "xenia/xbox.h" + +namespace xe { +namespace kernel { +namespace xbdm { + +void DmCloseLoadedModules(lpdword_t unk0_ptr) {} +DECLARE_XBDM_EXPORT(DmCloseLoadedModules, ExportTag::kStub | ExportTag::kDebug); + +void DmSendNotificationString(lpdword_t unk0_ptr) {} +DECLARE_XBDM_EXPORT(DmSendNotificationString, + ExportTag::kStub | ExportTag::kDebug); + +dword_result_t DmWalkLoadedModules(lpdword_t unk0_ptr, lpdword_t unk1_ptr) { + return X_STATUS_INVALID_PARAMETER; +} +DECLARE_XBDM_EXPORT(DmWalkLoadedModules, ExportTag::kStub | ExportTag::kDebug); + +dword_result_t DmCaptureStackBackTrace(lpdword_t unk0_ptr, lpdword_t unk1_ptr) { + return X_STATUS_INVALID_PARAMETER; +} +DECLARE_XBDM_EXPORT(DmCaptureStackBackTrace, + ExportTag::kStub | ExportTag::kDebug); + +void DmMapDevkitDrive() {} +DECLARE_XBDM_EXPORT(DmMapDevkitDrive, ExportTag::kStub | ExportTag::kDebug); + +dword_result_t DmFindPdbSignature(lpdword_t unk0_ptr, lpdword_t unk1_ptr) { + return X_STATUS_INVALID_PARAMETER; +} +DECLARE_XBDM_EXPORT(DmFindPdbSignature, ExportTag::kStub | ExportTag::kDebug); + +void RegisterMiscExports(xe::cpu::ExportResolver* export_resolver, + KernelState* kernel_state) {} + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe diff --git a/src/xenia/kernel/xbdm/xbdm_module.cc b/src/xenia/kernel/xbdm/xbdm_module.cc new file mode 100644 index 000000000..5e22aae43 --- /dev/null +++ b/src/xenia/kernel/xbdm/xbdm_module.cc @@ -0,0 +1,61 @@ +/** + ****************************************************************************** + * 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. * + ****************************************************************************** + */ + +#include "xenia/kernel/xbdm/xbdm_module.h" + +#include + +#include "xenia/base/math.h" +#include "xenia/kernel/kernel_state.h" +#include "xenia/kernel/xbdm/xbdm_private.h" + +namespace xe { +namespace kernel { +namespace xbdm { + +XbdmModule::XbdmModule(Emulator* emulator, KernelState* kernel_state) + : KernelModule(kernel_state, "xe:\\xbdm.xex") { + RegisterExportTable(export_resolver_); + + // Register all exported functions. + RegisterMiscExports(export_resolver_, kernel_state_); +} + +std::vector xbdm_exports(4096); + +xe::cpu::Export* RegisterExport_xbdm(xe::cpu::Export* export_entry) { + assert_true(export_entry->ordinal < xbdm_exports.size()); + xbdm_exports[export_entry->ordinal] = export_entry; + return export_entry; +} + +void XbdmModule::RegisterExportTable(xe::cpu::ExportResolver* export_resolver) { + assert_not_null(export_resolver); + +// Build the export table used for resolution. +#include "xenia/kernel/util/export_table_pre.inc" + static xe::cpu::Export xbdm_export_table[] = { +#include "xenia/kernel/xbdm/xbdm_table.inc" + }; +#include "xenia/kernel/util/export_table_post.inc" + for (size_t i = 0; i < xe::countof(xbdm_export_table); ++i) { + auto& export_entry = xbdm_export_table[i]; + assert_true(export_entry.ordinal < xbdm_exports.size()); + if (!xbdm_exports[export_entry.ordinal]) { + xbdm_exports[export_entry.ordinal] = &export_entry; + } + } + export_resolver->RegisterTable("xbdm.xex", &xbdm_exports); +} + +XbdmModule::~XbdmModule() {} + +} // namespace xbdm +} // namespace kernel +} // namespace xe diff --git a/src/xenia/kernel/xbdm/xbdm_module.h b/src/xenia/kernel/xbdm/xbdm_module.h new file mode 100644 index 000000000..17934602b --- /dev/null +++ b/src/xenia/kernel/xbdm/xbdm_module.h @@ -0,0 +1,36 @@ +/** + ****************************************************************************** + * 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_XBDM_XBDM_MODULE_H_ +#define XENIA_KERNEL_XBDM_XBDM_MODULE_H_ + +#include + +#include "xenia/cpu/export_resolver.h" +#include "xenia/kernel/kernel_module.h" +#include "xenia/kernel/kernel_state.h" +#include "xenia/kernel/xbdm/xbdm_ordinals.h" + +namespace xe { +namespace kernel { +namespace xbdm { + +class XbdmModule : public KernelModule { + public: + XbdmModule(Emulator* emulator, KernelState* kernel_state); + virtual ~XbdmModule(); + + static void RegisterExportTable(xe::cpu::ExportResolver* export_resolver); +}; + +} // namespace xbdm +} // namespace kernel +} // namespace xe + +#endif // XENIA_KERNEL_XBDM_XBDM_MODULE_H_ diff --git a/src/xenia/kernel/xbdm/xbdm_ordinals.h b/src/xenia/kernel/xbdm/xbdm_ordinals.h new file mode 100644 index 000000000..48faa6aca --- /dev/null +++ b/src/xenia/kernel/xbdm/xbdm_ordinals.h @@ -0,0 +1,24 @@ +/** + ****************************************************************************** + * 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_XBDM_XBDM_ORDINALS_H_ +#define XENIA_KERNEL_XBDM_XBDM_ORDINALS_H_ + +#include "xenia/cpu/export_resolver.h" + +// Build an ordinal enum to make it easy to lookup ordinals. +#include "xenia/kernel/util/ordinal_table_pre.inc" +namespace ordinals { +enum { +#include "xenia/kernel/xbdm/xbdm_table.inc" +}; +} // namespace ordinals +#include "xenia/kernel/util/ordinal_table_post.inc" + +#endif // XENIA_KERNEL_XBDM_XBDM_ORDINALS_H_ diff --git a/src/xenia/kernel/xbdm/xbdm_private.h b/src/xenia/kernel/xbdm/xbdm_private.h new file mode 100644 index 000000000..3f8619204 --- /dev/null +++ b/src/xenia/kernel/xbdm/xbdm_private.h @@ -0,0 +1,31 @@ +/** + ****************************************************************************** + * 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_XBDM_XBDM_PRIVATE_H_ +#define XENIA_KERNEL_XBDM_XBDM_PRIVATE_H_ + +#include "xenia/cpu/export_resolver.h" +#include "xenia/kernel/kernel_state.h" +#include "xenia/kernel/xbdm/xbdm_ordinals.h" + +namespace xe { +namespace kernel { +namespace xbdm { + +xe::cpu::Export* RegisterExport_xbdm(xe::cpu::Export* export_entry); + +// Registration functions, one per file. +void RegisterMiscExports(xe::cpu::ExportResolver* export_resolver, + KernelState* kernel_state); + +} // namespace xbdm +} // namespace kernel +} // namespace xe + +#endif // XENIA_KERNEL_XBDM_XBDM_PRIVATE_H_ diff --git a/src/xenia/kernel/xbdm/xbdm_table.inc b/src/xenia/kernel/xbdm/xbdm_table.inc new file mode 100644 index 000000000..b8b771395 --- /dev/null +++ b/src/xenia/kernel/xbdm/xbdm_table.inc @@ -0,0 +1,19 @@ +/** + ****************************************************************************** + * 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. * + ****************************************************************************** + */ + +// This is a partial file designed to be included by other files when +// constructing various tables. + + +XE_EXPORT(xbdm, 0x00000004, DmCloseLoadedModules, kFunction), +XE_EXPORT(xbdm, 0x00000024, DmSendNotificationString, kFunction), +XE_EXPORT(xbdm, 0x00000033, DmWalkLoadedModules, kFunction), +XE_EXPORT(xbdm, 0x00000052, DmCaptureStackBackTrace, kFunction), +XE_EXPORT(xbdm, 0x0000008D, DmMapDevkitDrive, kFunction), +XE_EXPORT(xbdm, 0x00000091, DmFindPdbSignature, kFunction),