diff --git a/src/xenia/kernel/util/shim_utils.h b/src/xenia/kernel/util/shim_utils.h index 3e05ad0aa..3233ec67e 100644 --- a/src/xenia/kernel/util/shim_utils.h +++ b/src/xenia/kernel/util/shim_utils.h @@ -324,15 +324,20 @@ class TypedPointerParam : public ParamBase { T* host_ptr_; }; -template class Result { public: - Result(T value) : value_(value) {} + virtual void Store(PPCContext* ppc_context) = 0; +}; + +template +class ResultBase : public Result { + public: + ResultBase(T value) : value_(value) {} void Store(PPCContext* ppc_context) { ppc_context->r[3] = uint64_t(int32_t(value_)); } - Result() = delete; - Result& operator=(const Result&) = delete; + ResultBase() = delete; + ResultBase& operator=(const ResultBase&) = delete; operator T() const { return value_; } private: @@ -361,10 +366,10 @@ using lpunknown_t = const shim::PointerParam&; template using pointer_t = const shim::TypedPointerParam&; -using int_result_t = shim::Result; -using dword_result_t = shim::Result; -using pointer_result_t = shim::Result; -using X_HRESULT_result_t = shim::Result; +using int_result_t = shim::ResultBase; +using dword_result_t = shim::ResultBase; +using pointer_result_t = shim::ResultBase; +using X_HRESULT_result_t = shim::ResultBase; // Exported from kernel_state.cc. KernelState* kernel_state(); @@ -511,6 +516,11 @@ auto KernelTrampoline(F&& f, Tuple&& t, std::index_sequence) { template xe::cpu::Export* RegisterExport(R (*fn)(Ps&...), const char* name, xe::cpu::ExportTag::type tags) { + static_assert( + std::is_void::value || std::is_base_of::value, + "R must be void or derive from shim::Result"); + static_assert((std::is_base_of_v && ...), + "Ps must derive from shim::Param"); static const auto export_entry = new cpu::Export( ORDINAL, xe::cpu::Export::Type::kFunction, name, tags | xe::cpu::ExportTag::kImplemented | xe::cpu::ExportTag::kLog); diff --git a/src/xenia/kernel/xam/xam_avatar.cc b/src/xenia/kernel/xam/xam_avatar.cc index 0beabc37b..c3c8917ff 100644 --- a/src/xenia/kernel/xam/xam_avatar.cc +++ b/src/xenia/kernel/xam/xam_avatar.cc @@ -35,9 +35,6 @@ void XamAvatarShutdown_entry() { } DECLARE_XAM_EXPORT1(XamAvatarShutdown, kAvatars, kStub); -void RegisterAvatarExports(xe::cpu::ExportResolver* export_resolver, - KernelState* kernel_state) {} - } // namespace xam } // namespace kernel } // namespace xe