vptr.hh revision 8706
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
348229Snate@binkert.org#include "arch/isa_traits.hh"
352170SN/A#include "arch/vtophys.hh"
368706Sandreas.hansson@arm.com#include "mem/fs_translating_port_proxy.hh"
37712SN/A
382680Sktlim@umich.educlass ThreadContext;
39712SN/A
40712SN/Atemplate <class T>
41712SN/Aclass VPtr
42712SN/A{
43712SN/A  public:
44712SN/A    typedef T Type;
45712SN/A
465191Ssaidi@eecs.umich.edu  protected:
472680Sktlim@umich.edu    ThreadContext *tc;
48712SN/A    Addr ptr;
495191Ssaidi@eecs.umich.edu    Addr buffer[(sizeof(T)-1)/sizeof(Addr) + 1];
50712SN/A
51712SN/A  public:
525191Ssaidi@eecs.umich.edu    explicit VPtr(ThreadContext *_tc, Addr p = 0)
535191Ssaidi@eecs.umich.edu        : tc(_tc), ptr(p)
545191Ssaidi@eecs.umich.edu    {
555191Ssaidi@eecs.umich.edu        refresh();
565191Ssaidi@eecs.umich.edu    }
57712SN/A
58712SN/A    template <class U>
595191Ssaidi@eecs.umich.edu    VPtr(const VPtr<U> &vp)
605191Ssaidi@eecs.umich.edu        : tc(vp.tc), ptr(vp.ptr)
615191Ssaidi@eecs.umich.edu    {
625191Ssaidi@eecs.umich.edu        refresh();
635191Ssaidi@eecs.umich.edu    }
64712SN/A
655191Ssaidi@eecs.umich.edu    ~VPtr()
665191Ssaidi@eecs.umich.edu    {}
675191Ssaidi@eecs.umich.edu
685191Ssaidi@eecs.umich.edu    void
695191Ssaidi@eecs.umich.edu    refresh()
705191Ssaidi@eecs.umich.edu    {
715191Ssaidi@eecs.umich.edu        if (!ptr)
725191Ssaidi@eecs.umich.edu            return;
735191Ssaidi@eecs.umich.edu
748706Sandreas.hansson@arm.com        FSTranslatingPortProxy* proxy = tc->getVirtProxy();
758706Sandreas.hansson@arm.com        proxy->readBlob(ptr, buffer, sizeof(T));
765191Ssaidi@eecs.umich.edu    }
775191Ssaidi@eecs.umich.edu
785191Ssaidi@eecs.umich.edu    bool
795191Ssaidi@eecs.umich.edu    operator!() const
80712SN/A    {
81712SN/A        return ptr == 0;
82712SN/A    }
83712SN/A
845191Ssaidi@eecs.umich.edu    VPtr<T>
855191Ssaidi@eecs.umich.edu    operator+(int offset)
86712SN/A    {
875191Ssaidi@eecs.umich.edu        return VPtr<T>(tc, ptr + offset);
88712SN/A    }
89712SN/A
905191Ssaidi@eecs.umich.edu    const VPtr<T> &
915191Ssaidi@eecs.umich.edu    operator+=(int offset)
92712SN/A    {
93712SN/A        ptr += offset;
945191Ssaidi@eecs.umich.edu        refresh();
95712SN/A
96712SN/A        return *this;
97712SN/A    }
98712SN/A
995191Ssaidi@eecs.umich.edu    const VPtr<T> &
1005191Ssaidi@eecs.umich.edu    operator=(Addr p)
101712SN/A    {
102712SN/A        ptr = p;
1035191Ssaidi@eecs.umich.edu        refresh();
104712SN/A
105712SN/A        return *this;
106712SN/A    }
107712SN/A
108712SN/A    template <class U>
1095191Ssaidi@eecs.umich.edu    const VPtr<T> &
1105191Ssaidi@eecs.umich.edu    operator=(const VPtr<U> &vp)
111712SN/A    {
1125191Ssaidi@eecs.umich.edu        tc = vp.tc;
1135191Ssaidi@eecs.umich.edu        ptr = vp.ptr;
1145191Ssaidi@eecs.umich.edu        refresh();
115712SN/A
116712SN/A        return *this;
117712SN/A    }
118712SN/A
119712SN/A    operator T *()
120712SN/A    {
1215191Ssaidi@eecs.umich.edu        return (T *)buffer;
122712SN/A    }
123712SN/A
1245191Ssaidi@eecs.umich.edu    T *
1255191Ssaidi@eecs.umich.edu    operator->()
126712SN/A    {
1275191Ssaidi@eecs.umich.edu        return (T *)buffer;
128712SN/A    }
129712SN/A
1305191Ssaidi@eecs.umich.edu    T &
1315191Ssaidi@eecs.umich.edu    operator*()
132712SN/A    {
1335191Ssaidi@eecs.umich.edu        return *(T *)buffer;
134712SN/A    }
135712SN/A};
136712SN/A
1371354SN/A#endif // __ARCH_ALPHA_VPTR_HH__
138