/** ****************************************************************************** * 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_EXPORT_H_ #define XENIA_KERNEL_EXPORT_H_ #include #include typedef struct xe_ppc_state xe_ppc_state_t; namespace xe { namespace kernel { typedef void (*xe_kernel_export_impl_fn)(); typedef void (*xe_kernel_export_shim_fn)(xe_ppc_state_t*, void*); class KernelExport { public: enum ExportType { Function = 0, Variable = 1, }; uint32_t ordinal; ExportType type; uint32_t flags; char signature[16]; char name[96]; bool is_implemented; union { // Variable data. Only valid when kXEKernelExportFlagVariable is set. // This is an address in the client memory space that the variable can // be found at. uint32_t variable_ptr; struct { // Second argument passed to the shim function. void* shim_data; // Shimmed implementation. // This is called directly from generated code. // It should parse args, do fixups, and call the impl. xe_kernel_export_shim_fn shim; // Real function implementation. xe_kernel_export_impl_fn impl; } function_data; }; }; #define XE_DECLARE_EXPORT(module, ordinal, name, signature, type, flags) \ { \ ordinal, \ KernelExport::type, \ flags, \ #signature, \ #name, \ } class ExportResolver { public: ExportResolver(); ~ExportResolver(); void RegisterTable(const char* library_name, KernelExport* exports, const size_t count); KernelExport* GetExportByOrdinal(const char* library_name, const uint32_t ordinal); KernelExport* GetExportByName(const char* library_name, const char* name); void SetVariableMapping(const char* library_name, const uint32_t ordinal, uint32_t value); void SetFunctionMapping(const char* library_name, const uint32_t ordinal, void* shim_data, xe_kernel_export_shim_fn shim, xe_kernel_export_impl_fn impl); private: class ExportTable { public: char name[32]; KernelExport* exports; size_t count; }; std::vector tables_; }; } // namespace kernel } // namespace xe #endif // XENIA_KERNEL_EXPORT_H_