vptr.hh revision 8706:b1838faf3bcc
15323Sgblack@eecs.umich.edu/*
22934Sktlim@umich.edu * Copyright (c) 2004-2005 The Regents of The University of Michigan
32934Sktlim@umich.edu * All rights reserved.
42934Sktlim@umich.edu *
52934Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without
62934Sktlim@umich.edu * modification, are permitted provided that the following conditions are
72934Sktlim@umich.edu * met: redistributions of source code must retain the above copyright
82934Sktlim@umich.edu * notice, this list of conditions and the following disclaimer;
92934Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright
102934Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the
112934Sktlim@umich.edu * documentation and/or other materials provided with the distribution;
122934Sktlim@umich.edu * neither the name of the copyright holders nor the names of its
132934Sktlim@umich.edu * contributors may be used to endorse or promote products derived from
142934Sktlim@umich.edu * this software without specific prior written permission.
152934Sktlim@umich.edu *
162934Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172934Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182934Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192934Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202934Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212934Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222934Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232934Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242934Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252934Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262934Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272934Sktlim@umich.edu *
282934Sktlim@umich.edu * Authors: Nathan Binkert
292934Sktlim@umich.edu */
302969Sktlim@umich.edu
312934Sktlim@umich.edu#ifndef __ARCH_ALPHA_VPTR_HH__
322995Ssaidi@eecs.umich.edu#define __ARCH_ALPHA_VPTR_HH__
332934Sktlim@umich.edu
342934Sktlim@umich.edu#include "arch/isa_traits.hh"
352934Sktlim@umich.edu#include "arch/vtophys.hh"
362934Sktlim@umich.edu#include "mem/fs_translating_port_proxy.hh"
372934Sktlim@umich.edu
382934Sktlim@umich.educlass ThreadContext;
392934Sktlim@umich.edu
402934Sktlim@umich.edutemplate <class T>
414520Ssaidi@eecs.umich.educlass VPtr
424520Ssaidi@eecs.umich.edu{
434982Ssaidi@eecs.umich.edu  public:
444520Ssaidi@eecs.umich.edu    typedef T Type;
454520Ssaidi@eecs.umich.edu
462934Sktlim@umich.edu  protected:
472934Sktlim@umich.edu    ThreadContext *tc;
483005Sstever@eecs.umich.edu    Addr ptr;
493005Sstever@eecs.umich.edu    Addr buffer[(sizeof(T)-1)/sizeof(Addr) + 1];
503304Sstever@eecs.umich.edu
512995Ssaidi@eecs.umich.edu  public:
522934Sktlim@umich.edu    explicit VPtr(ThreadContext *_tc, Addr p = 0)
532934Sktlim@umich.edu        : tc(_tc), ptr(p)
544965Ssaidi@eecs.umich.edu    {
555266Sksewell@umich.edu        refresh();
562934Sktlim@umich.edu    }
572934Sktlim@umich.edu
582934Sktlim@umich.edu    template <class U>
592934Sktlim@umich.edu    VPtr(const VPtr<U> &vp)
602934Sktlim@umich.edu        : tc(vp.tc), ptr(vp.ptr)
612995Ssaidi@eecs.umich.edu    {
622934Sktlim@umich.edu        refresh();
632934Sktlim@umich.edu    }
642934Sktlim@umich.edu
652934Sktlim@umich.edu    ~VPtr()
662934Sktlim@umich.edu    {}
672995Ssaidi@eecs.umich.edu
682934Sktlim@umich.edu    void
692934Sktlim@umich.edu    refresh()
702953Sktlim@umich.edu    {
714094Sbinkertn@umich.edu        if (!ptr)
722934Sktlim@umich.edu            return;
733449Shsul@eecs.umich.edu
742934Sktlim@umich.edu        FSTranslatingPortProxy* proxy = tc->getVirtProxy();
752934Sktlim@umich.edu        proxy->readBlob(ptr, buffer, sizeof(T));
762934Sktlim@umich.edu    }
772934Sktlim@umich.edu
782934Sktlim@umich.edu    bool
793584Ssaidi@eecs.umich.edu    operator!() const
804486Sbinkertn@umich.edu    {
814486Sbinkertn@umich.edu        return ptr == 0;
824486Sbinkertn@umich.edu    }
834486Sbinkertn@umich.edu
844486Sbinkertn@umich.edu    VPtr<T>
854486Sbinkertn@umich.edu    operator+(int offset)
864486Sbinkertn@umich.edu    {
873584Ssaidi@eecs.umich.edu        return VPtr<T>(tc, ptr + offset);
883584Ssaidi@eecs.umich.edu    }
893584Ssaidi@eecs.umich.edu
903584Ssaidi@eecs.umich.edu    const VPtr<T> &
913584Ssaidi@eecs.umich.edu    operator+=(int offset)
923743Sgblack@eecs.umich.edu    {
933584Ssaidi@eecs.umich.edu        ptr += offset;
944972Ssaidi@eecs.umich.edu        refresh();
953743Sgblack@eecs.umich.edu
964104Ssaidi@eecs.umich.edu        return *this;
973743Sgblack@eecs.umich.edu    }
983823Ssaidi@eecs.umich.edu
993814Ssaidi@eecs.umich.edu    const VPtr<T> &
1003743Sgblack@eecs.umich.edu    operator=(Addr p)
1013743Sgblack@eecs.umich.edu    {
1023584Ssaidi@eecs.umich.edu        ptr = p;
1033814Ssaidi@eecs.umich.edu        refresh();
1043584Ssaidi@eecs.umich.edu
1053745Sgblack@eecs.umich.edu        return *this;
1063745Sgblack@eecs.umich.edu    }
1073745Sgblack@eecs.umich.edu
1083584Ssaidi@eecs.umich.edu    template <class U>
1093898Ssaidi@eecs.umich.edu    const VPtr<T> &
1103898Ssaidi@eecs.umich.edu    operator=(const VPtr<U> &vp)
1113898Ssaidi@eecs.umich.edu    {
1124103Ssaidi@eecs.umich.edu        tc = vp.tc;
1134103Ssaidi@eecs.umich.edu        ptr = vp.ptr;
1144103Ssaidi@eecs.umich.edu        refresh();
1153745Sgblack@eecs.umich.edu
1163745Sgblack@eecs.umich.edu        return *this;
1173745Sgblack@eecs.umich.edu    }
1183584Ssaidi@eecs.umich.edu
1193584Ssaidi@eecs.umich.edu    operator T *()
1203584Ssaidi@eecs.umich.edu    {
1215222Sksewell@umich.edu        return (T *)buffer;
1225222Sksewell@umich.edu    }
1235222Sksewell@umich.edu
1245222Sksewell@umich.edu    T *
1255222Sksewell@umich.edu    operator->()
1265222Sksewell@umich.edu    {
1275222Sksewell@umich.edu        return (T *)buffer;
1285222Sksewell@umich.edu    }
1295222Sksewell@umich.edu
1305222Sksewell@umich.edu    T &
1315222Sksewell@umich.edu    operator*()
1325222Sksewell@umich.edu    {
1335222Sksewell@umich.edu        return *(T *)buffer;
1345222Sksewell@umich.edu    }
1355222Sksewell@umich.edu};
1365222Sksewell@umich.edu
1375222Sksewell@umich.edu#endif // __ARCH_ALPHA_VPTR_HH__
1385222Sksewell@umich.edu