//--- // fxos.os: Operating system models and primitives //--- #ifndef LIBFXOS_OS_H #define LIBFXOS_OS_H #include #include #include #include namespace FxOS { class OS { public: /* Load an OS from a file. */ OS(File &file); /* Get OS version */ std::string version() const noexcept; /* Get number of syscalls */ int syscall_count() const noexcept; /* Get a syscall entry */ uint32_t syscall(int id) const; /* Find a syscall entry. Returns -1 if syscall is not found */ int find_syscall(uint32_t entry) const noexcept; /* Get the footer address. Returns -1 if not found */ uint32_t footer() const noexcept; private: /* Determine the OS version. This should be the first analysis function to be called, because it determines the type of model (ie. fx9860g versus fxcg50) thus the location of the syscall table and many more important parameters. */ void parse_version(); /* Locate and parse the syscall table. */ void parse_syscall_table(); /* Locate the footer */ void parse_footer(); /* Working target which is a simulated memory with just the OS */ Target m_target; //--- // OS information //--- /* Version */ std::string m_version; /* Syscall table, in order of syscall IDs */ std::vector m_syscall_table; /* Bimap converse, syscalls sorted by address */ std::map m_syscall_addresses; /* Footer address */ uint32_t m_footer; }; } /* namespace FxOS */ #endif /* LIBFXOS_OS_H */