#ifndef ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
#define ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
#include "opencsd/ocsd_if_types.h"
#include "opencsd/trc_pkt_types.h"
#include "comp_attach_pt_t.h"
#include "interfaces/trc_tgt_mem_access_i.h"
#include "interfaces/trc_instr_decode_i.h"
class OcsdCodeFollower
{
public:
OcsdCodeFollower();
~OcsdCodeFollower();
void initInterfaces(componentAttachPt<ITargetMemAccess> *pMemAccess, componentAttachPt<IInstrDecode> *pIDecode);
void setArchProfile(const ocsd_arch_profile_t profile); void setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule); void setMemSpaceCSID(const uint8_t csid); void setISA(const ocsd_isa isa); void setDSBDMBasWP();
ocsd_err_t followSingleAtom(const ocsd_vaddr_t addrStart, const ocsd_atm_val A);
const ocsd_vaddr_t getRangeSt() const; const ocsd_vaddr_t getRangeEn() const; const bool hasRange() const;
const bool hasNextAddr() const; const ocsd_vaddr_t getNextAddr() const;
const ocsd_instr_type getInstrType() const; const ocsd_instr_subtype getInstrSubType() const; const bool isCondInstr() const; const bool isLink() const; const bool ISAChanged() const; const ocsd_isa nextISA() const; const uint8_t getInstrSize() const;
const bool isNacc() const; void clearNacc(); const ocsd_vaddr_t getNaccAddr() const; const ocsd_mem_space_acc_t getMemSpaceAccess() const;
private:
bool initFollowerState();
ocsd_err_t decodeSingleOpCode();
ocsd_instr_info m_instr_info;
ocsd_vaddr_t m_st_range_addr; ocsd_vaddr_t m_en_range_addr; ocsd_vaddr_t m_next_addr; bool m_b_next_valid;
ocsd_mem_space_acc_t m_mem_acc_rule;
uint8_t m_mem_space_csid;
ocsd_vaddr_t m_nacc_address; bool m_b_nacc_err;
componentAttachPt<ITargetMemAccess> *m_pMemAccess;
componentAttachPt<IInstrDecode> *m_pIDecode;
};
#endif
inline void OcsdCodeFollower::setArchProfile(const ocsd_arch_profile_t profile)
{
m_instr_info.pe_type = profile;
}
inline void OcsdCodeFollower::setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule)
{
m_mem_acc_rule = mem_acc_rule;
}
inline const ocsd_mem_space_acc_t OcsdCodeFollower::getMemSpaceAccess() const
{
return m_mem_acc_rule;
}
inline void OcsdCodeFollower::setMemSpaceCSID(const uint8_t csid)
{
m_mem_space_csid = csid;
}
inline void OcsdCodeFollower::setISA(const ocsd_isa isa)
{
m_instr_info.isa = isa;
}
inline void OcsdCodeFollower::setDSBDMBasWP()
{
m_instr_info.dsb_dmb_waypoints = 1;
}
inline const ocsd_vaddr_t OcsdCodeFollower::getRangeSt() const
{
return m_st_range_addr;
}
inline const ocsd_vaddr_t OcsdCodeFollower::getRangeEn() const
{
return m_en_range_addr;
}
inline const bool OcsdCodeFollower::hasRange() const
{
return m_st_range_addr < m_en_range_addr;
}
inline const bool OcsdCodeFollower::hasNextAddr() const
{
return m_b_next_valid;
}
inline const ocsd_vaddr_t OcsdCodeFollower::getNextAddr() const
{
return m_next_addr;
}
inline const ocsd_instr_type OcsdCodeFollower::getInstrType() const
{
return m_instr_info.type;
}
inline const ocsd_instr_subtype OcsdCodeFollower::getInstrSubType() const
{
return m_instr_info.sub_type;
}
inline const uint8_t OcsdCodeFollower::getInstrSize() const
{
return m_instr_info.instr_size;
}
inline const bool OcsdCodeFollower::isCondInstr() const
{
return (bool)(m_instr_info.is_conditional == 1);
}
inline const bool OcsdCodeFollower::isLink() const
{
return (bool)(m_instr_info.is_link == 1);
}
inline const bool OcsdCodeFollower::ISAChanged() const
{
return (bool)(m_instr_info.isa != m_instr_info.next_isa);
}
inline const ocsd_isa OcsdCodeFollower::nextISA() const
{
return m_instr_info.next_isa;
}
inline const bool OcsdCodeFollower::isNacc() const
{
return m_b_nacc_err;
}
inline void OcsdCodeFollower::clearNacc()
{
m_b_nacc_err = false;
}
inline const ocsd_vaddr_t OcsdCodeFollower::getNaccAddr() const
{
return m_nacc_address;
}