arguments.hh revision 9850:87d6b41749e9
111856Sbrandon.potter@amd.com/*
211856Sbrandon.potter@amd.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
311856Sbrandon.potter@amd.com * All rights reserved.
411856Sbrandon.potter@amd.com *
511856Sbrandon.potter@amd.com * Redistribution and use in source and binary forms, with or without
611856Sbrandon.potter@amd.com * modification, are permitted provided that the following conditions are
711856Sbrandon.potter@amd.com * met: redistributions of source code must retain the above copyright
811856Sbrandon.potter@amd.com * notice, this list of conditions and the following disclaimer;
911856Sbrandon.potter@amd.com * redistributions in binary form must reproduce the above copyright
1011856Sbrandon.potter@amd.com * notice, this list of conditions and the following disclaimer in the
1111856Sbrandon.potter@amd.com * documentation and/or other materials provided with the distribution;
1211856Sbrandon.potter@amd.com * neither the name of the copyright holders nor the names of its
1311856Sbrandon.potter@amd.com * contributors may be used to endorse or promote products derived from
1411856Sbrandon.potter@amd.com * this software without specific prior written permission.
1511856Sbrandon.potter@amd.com *
1611856Sbrandon.potter@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1711856Sbrandon.potter@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1811856Sbrandon.potter@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1911856Sbrandon.potter@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011856Sbrandon.potter@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111856Sbrandon.potter@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211856Sbrandon.potter@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311856Sbrandon.potter@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411856Sbrandon.potter@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511856Sbrandon.potter@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611856Sbrandon.potter@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711856Sbrandon.potter@amd.com *
2811856Sbrandon.potter@amd.com * Authors: Nathan Binkert
2911856Sbrandon.potter@amd.com */
3011856Sbrandon.potter@amd.com
3111856Sbrandon.potter@amd.com#ifndef __SIM_ARGUMENTS_HH__
3211856Sbrandon.potter@amd.com#define __SIM_ARGUMENTS_HH__
3312697Santhony.gutierrez@amd.com
3411856Sbrandon.potter@amd.com#include <cassert>
3511856Sbrandon.potter@amd.com
3611856Sbrandon.potter@amd.com#include "base/refcnt.hh"
3711856Sbrandon.potter@amd.com#include "base/types.hh"
3811856Sbrandon.potter@amd.com#include "mem/fs_translating_port_proxy.hh"
3911856Sbrandon.potter@amd.com
4011856Sbrandon.potter@amd.comclass ThreadContext;
4111856Sbrandon.potter@amd.com
4211856Sbrandon.potter@amd.comclass Arguments
4311856Sbrandon.potter@amd.com{
4411856Sbrandon.potter@amd.com  protected:
4512334Sgabeblack@google.com    ThreadContext *tc;
4613897Ssteve.reinhardt@amd.com    int number;
4711856Sbrandon.potter@amd.com    uint64_t getArg(uint16_t size = (uint16_t)(-1), bool fp = false);
4811856Sbrandon.potter@amd.com
4911856Sbrandon.potter@amd.com  protected:
5011856Sbrandon.potter@amd.com    class Data : public RefCounted
5111856Sbrandon.potter@amd.com    {
5213029Sbrandon.potter@amd.com      public:
5313029Sbrandon.potter@amd.com        Data(){}
5413029Sbrandon.potter@amd.com        ~Data();
5513029Sbrandon.potter@amd.com
5613029Sbrandon.potter@amd.com      private:
5713029Sbrandon.potter@amd.com        std::list<char *> data;
5813029Sbrandon.potter@amd.com
5913029Sbrandon.potter@amd.com      public:
6013029Sbrandon.potter@amd.com        char *alloc(size_t size);
6111856Sbrandon.potter@amd.com    };
6211856Sbrandon.potter@amd.com
6311856Sbrandon.potter@amd.com    RefCountingPtr<Data> data;
6411856Sbrandon.potter@amd.com
6511856Sbrandon.potter@amd.com  public:
6611856Sbrandon.potter@amd.com    Arguments(ThreadContext *ctx, int n = 0)
6711856Sbrandon.potter@amd.com        : tc(ctx), number(n), data(NULL)
6811856Sbrandon.potter@amd.com        { assert(number >= 0); data = new Data;}
6913029Sbrandon.potter@amd.com    Arguments(const Arguments &args)
7011856Sbrandon.potter@amd.com        : tc(args.tc), number(args.number), data(args.data) {}
7111856Sbrandon.potter@amd.com    ~Arguments() {}
7211856Sbrandon.potter@amd.com
7311856Sbrandon.potter@amd.com    ThreadContext *getThreadContext() const { return tc; }
7411856Sbrandon.potter@amd.com
7511856Sbrandon.potter@amd.com    const Arguments &operator=(const Arguments &args) {
7611856Sbrandon.potter@amd.com        tc = args.tc;
7711856Sbrandon.potter@amd.com        number = args.number;
7811856Sbrandon.potter@amd.com        data = args.data;
7911856Sbrandon.potter@amd.com        return *this;
8011856Sbrandon.potter@amd.com    }
8113029Sbrandon.potter@amd.com
8211856Sbrandon.potter@amd.com    // for checking if an argument is NULL
8311856Sbrandon.potter@amd.com    bool operator!() {
8411856Sbrandon.potter@amd.com        return getArg() == 0;
8511856Sbrandon.potter@amd.com    }
8611856Sbrandon.potter@amd.com
8711856Sbrandon.potter@amd.com    Arguments &operator++() {
8811856Sbrandon.potter@amd.com        ++number;
8911856Sbrandon.potter@amd.com        assert(number >= 0);
9011856Sbrandon.potter@amd.com        return *this;
9111856Sbrandon.potter@amd.com    }
9213029Sbrandon.potter@amd.com
9311856Sbrandon.potter@amd.com    Arguments operator++(int) {
9411856Sbrandon.potter@amd.com        Arguments args = *this;
9511856Sbrandon.potter@amd.com        ++number;
9611856Sbrandon.potter@amd.com        assert(number >= 0);
9711856Sbrandon.potter@amd.com        return args;
9811856Sbrandon.potter@amd.com    }
9911856Sbrandon.potter@amd.com
10011856Sbrandon.potter@amd.com    Arguments &operator--() {
10111856Sbrandon.potter@amd.com        --number;
10211856Sbrandon.potter@amd.com        assert(number >= 0);
10311856Sbrandon.potter@amd.com        return *this;
10411856Sbrandon.potter@amd.com    }
10511856Sbrandon.potter@amd.com
10611856Sbrandon.potter@amd.com    Arguments operator--(int) {
10711856Sbrandon.potter@amd.com        Arguments args = *this;
10811856Sbrandon.potter@amd.com        --number;
10911856Sbrandon.potter@amd.com        assert(number >= 0);
11011856Sbrandon.potter@amd.com        return args;
11111856Sbrandon.potter@amd.com    }
11211856Sbrandon.potter@amd.com
11311856Sbrandon.potter@amd.com    const Arguments &operator+=(int index) {
11411856Sbrandon.potter@amd.com        number += index;
11511856Sbrandon.potter@amd.com        assert(number >= 0);
11611856Sbrandon.potter@amd.com        return *this;
11711856Sbrandon.potter@amd.com    }
11811856Sbrandon.potter@amd.com
11911856Sbrandon.potter@amd.com    const Arguments &operator-=(int index) {
12011856Sbrandon.potter@amd.com        number -= index;
12111856Sbrandon.potter@amd.com        assert(number >= 0);
12211856Sbrandon.potter@amd.com        return *this;
12311856Sbrandon.potter@amd.com    }
12411856Sbrandon.potter@amd.com
12511856Sbrandon.potter@amd.com    Arguments operator[](int index) {
12611856Sbrandon.potter@amd.com        return Arguments(tc, index);
12711856Sbrandon.potter@amd.com    }
12811856Sbrandon.potter@amd.com
12911856Sbrandon.potter@amd.com    template <class T>
13011856Sbrandon.potter@amd.com    operator T() {
13111856Sbrandon.potter@amd.com        assert(sizeof(T) <= sizeof(uint64_t));
13211856Sbrandon.potter@amd.com        T d = static_cast<T>(getArg(sizeof(T)));
13311856Sbrandon.potter@amd.com        return d;
13411856Sbrandon.potter@amd.com    }
13512392Sjason@lowepower.com
13611856Sbrandon.potter@amd.com    template <class T>
13711856Sbrandon.potter@amd.com    operator T *() {
13811856Sbrandon.potter@amd.com        T *buf = (T *)data->alloc(sizeof(T));
13911856Sbrandon.potter@amd.com        CopyOut(tc, buf, getArg(sizeof(T)), sizeof(T));
14011856Sbrandon.potter@amd.com        return buf;
14111856Sbrandon.potter@amd.com    }
14211856Sbrandon.potter@amd.com
14311856Sbrandon.potter@amd.com    operator char *() {
14411856Sbrandon.potter@amd.com        char *buf = data->alloc(2048);
14511856Sbrandon.potter@amd.com        CopyStringOut(tc, buf, getArg(), 2048);
14611856Sbrandon.potter@amd.com        return buf;
14711856Sbrandon.potter@amd.com    }
14811856Sbrandon.potter@amd.com};
14911856Sbrandon.potter@amd.com
15011856Sbrandon.potter@amd.com#endif // __SIM_ARGUMENTS_HH__
15111856Sbrandon.potter@amd.com