/*
 * Copyright (c) 2016 Advanced Micro Devices, Inc.
 * All rights reserved.
 *
 * For use for simulation and test purposes only
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef __AUX_VECTOR_HH__
#define __AUX_VECTOR_HH__

#include "base/compiler.hh"

namespace gem5
{

namespace auxv
{

template<class IntType>
class AuxVector
{
  public:
    AuxVector() = default;
    AuxVector(IntType _type, IntType _val) : type(_type), val(_val) {}

    IntType type = 0;
    IntType val = 0;
};

// Ensure the global versions of swap_byte are visible.
using ::swap_byte;

// Define swap_byte in this namespace, so argument dependent resolution can
// find it.
template <class IntType>
inline AuxVector<IntType>
swap_byte(const AuxVector<IntType> &av)
{
    return AuxVector<IntType>(swap_byte(av.type), swap_byte(av.val));
}

enum Type
{
    Null = 0,          // End of vector.
    Ignore = 1,        // Ignored.
    Execfd = 2,        // File descriptor of program if interpreter used.
    Phdr = 3,          // Address of program header tables in memory.
    Phent = 4,         // Size in bytes of one program header entry.
    Phnum = 5,         // Number of entries in program header table.
    Pagesz = 6,        // System page size.
    Base = 7,          // Base address of interpreter program in memory.
    Flags = 8,         // Unused.
    Entry = 9,         // Entry point of program after interpreter setup.
    Notelf = 10,       // Non-zero if format is different than ELF.
    Uid = 11,          // Address of real user ID of thread.
    Euid = 12,         // Address of effective user ID of thread.
    Gid = 13,          // Address of real group ID of thread.
    Egid = 14,         // Address of effective group ID of thread.
    Platform = 15,     // Platform string for the architecture.
    Hwcap = 16,        // Bits which describe the hardware capabilities.
    Clktck = 17,       // Frequency at which times() syscall increments.
    Secure = 23,       // Whether to enable "secure mode" in executable.
    BasePlatform = 24, // Platform string (differs on PowerPC only).
    Random = 25,       // Pointer to 16 bytes of random data.
    Hwcap2 = 26,       // Extension of AT_HWCAP.
    Execfn = 31,       // Filename of the program.
    VectorSize = 44
};

} // namespace auxv

} // namespace gem5

#define GEM5_DEPRECATE_AT(NAME, name) M5_AT_##NAME \
    GEM5_DEPRECATED_ENUM_VAL(\
        "Replace M5_AT_" #NAME " with gem5::auxv::" #name) = gem5::auxv::name

enum AuxiliaryVectorType
{
    GEM5_DEPRECATE_AT(NULL, Null),
    GEM5_DEPRECATE_AT(IGNORE, Ignore),
    GEM5_DEPRECATE_AT(EXECFD, Execfd),
    GEM5_DEPRECATE_AT(PHDR, Phdr),
    GEM5_DEPRECATE_AT(PHENT, Phent),
    GEM5_DEPRECATE_AT(PHNUM, Phnum),
    GEM5_DEPRECATE_AT(PAGESZ, Pagesz),
    GEM5_DEPRECATE_AT(BASE, Base),
    GEM5_DEPRECATE_AT(FLAGS, Flags),
    GEM5_DEPRECATE_AT(ENTRY, Entry),
    GEM5_DEPRECATE_AT(NOTELF, Notelf),
    GEM5_DEPRECATE_AT(UID, Uid),
    GEM5_DEPRECATE_AT(EUID, Euid),
    GEM5_DEPRECATE_AT(GID, Gid),
    GEM5_DEPRECATE_AT(EGID, Egid),
    GEM5_DEPRECATE_AT(PLATFORM, Platform),
    GEM5_DEPRECATE_AT(HWCAP, Hwcap),
    GEM5_DEPRECATE_AT(CLKTCK, Clktck),
    GEM5_DEPRECATE_AT(SECURE, Secure),
    M5_BASE_PLATFORM GEM5_DEPRECATED_ENUM_VAL(
            "Replace M5_BASE_PLATFORM with gem5::auxv::BasePlatform") =
        gem5::auxv::BasePlatform,
    GEM5_DEPRECATE_AT(RANDOM, Random),
    GEM5_DEPRECATE_AT(HWCAP2, Hwcap2),
    GEM5_DEPRECATE_AT(EXECFN, Execfn),
    GEM5_DEPRECATE_AT(VECTOR_SIZE, VectorSize)
};

#undef GEM5_DEPRECATE_AT

template <class IntType>
using AuxVector GEM5_DEPRECATED(
        "The AuxVector template is now in the gem5::auxv namespace.") =
        gem5::auxv::AuxVector<IntType>;

#endif // __AUX_VECTOR_HH__
