/*
 * Copyright (c) 2016 Advanced Micro Devices, Inc.
 * All rights reserved.
 *
 * 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 gem5::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

#define GEM5_DEPRECATE_AT(NAME, name) M5_AT_##NAME \
    [[deprecated("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 [[deprecated(
            "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 [[deprecated(
        "The AuxVector template is now in the gem5::auxv namespace.")]] =
        gem5::auxv::AuxVector<IntType>;

} // namespace gem5

#endif // __AUX_VECTOR_HH__
