arguments.hh revision 10468:8c1b836edc92
111238Sandreas.sandberg@arm.com/*
211238Sandreas.sandberg@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
311238Sandreas.sandberg@arm.com * All rights reserved.
411889Spierre-yves.peneau@lirmm.fr *
511889Spierre-yves.peneau@lirmm.fr * Redistribution and use in source and binary forms, with or without
611238Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
711238Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
811238Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
911238Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1011238Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1111238Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1211238Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
1311238Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
1411238Sandreas.sandberg@arm.com * this software without specific prior written permission.
1511238Sandreas.sandberg@arm.com *
1611238Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1711238Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1811238Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1911238Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011238Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111238Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211238Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311238Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411238Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511238Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611238Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711238Sandreas.sandberg@arm.com *
2811238Sandreas.sandberg@arm.com * Authors: Nathan Binkert
2911238Sandreas.sandberg@arm.com */
3011238Sandreas.sandberg@arm.com
3111238Sandreas.sandberg@arm.com#ifndef __SIM_ARGUMENTS_HH__
3211238Sandreas.sandberg@arm.com#define __SIM_ARGUMENTS_HH__
3311238Sandreas.sandberg@arm.com
3411238Sandreas.sandberg@arm.com#include <cassert>
3511238Sandreas.sandberg@arm.com#include <memory>
3611238Sandreas.sandberg@arm.com
3711238Sandreas.sandberg@arm.com#include "base/types.hh"
3811238Sandreas.sandberg@arm.com#include "mem/fs_translating_port_proxy.hh"
3911889Spierre-yves.peneau@lirmm.fr
4011238Sandreas.sandberg@arm.comclass ThreadContext;
4112564Sgabeblack@google.com
4213774Sandreas.sandberg@arm.comclass Arguments
4312564Sgabeblack@google.com{
4411238Sandreas.sandberg@arm.com  protected:
4511238Sandreas.sandberg@arm.com    ThreadContext *tc;
4611238Sandreas.sandberg@arm.com    int number;
4711889Spierre-yves.peneau@lirmm.fr    uint64_t getArg(uint16_t size = (uint16_t)(-1), bool fp = false);
4811238Sandreas.sandberg@arm.com
4911238Sandreas.sandberg@arm.com  protected:
5011238Sandreas.sandberg@arm.com    class Data
5111238Sandreas.sandberg@arm.com    {
5211238Sandreas.sandberg@arm.com      public:
5311238Sandreas.sandberg@arm.com        Data(){}
5411238Sandreas.sandberg@arm.com        ~Data();
5511238Sandreas.sandberg@arm.com
5611238Sandreas.sandberg@arm.com      private:
5711297Sandreas.sandberg@arm.com        std::list<char *> data;
5811238Sandreas.sandberg@arm.com
5911238Sandreas.sandberg@arm.com      public:
6011238Sandreas.sandberg@arm.com        char *alloc(size_t size);
6111238Sandreas.sandberg@arm.com    };
6211238Sandreas.sandberg@arm.com
6311238Sandreas.sandberg@arm.com    std::shared_ptr<Data> data;
6411238Sandreas.sandberg@arm.com
6511238Sandreas.sandberg@arm.com  public:
6611238Sandreas.sandberg@arm.com    Arguments(ThreadContext *ctx, int n = 0)
6711238Sandreas.sandberg@arm.com        : tc(ctx), number(n), data(new Data())
6811238Sandreas.sandberg@arm.com    { assert(number >= 0); }
6911238Sandreas.sandberg@arm.com    Arguments(const Arguments &args)
7011238Sandreas.sandberg@arm.com        : tc(args.tc), number(args.number), data(args.data) {}
7111238Sandreas.sandberg@arm.com    ~Arguments() {}
7211688Sandreas.hansson@arm.com
7311238Sandreas.sandberg@arm.com    ThreadContext *getThreadContext() const { return tc; }
7411238Sandreas.sandberg@arm.com
7511238Sandreas.sandberg@arm.com    const Arguments &operator=(const Arguments &args) {
7611238Sandreas.sandberg@arm.com        if (this != &args) {
7711238Sandreas.sandberg@arm.com            tc = args.tc;
7811238Sandreas.sandberg@arm.com            number = args.number;
7911238Sandreas.sandberg@arm.com            data = args.data;
8011238Sandreas.sandberg@arm.com        }
8111238Sandreas.sandberg@arm.com        return *this;
8211238Sandreas.sandberg@arm.com    }
8311889Spierre-yves.peneau@lirmm.fr
8411238Sandreas.sandberg@arm.com    // for checking if an argument is NULL
8511238Sandreas.sandberg@arm.com    bool operator!() {
8611238Sandreas.sandberg@arm.com        return getArg() == 0;
8711238Sandreas.sandberg@arm.com    }
8812564Sgabeblack@google.com
8911238Sandreas.sandberg@arm.com    Arguments &operator++() {
9011238Sandreas.sandberg@arm.com        ++number;
9112564Sgabeblack@google.com        assert(number >= 0);
9211238Sandreas.sandberg@arm.com        return *this;
9311238Sandreas.sandberg@arm.com    }
9411238Sandreas.sandberg@arm.com
9511238Sandreas.sandberg@arm.com    Arguments operator++(int) {
9611238Sandreas.sandberg@arm.com        Arguments args = *this;
9711238Sandreas.sandberg@arm.com        ++number;
9812564Sgabeblack@google.com        assert(number >= 0);
9911238Sandreas.sandberg@arm.com        return args;
10011238Sandreas.sandberg@arm.com    }
10112564Sgabeblack@google.com
10211238Sandreas.sandberg@arm.com    Arguments &operator--() {
10312564Sgabeblack@google.com        --number;
10411238Sandreas.sandberg@arm.com        assert(number >= 0);
10511238Sandreas.sandberg@arm.com        return *this;
10611238Sandreas.sandberg@arm.com    }
10713731Sandreas.sandberg@arm.com
10811238Sandreas.sandberg@arm.com    Arguments operator--(int) {
10911238Sandreas.sandberg@arm.com        Arguments args = *this;
11011238Sandreas.sandberg@arm.com        --number;
11111238Sandreas.sandberg@arm.com        assert(number >= 0);
11211238Sandreas.sandberg@arm.com        return args;
11311238Sandreas.sandberg@arm.com    }
11411238Sandreas.sandberg@arm.com
11511238Sandreas.sandberg@arm.com    const Arguments &operator+=(int index) {
116        number += index;
117        assert(number >= 0);
118        return *this;
119    }
120
121    const Arguments &operator-=(int index) {
122        number -= index;
123        assert(number >= 0);
124        return *this;
125    }
126
127    Arguments operator[](int index) {
128        return Arguments(tc, index);
129    }
130
131    template <class T>
132    operator T() {
133        assert(sizeof(T) <= sizeof(uint64_t));
134        T d = static_cast<T>(getArg(sizeof(T)));
135        return d;
136    }
137
138    template <class T>
139    operator T *() {
140        T *buf = (T *)data->alloc(sizeof(T));
141        CopyOut(tc, buf, getArg(sizeof(T)), sizeof(T));
142        return buf;
143    }
144
145    operator char *() {
146        char *buf = data->alloc(2048);
147        CopyStringOut(tc, buf, getArg(), 2048);
148        return buf;
149    }
150};
151
152#endif // __SIM_ARGUMENTS_HH__
153