vptr.hh revision 2680
12SN/A/* 21762SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan 32SN/A * All rights reserved. 42SN/A * 52SN/A * Redistribution and use in source and binary forms, with or without 62SN/A * modification, are permitted provided that the following conditions are 72SN/A * met: redistributions of source code must retain the above copyright 82SN/A * notice, this list of conditions and the following disclaimer; 92SN/A * redistributions in binary form must reproduce the above copyright 102SN/A * notice, this list of conditions and the following disclaimer in the 112SN/A * documentation and/or other materials provided with the distribution; 122SN/A * neither the name of the copyright holders nor the names of its 132SN/A * contributors may be used to endorse or promote products derived from 142SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665SN/A * 282665SN/A * Authors: Nathan Binkert 292SN/A */ 302SN/A 312SN/A#ifndef __ARCH_ALPHA_VPTR_HH__ 322SN/A#define __ARCH_ALPHA_VPTR_HH__ 336214Snate@binkert.org 342SN/A#include "arch/vtophys.hh" 352SN/A#include "arch/isa_traits.hh" 362SN/A 376214Snate@binkert.orgclass ThreadContext; 386214Snate@binkert.org 392SN/Atemplate <class T> 402SN/Aclass VPtr 412SN/A{ 429180Sandreas.hansson@arm.com public: 439180Sandreas.hansson@arm.com typedef T Type; 442SN/A 455543SN/A private: 462SN/A ThreadContext *tc; 475543SN/A Addr ptr; 482SN/A 492SN/A public: 502SN/A ThreadContext *GetTC() const { return tc; } 512SN/A Addr GetPointer() const { return ptr; } 522SN/A 532SN/A public: 542SN/A explicit VPtr(ThreadContext *_tc, Addr p = 0) : tc(_tc), ptr(p) { } 552SN/A template <class U> 569158Sandreas.hansson@arm.com VPtr(const VPtr<U> &vp) : tc(vp.GetTC()), ptr(vp.GetPointer()) {} 572SN/A ~VPtr() {} 589158Sandreas.hansson@arm.com 592SN/A bool operator!() const 609158Sandreas.hansson@arm.com { 612667SN/A return ptr == 0; 622130SN/A } 639180Sandreas.hansson@arm.com 649180Sandreas.hansson@arm.com VPtr<T> operator+(int offset) 659180Sandreas.hansson@arm.com { 669180Sandreas.hansson@arm.com VPtr<T> ptr(*this); 679180Sandreas.hansson@arm.com ptr += offset; 689180Sandreas.hansson@arm.com 699180Sandreas.hansson@arm.com return ptr; 709180Sandreas.hansson@arm.com } 719180Sandreas.hansson@arm.com 729180Sandreas.hansson@arm.com const VPtr<T> &operator+=(int offset) 739180Sandreas.hansson@arm.com { 749180Sandreas.hansson@arm.com ptr += offset; 759180Sandreas.hansson@arm.com assert((ptr & (TheISA::PageBytes - 1)) + sizeof(T) 769180Sandreas.hansson@arm.com < TheISA::PageBytes); 779180Sandreas.hansson@arm.com 789180Sandreas.hansson@arm.com return *this; 799180Sandreas.hansson@arm.com } 809180Sandreas.hansson@arm.com 819180Sandreas.hansson@arm.com const VPtr<T> &operator=(Addr p) 829180Sandreas.hansson@arm.com { 839180Sandreas.hansson@arm.com assert((p & (TheISA::PageBytes - 1)) + sizeof(T) 849180Sandreas.hansson@arm.com < TheISA::PageBytes); 859180Sandreas.hansson@arm.com ptr = p; 869180Sandreas.hansson@arm.com 879180Sandreas.hansson@arm.com return *this; 889180Sandreas.hansson@arm.com } 899180Sandreas.hansson@arm.com 909180Sandreas.hansson@arm.com template <class U> 919180Sandreas.hansson@arm.com const VPtr<T> &operator=(const VPtr<U> &vp) 929180Sandreas.hansson@arm.com { 939180Sandreas.hansson@arm.com tc = vp.GetTC(); 949180Sandreas.hansson@arm.com ptr = vp.GetPointer(); 959180Sandreas.hansson@arm.com 969180Sandreas.hansson@arm.com return *this; 979180Sandreas.hansson@arm.com } 989180Sandreas.hansson@arm.com 999180Sandreas.hansson@arm.com operator T *() 1009180Sandreas.hansson@arm.com { 1019180Sandreas.hansson@arm.com panic("Needs to be rewritten\n"); 1029180Sandreas.hansson@arm.com/* void *addr = vtomem(tc, ptr, sizeof(T)); 1039180Sandreas.hansson@arm.com return (T *)addr; 1049180Sandreas.hansson@arm.com */ 1059180Sandreas.hansson@arm.com } 1069180Sandreas.hansson@arm.com 1079180Sandreas.hansson@arm.com T *operator->() 1089180Sandreas.hansson@arm.com { 1099180Sandreas.hansson@arm.com panic("Needs to be rewritten\n"); 1109180Sandreas.hansson@arm.com/* void *addr = vtomem(tc, ptr, sizeof(T)); 1119180Sandreas.hansson@arm.com return (T *)addr; 1129180Sandreas.hansson@arm.com */ 1139180Sandreas.hansson@arm.com } 1149180Sandreas.hansson@arm.com 1159180Sandreas.hansson@arm.com T &operator*() 1169180Sandreas.hansson@arm.com { 1179180Sandreas.hansson@arm.com panic("Needs to be rewritten\n"); 1182130SN/A/* void *addr = vtomem(tc, ptr, sizeof(T)); 1192130SN/A return *(T *)addr; 1202130SN/A */ 1212130SN/A } 1222130SN/A}; 1232130SN/A 1242130SN/A#endif // __ARCH_ALPHA_VPTR_HH__ 1257720Sgblack@eecs.umich.edu