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