xenia-canary/src/xenia/cpu/processor.h

107 lines
3.2 KiB
C
Raw Normal View History

/**
******************************************************************************
* 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_PROCESSOR_H_
#define XENIA_CPU_PROCESSOR_H_
2014-08-16 07:56:50 +00:00
#include <mutex>
#include <vector>
2015-05-25 06:16:43 +00:00
#include "xenia/base/mutex.h"
2015-05-04 05:28:25 +00:00
#include "xenia/cpu/backend/backend.h"
#include "xenia/cpu/entry_table.h"
#include "xenia/cpu/export_resolver.h"
2015-05-04 05:28:25 +00:00
#include "xenia/cpu/frontend/ppc_frontend.h"
#include "xenia/cpu/function.h"
#include "xenia/cpu/module.h"
#include "xenia/cpu/thread_state.h"
2015-05-24 05:27:43 +00:00
#include "xenia/debug/debugger.h"
2015-02-01 06:49:47 +00:00
#include "xenia/memory.h"
namespace xe {
namespace cpu {
2015-03-24 15:25:58 +00:00
class ThreadState;
2014-08-21 05:50:10 +00:00
class XexModule;
2014-08-04 22:39:42 +00:00
enum class Irql : uint32_t {
PASSIVE = 0,
APC = 1,
DISPATCH = 2,
DPC = 3,
};
class Processor {
2014-08-21 05:50:10 +00:00
public:
2015-05-24 05:27:43 +00:00
Processor(Memory* memory, ExportResolver* export_resolver,
debug::Debugger* debugger);
~Processor();
Memory* memory() const { return memory_; }
2015-05-24 05:27:43 +00:00
debug::Debugger* debugger() const { return debugger_; }
2015-05-04 05:28:25 +00:00
frontend::PPCFrontend* frontend() const { return frontend_.get(); }
backend::Backend* backend() const { return backend_.get(); }
ExportResolver* export_resolver() const { return export_resolver_; }
2015-05-06 00:21:08 +00:00
bool Setup();
void set_debug_info_flags(uint32_t debug_info_flags) {
debug_info_flags_ = debug_info_flags;
}
2015-05-06 00:21:08 +00:00
bool AddModule(std::unique_ptr<Module> module);
2015-05-04 05:28:25 +00:00
Module* GetModule(const char* name);
Module* GetModule(const std::string& name) { return GetModule(name.c_str()); }
std::vector<Module*> GetModules();
Module* builtin_module() const { return builtin_module_; }
FunctionInfo* DefineBuiltin(const std::string& name,
2015-05-31 23:31:19 +00:00
FunctionInfo::BuiltinHandler handler, void* arg0,
2015-05-04 05:28:25 +00:00
void* arg1);
std::vector<Function*> FindFunctionsWithAddress(uint32_t address);
2015-05-06 00:21:08 +00:00
bool LookupFunctionInfo(uint32_t address, FunctionInfo** out_symbol_info);
bool LookupFunctionInfo(Module* module, uint32_t address,
FunctionInfo** out_symbol_info);
bool ResolveFunction(uint32_t address, Function** out_function);
2015-05-04 05:28:25 +00:00
2015-05-06 00:21:08 +00:00
bool Execute(ThreadState* thread_state, uint32_t address);
uint64_t Execute(ThreadState* thread_state, uint32_t address, uint64_t args[],
2015-03-24 15:25:58 +00:00
size_t arg_count);
2013-09-25 07:46:09 +00:00
2014-08-04 22:39:42 +00:00
Irql RaiseIrql(Irql new_value);
void LowerIrql(Irql old_value);
2014-08-21 05:50:10 +00:00
private:
2015-05-06 00:21:08 +00:00
bool DemandFunction(FunctionInfo* symbol_info, Function** out_function);
2014-08-21 05:50:10 +00:00
Memory* memory_;
2015-05-24 05:27:43 +00:00
debug::Debugger* debugger_;
2015-05-04 05:28:25 +00:00
uint32_t debug_info_flags_;
std::unique_ptr<frontend::PPCFrontend> frontend_;
std::unique_ptr<backend::Backend> backend_;
ExportResolver* export_resolver_;
EntryTable entry_table_;
2015-05-25 06:16:43 +00:00
xe::mutex modules_lock_;
2015-05-04 05:28:25 +00:00
std::vector<std::unique_ptr<Module>> modules_;
Module* builtin_module_;
uint32_t next_builtin_address_;
2014-08-21 05:50:10 +00:00
Irql irql_;
};
} // namespace cpu
} // namespace xe
#endif // XENIA_CPU_PROCESSOR_H_