From 31bec99cbb43f1000521ecb476ecbf87ebf9f941 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Wed, 11 Feb 2015 15:24:47 -0800 Subject: [PATCH] Stubs for XLIVEBASE. Fixes #159. --- src/xenia/kernel/apps/apps.cc | 2 + src/xenia/kernel/apps/sources.gypi | 2 + src/xenia/kernel/apps/xgi_app.cc | 2 +- src/xenia/kernel/apps/xlivebase_app.cc | 59 ++++++++++++++++++++++++++ src/xenia/kernel/apps/xlivebase_app.h | 35 +++++++++++++++ src/xenia/kernel/apps/xmp_app.cc | 2 +- 6 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 src/xenia/kernel/apps/xlivebase_app.cc create mode 100644 src/xenia/kernel/apps/xlivebase_app.h diff --git a/src/xenia/kernel/apps/apps.cc b/src/xenia/kernel/apps/apps.cc index 6e8395d0b..bbcfc72c7 100644 --- a/src/xenia/kernel/apps/apps.cc +++ b/src/xenia/kernel/apps/apps.cc @@ -10,6 +10,7 @@ #include "xenia/kernel/apps/apps.h" #include "xenia/kernel/apps/xgi_app.h" +#include "xenia/kernel/apps/xlivebase_app.h" #include "xenia/kernel/apps/xmp_app.h" namespace xe { @@ -18,6 +19,7 @@ namespace apps { void RegisterApps(KernelState* kernel_state, XAppManager* manager) { manager->RegisterApp(std::make_unique(kernel_state)); + manager->RegisterApp(std::make_unique(kernel_state)); manager->RegisterApp(std::make_unique(kernel_state)); } diff --git a/src/xenia/kernel/apps/sources.gypi b/src/xenia/kernel/apps/sources.gypi index d253e242e..a0f9d03b3 100644 --- a/src/xenia/kernel/apps/sources.gypi +++ b/src/xenia/kernel/apps/sources.gypi @@ -5,6 +5,8 @@ 'apps.h', 'xgi_app.cc', 'xgi_app.h', + 'xlivebase_app.cc', + 'xlivebase_app.h', 'xmp_app.cc', 'xmp_app.h', ], diff --git a/src/xenia/kernel/apps/xgi_app.cc b/src/xenia/kernel/apps/xgi_app.cc index c0b1c7d67..816bad1f2 100644 --- a/src/xenia/kernel/apps/xgi_app.cc +++ b/src/xenia/kernel/apps/xgi_app.cc @@ -83,7 +83,7 @@ X_RESULT XXGIApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, return X_ERROR_SUCCESS; } } - XELOGE("Unimplemented XMsg message app=%.8X, msg=%.8X, arg1=%.8X, arg2=%.8X", + XELOGE("Unimplemented XGI message app=%.8X, msg=%.8X, arg1=%.8X, arg2=%.8X", app_id(), message, buffer_ptr, buffer_length); return X_ERROR_NOT_FOUND; } diff --git a/src/xenia/kernel/apps/xlivebase_app.cc b/src/xenia/kernel/apps/xlivebase_app.cc new file mode 100644 index 000000000..e037ac1cf --- /dev/null +++ b/src/xenia/kernel/apps/xlivebase_app.cc @@ -0,0 +1,59 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2015 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/kernel/apps/xlivebase_app.h" + +#include "poly/threading.h" + +namespace xe { +namespace kernel { +namespace apps { + +XXLiveBaseApp::XXLiveBaseApp(KernelState* kernel_state) + : XApp(kernel_state, 0xFC) {} + +// http://mb.mirage.org/bugzilla/xliveless/main.c + +X_RESULT XXLiveBaseApp::DispatchMessageSync(uint32_t message, + uint32_t buffer_ptr, + uint32_t buffer_length) { + // NOTE: buffer_length may be zero or valid. + switch (message) { + case 0x00058004: { + // Called on startup, seems to just return a bool in the buffer. + assert_true(!buffer_length || buffer_length == 4); + XELOGD("XLiveBaseGetLogonId(%.8X)", buffer_ptr); + poly::store_and_swap(membase_ + buffer_ptr + 0, 1); // ? + return X_ERROR_SUCCESS; + } + case 0x00058020: { + // 0x00058004 is called right before this. + // We should create a XamEnumerate-able empty list here, but I'm not + // sure of the format. + // buffer_length seems to be the same ptr sent to 0x00058004. + XELOGD("XLiveBaseFriendsCreateEnumerator(%.8X, %.8X) unimplemented", + buffer_ptr, buffer_length); + return X_ERROR_FUNCTION_FAILED; + } + case 0x00058023: { + XELOGD("XliveBaseUnk58023(%.8X, %.8X) unimplemented", buffer_ptr, + buffer_length); + return X_ERROR_FUNCTION_FAILED; + } + } + XELOGE( + "Unimplemented XLIVEBASE message app=%.8X, msg=%.8X, arg1=%.8X, " + "arg2=%.8X", + app_id(), message, buffer_ptr, buffer_length); + return X_ERROR_NOT_FOUND; +} + +} // namespace apps +} // namespace kernel +} // namespace xe diff --git a/src/xenia/kernel/apps/xlivebase_app.h b/src/xenia/kernel/apps/xlivebase_app.h new file mode 100644 index 000000000..8a069f17a --- /dev/null +++ b/src/xenia/kernel/apps/xlivebase_app.h @@ -0,0 +1,35 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2015 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_KERNEL_XBOXKRNL_APPS_XLIVEBASE_APP_H_ +#define XENIA_KERNEL_XBOXKRNL_APPS_XLIVEBASE_APP_H_ + +#include "xenia/common.h" +#include "xenia/kernel/app.h" +#include "xenia/kernel/kernel_state.h" + +namespace xe { +namespace kernel { +namespace apps { + +class XXLiveBaseApp : public XApp { + public: + XXLiveBaseApp(KernelState* kernel_state); + + X_RESULT DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, + uint32_t buffer_length) override; + + private: +}; + +} // namespace apps +} // namespace kernel +} // namespace xe + +#endif // XENIA_KERNEL_XBOXKRNL_APPS_XLIVEBASE_APP_H_ diff --git a/src/xenia/kernel/apps/xmp_app.cc b/src/xenia/kernel/apps/xmp_app.cc index a6bd65ade..0ea17b17f 100644 --- a/src/xenia/kernel/apps/xmp_app.cc +++ b/src/xenia/kernel/apps/xmp_app.cc @@ -439,7 +439,7 @@ X_RESULT XXMPApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, return X_ERROR_INVALID_PARAMETER; } } - XELOGE("Unimplemented XMsg message app=%.8X, msg=%.8X, arg1=%.8X, arg2=%.8X", + XELOGE("Unimplemented XMP message app=%.8X, msg=%.8X, arg1=%.8X, arg2=%.8X", app_id(), message, buffer_ptr, buffer_length); return X_ERROR_NOT_FOUND; }