arguments.cc revision 2665
19651SAndreas.Sandberg@ARM.com/*
29651SAndreas.Sandberg@ARM.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
39651SAndreas.Sandberg@ARM.com * All rights reserved.
49651SAndreas.Sandberg@ARM.com *
59651SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without
69651SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are
79651SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright
89651SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer;
99651SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright
109651SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the
119651SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution;
129651SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its
139651SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from
149651SAndreas.Sandberg@ARM.com * this software without specific prior written permission.
159651SAndreas.Sandberg@ARM.com *
169651SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179651SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189651SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199651SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209651SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219651SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229651SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239651SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249651SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259651SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269651SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279651SAndreas.Sandberg@ARM.com *
289651SAndreas.Sandberg@ARM.com * Authors: Nathan Binkert
299651SAndreas.Sandberg@ARM.com */
309651SAndreas.Sandberg@ARM.com
319651SAndreas.Sandberg@ARM.com#include "arch/alpha/arguments.hh"
329651SAndreas.Sandberg@ARM.com#include "arch/alpha/vtophys.hh"
339651SAndreas.Sandberg@ARM.com#include "cpu/exec_context.hh"
349651SAndreas.Sandberg@ARM.com#include "mem/vport.hh"
359651SAndreas.Sandberg@ARM.com
369651SAndreas.Sandberg@ARM.comusing namespace AlphaISA;
379651SAndreas.Sandberg@ARM.com
389651SAndreas.Sandberg@ARM.comAlphaArguments::Data::~Data()
399651SAndreas.Sandberg@ARM.com{
4011793Sbrandon.potter@amd.com    while (!data.empty()) {
4111793Sbrandon.potter@amd.com        delete [] data.front();
4211793Sbrandon.potter@amd.com        data.pop_front();
4311793Sbrandon.potter@amd.com    }
4411793Sbrandon.potter@amd.com}
459881Sandreas@sandberg.pp.se
469651SAndreas.Sandberg@ARM.comchar *
479651SAndreas.Sandberg@ARM.comAlphaArguments::Data::alloc(size_t size)
489651SAndreas.Sandberg@ARM.com{
499651SAndreas.Sandberg@ARM.com    char *buf = new char[size];
509651SAndreas.Sandberg@ARM.com    data.push_back(buf);
519651SAndreas.Sandberg@ARM.com    return buf;
529651SAndreas.Sandberg@ARM.com}
5310073Sandreas@sandberg.pp.se
5410073Sandreas@sandberg.pp.seuint64_t
5510073Sandreas@sandberg.pp.seAlphaArguments::getArg(bool fp)
5610073Sandreas@sandberg.pp.se{
5710073Sandreas@sandberg.pp.se    if (number < 6) {
5810073Sandreas@sandberg.pp.se        if (fp)
5910073Sandreas@sandberg.pp.se            return xc->readFloatRegBits(16 + number);
6010073Sandreas@sandberg.pp.se        else
6110073Sandreas@sandberg.pp.se            return xc->readIntReg(16 + number);
6210073Sandreas@sandberg.pp.se    } else {
6310073Sandreas@sandberg.pp.se        Addr sp = xc->readIntReg(30);
6410073Sandreas@sandberg.pp.se        VirtualPort *vp = xc->getVirtPort(xc);
6510073Sandreas@sandberg.pp.se        uint64_t arg = vp->read<uint64_t>(sp + (number-6) * sizeof(uint64_t));
6610073Sandreas@sandberg.pp.se        xc->delVirtPort(vp);
6710073Sandreas@sandberg.pp.se        return arg;
6810073Sandreas@sandberg.pp.se    }
699881Sandreas@sandberg.pp.se}
709881Sandreas@sandberg.pp.se
719881Sandreas@sandberg.pp.se