/** ****************************************************************************** * 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_CPU_MODULE_H_ #define XENIA_CPU_MODULE_H_ #include #include #include #include #include #include "xenia/base/mutex.h" #include "xenia/cpu/symbol_info.h" #include "xenia/memory.h" namespace xe { namespace cpu { class Function; class Processor; class Module { public: Module(Processor* processor); virtual ~Module(); Memory* memory() const { return memory_; } virtual const std::string& name() const = 0; virtual bool ContainsAddress(uint32_t address); SymbolInfo* LookupSymbol(uint32_t address, bool wait = true); virtual SymbolStatus DeclareFunction(uint32_t address, FunctionInfo** out_symbol_info); virtual SymbolStatus DeclareVariable(uint32_t address, VariableInfo** out_symbol_info); SymbolStatus DefineFunction(FunctionInfo* symbol_info); SymbolStatus DefineVariable(VariableInfo* symbol_info); void ForEachFunction(std::function callback); void ForEachSymbol(size_t start_index, size_t end_index, std::function callback); size_t QuerySymbolCount(); bool ReadMap(const char* file_name); private: SymbolStatus DeclareSymbol(SymbolType type, uint32_t address, SymbolInfo** out_symbol_info); SymbolStatus DefineSymbol(SymbolInfo* symbol_info); protected: Processor* processor_; Memory* memory_; private: // TODO(benvanik): replace with a better data structure. xe::mutex lock_; std::unordered_map map_; std::vector> list_; }; } // namespace cpu } // namespace xe #endif // XENIA_CPU_MODULE_H_