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