/*
* File:    GHSSecInfo.h
*
* Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
* See included license file for license details.
*/
#if !defined(_GHSSecInfo_h_)
#define _GHSSecInfo_h_

#include "StELFFile.h"
#include "smart_ptr.h"

namespace elftosb
{

/*!
* \brief Wrapper around the GHS-specific .secinfo ELF section.
*
* ELF files produced by the Green Hills MULTI toolset will have a
* special .secinfo section. For the most part, this section contains
* a list of address
* ranges that should be filled by the C runtime startup code. The
* address ranges correspond to those of ELF sections whose type is
* #SHT_NOBITS. The GHS runtime uses this table instead of just filling
* all #SHT_NOBITS sections because the linker command file can
* be used to optionally not fill individual sections.
*
* The isSectionFilled() methods let calling code determine if an ELF
* section is found in the .secinfo table. If the section is found,
* then it should be filled.
*/
class GHSSecInfo
{
public:
       //! \brief Default constructor.
       GHSSecInfo(StELFFile * elf);

       //! \brief Returns true if there is a .secinfo section present in the ELF file.
       bool hasSecinfo() const { return m_hasInfo; }

       //! \brief Determines if a section should be filled.
       bool isSectionFilled(uint32_t addr, uint32_t length);

       //! \brief Determines if \a section should be filled.
       bool isSectionFilled(const Elf32_Shdr & section);

protected:

#pragma pack(1)

       /*!
        * \brief The structure of one .secinfo entry.
        */
       struct ghs_secinfo_t
       {
               uint32_t m_clearAddr;   //!< Address to start filling from.
               uint32_t m_clearValue;  //!< Value to fill with.
               uint32_t m_numBytesToClear;     //!< Number of bytes to fill.
       };

#pragma pack()

protected:
       StELFFile * m_elf;      //!< The parser object for our ELF file.
       bool m_hasInfo;         //!< Whether .secinfo is present in the ELF file.
       smart_array_ptr<ghs_secinfo_t> m_info;  //!< Pointer to the .secinfo entries. Will be NULL if there is no .secinfo section in the file.
       unsigned m_entryCount;  //!< Number of entries in #m_info.
};

}; // namespace elftosb

#endif // _GHSSecInfo_h_