1712SN/A/*
21762SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan
3712SN/A * All rights reserved.
4712SN/A *
5712SN/A * Redistribution and use in source and binary forms, with or without
6712SN/A * modification, are permitted provided that the following conditions are
7712SN/A * met: redistributions of source code must retain the above copyright
8712SN/A * notice, this list of conditions and the following disclaimer;
9712SN/A * redistributions in binary form must reproduce the above copyright
10712SN/A * notice, this list of conditions and the following disclaimer in the
11712SN/A * documentation and/or other materials provided with the distribution;
12712SN/A * neither the name of the copyright holders nor the names of its
13712SN/A * contributors may be used to endorse or promote products derived from
14712SN/A * this software without specific prior written permission.
15712SN/A *
16712SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17712SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18712SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19712SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20712SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21712SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22712SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23712SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24712SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25712SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26712SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
282665Ssaidi@eecs.umich.edu * Authors: Nathan Binkert
29712SN/A */
30712SN/A
311354SN/A#ifndef __ARCH_ALPHA_VPTR_HH__
321354SN/A#define __ARCH_ALPHA_VPTR_HH__
33712SN/A
348706Sandreas.hansson@arm.com#include "mem/fs_translating_port_proxy.hh"
35712SN/A
362680Sktlim@umich.educlass ThreadContext;
37712SN/A
38712SN/Atemplate <class T>
39712SN/Aclass VPtr
40712SN/A{
41712SN/A  public:
42712SN/A    typedef T Type;
43712SN/A
445191Ssaidi@eecs.umich.edu  protected:
452680Sktlim@umich.edu    ThreadContext *tc;
46712SN/A    Addr ptr;
475191Ssaidi@eecs.umich.edu    Addr buffer[(sizeof(T)-1)/sizeof(Addr) + 1];
48712SN/A
49712SN/A  public:
505191Ssaidi@eecs.umich.edu    explicit VPtr(ThreadContext *_tc, Addr p = 0)
515191Ssaidi@eecs.umich.edu        : tc(_tc), ptr(p)
525191Ssaidi@eecs.umich.edu    {
535191Ssaidi@eecs.umich.edu        refresh();
545191Ssaidi@eecs.umich.edu    }
55712SN/A
56712SN/A    template <class U>
575191Ssaidi@eecs.umich.edu    VPtr(const VPtr<U> &vp)
585191Ssaidi@eecs.umich.edu        : tc(vp.tc), ptr(vp.ptr)
595191Ssaidi@eecs.umich.edu    {
605191Ssaidi@eecs.umich.edu        refresh();
615191Ssaidi@eecs.umich.edu    }
62712SN/A
635191Ssaidi@eecs.umich.edu    ~VPtr()
645191Ssaidi@eecs.umich.edu    {}
655191Ssaidi@eecs.umich.edu
665191Ssaidi@eecs.umich.edu    void
675191Ssaidi@eecs.umich.edu    refresh()
685191Ssaidi@eecs.umich.edu    {
695191Ssaidi@eecs.umich.edu        if (!ptr)
705191Ssaidi@eecs.umich.edu            return;
715191Ssaidi@eecs.umich.edu
7214020Sgabeblack@google.com        PortProxy &proxy = tc->getVirtProxy();
738852Sandreas.hansson@arm.com        proxy.readBlob(ptr, buffer, sizeof(T));
745191Ssaidi@eecs.umich.edu    }
755191Ssaidi@eecs.umich.edu
765191Ssaidi@eecs.umich.edu    bool
775191Ssaidi@eecs.umich.edu    operator!() const
78712SN/A    {
79712SN/A        return ptr == 0;
80712SN/A    }
81712SN/A
825191Ssaidi@eecs.umich.edu    VPtr<T>
835191Ssaidi@eecs.umich.edu    operator+(int offset)
84712SN/A    {
855191Ssaidi@eecs.umich.edu        return VPtr<T>(tc, ptr + offset);
86712SN/A    }
87712SN/A
885191Ssaidi@eecs.umich.edu    const VPtr<T> &
895191Ssaidi@eecs.umich.edu    operator+=(int offset)
90712SN/A    {
91712SN/A        ptr += offset;
925191Ssaidi@eecs.umich.edu        refresh();
93712SN/A
94712SN/A        return *this;
95712SN/A    }
96712SN/A
975191Ssaidi@eecs.umich.edu    const VPtr<T> &
985191Ssaidi@eecs.umich.edu    operator=(Addr p)
99712SN/A    {
100712SN/A        ptr = p;
1015191Ssaidi@eecs.umich.edu        refresh();
102712SN/A
103712SN/A        return *this;
104712SN/A    }
105712SN/A
106712SN/A    template <class U>
1075191Ssaidi@eecs.umich.edu    const VPtr<T> &
1085191Ssaidi@eecs.umich.edu    operator=(const VPtr<U> &vp)
109712SN/A    {
1105191Ssaidi@eecs.umich.edu        tc = vp.tc;
1115191Ssaidi@eecs.umich.edu        ptr = vp.ptr;
1125191Ssaidi@eecs.umich.edu        refresh();
113712SN/A
114712SN/A        return *this;
115712SN/A    }
116712SN/A
117712SN/A    operator T *()
118712SN/A    {
1195191Ssaidi@eecs.umich.edu        return (T *)buffer;
120712SN/A    }
121712SN/A
1225191Ssaidi@eecs.umich.edu    T *
1235191Ssaidi@eecs.umich.edu    operator->()
124712SN/A    {
1255191Ssaidi@eecs.umich.edu        return (T *)buffer;
126712SN/A    }
127712SN/A
1285191Ssaidi@eecs.umich.edu    T &
1295191Ssaidi@eecs.umich.edu    operator*()
130712SN/A    {
1315191Ssaidi@eecs.umich.edu        return *(T *)buffer;
132712SN/A    }
133712SN/A};
134712SN/A
1351354SN/A#endif // __ARCH_ALPHA_VPTR_HH__
136