utility.hh revision 4172
12381SN/A/* 28853Sandreas.hansson@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 38711Sandreas.hansson@arm.com * All rights reserved. 48711Sandreas.hansson@arm.com * 58711Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 68711Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 78711Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 88711Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 98711Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 108711Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 118711Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 128711Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 138711Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 142381SN/A * this software without specific prior written permission. 152381SN/A * 162381SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172381SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182381SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192381SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202381SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212381SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222381SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232381SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242381SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252381SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262381SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272381SN/A * 282381SN/A * Authors: Nathan Binkert 292381SN/A * Steve Reinhardt 302381SN/A */ 312381SN/A 322381SN/A#ifndef __ARCH_ALPHA_UTILITY_HH__ 332381SN/A#define __ARCH_ALPHA_UTILITY_HH__ 342381SN/A 352381SN/A#include "config/full_system.hh" 362381SN/A#include "arch/alpha/types.hh" 372381SN/A#include "arch/alpha/isa_traits.hh" 382381SN/A#include "arch/alpha/regfile.hh" 392665Ssaidi@eecs.umich.edu#include "base/misc.hh" 402665Ssaidi@eecs.umich.edu#include "cpu/thread_context.hh" 418853Sandreas.hansson@arm.com 428922Swilliam.wang@arm.comnamespace AlphaISA 432381SN/A{ 442381SN/A 452381SN/A static inline bool 462381SN/A inUserMode(ThreadContext *tc) 478922Swilliam.wang@arm.com { 482381SN/A return (tc->readMiscRegNoEffect(AlphaISA::IPR_DTB_CM) & 0x18) != 0; 492381SN/A } 502381SN/A 512381SN/A static inline ExtMachInst 522381SN/A makeExtMI(MachInst inst, Addr pc) { 532381SN/A#if FULL_SYSTEM 542381SN/A ExtMachInst ext_inst = inst; 559235Sandreas.hansson@arm.com if (pc && 0x1) 562381SN/A return ext_inst|=(static_cast<ExtMachInst>(pc & 0x1) << 32); 572381SN/A else 588922Swilliam.wang@arm.com return ext_inst; 598922Swilliam.wang@arm.com#else 602407SN/A return ExtMachInst(inst); 612407SN/A#endif 622407SN/A } 632407SN/A 642407SN/A inline bool isCallerSaveIntegerRegister(unsigned int reg) { 659235Sandreas.hansson@arm.com panic("register classification not implemented"); 669235Sandreas.hansson@arm.com return (reg >= 1 && reg <= 8 || reg >= 22 && reg <= 25 || reg == 27); 679235Sandreas.hansson@arm.com } 682407SN/A 693401Sktlim@umich.edu inline bool isCalleeSaveIntegerRegister(unsigned int reg) { 703401Sktlim@umich.edu panic("register classification not implemented"); 712381SN/A return (reg >= 9 && reg <= 15); 728922Swilliam.wang@arm.com } 738922Swilliam.wang@arm.com 749087Sandreas.hansson@arm.com inline bool isCallerSaveFloatRegister(unsigned int reg) { 752381SN/A panic("register classification not implemented"); 768708Sandreas.hansson@arm.com return false; 772381SN/A } 788922Swilliam.wang@arm.com 798922Swilliam.wang@arm.com inline bool isCalleeSaveFloatRegister(unsigned int reg) { 808922Swilliam.wang@arm.com panic("register classification not implemented"); 818922Swilliam.wang@arm.com return false; 828922Swilliam.wang@arm.com } 838922Swilliam.wang@arm.com 845476Snate@binkert.org inline Addr alignAddress(const Addr &addr, 852640Sstever@eecs.umich.edu unsigned int nbytes) { 868965Sandreas.hansson@arm.com return (addr & ~(nbytes - 1)); 878965Sandreas.hansson@arm.com } 889031Sandreas.hansson@arm.com 898965Sandreas.hansson@arm.com // Instruction address compression hooks 909031Sandreas.hansson@arm.com inline Addr realPCToFetchPC(const Addr &addr) { 918965Sandreas.hansson@arm.com return addr; 928922Swilliam.wang@arm.com } 938922Swilliam.wang@arm.com 948922Swilliam.wang@arm.com inline Addr fetchPCToRealPC(const Addr &addr) { 958922Swilliam.wang@arm.com return addr; 968922Swilliam.wang@arm.com } 978922Swilliam.wang@arm.com 988922Swilliam.wang@arm.com // the size of "fetched" instructions (not necessarily the size 998922Swilliam.wang@arm.com // of real instructions for PISA) 1008965Sandreas.hansson@arm.com inline size_t fetchInstSize() { 1018922Swilliam.wang@arm.com return sizeof(MachInst); 1029031Sandreas.hansson@arm.com } 1038922Swilliam.wang@arm.com 1048922Swilliam.wang@arm.com inline MachInst makeRegisterCopy(int dest, int src) { 1058922Swilliam.wang@arm.com panic("makeRegisterCopy not implemented"); 1068922Swilliam.wang@arm.com return 0; 1078922Swilliam.wang@arm.com } 1083401Sktlim@umich.edu 1092381SN/A // Machine operations 1102640Sstever@eecs.umich.edu 1112640Sstever@eecs.umich.edu void saveMachineReg(AnyReg &savereg, const RegFile ®_file, 1128922Swilliam.wang@arm.com int regnum); 1134190Ssaidi@eecs.umich.edu 1148965Sandreas.hansson@arm.com void restoreMachineReg(RegFile ®s, const AnyReg ®, 1159031Sandreas.hansson@arm.com int regnum); 1168965Sandreas.hansson@arm.com 1178922Swilliam.wang@arm.com /** 1188922Swilliam.wang@arm.com * Function to insure ISA semantics about 0 registers. 1198922Swilliam.wang@arm.com * @param tc The thread context. 1209294Sandreas.hansson@arm.com */ 1219294Sandreas.hansson@arm.com template <class TC> 1229294Sandreas.hansson@arm.com void zeroRegisters(TC *tc); 1239294Sandreas.hansson@arm.com 1249294Sandreas.hansson@arm.com // Alpha IPR register accessors 1259294Sandreas.hansson@arm.com inline bool PcPAL(Addr addr) { return addr & 0x3; } 1269294Sandreas.hansson@arm.com#if FULL_SYSTEM 1279294Sandreas.hansson@arm.com 1289294Sandreas.hansson@arm.com //////////////////////////////////////////////////////////////////////// 1299294Sandreas.hansson@arm.com // 1309294Sandreas.hansson@arm.com // Translation stuff 1319294Sandreas.hansson@arm.com // 1329294Sandreas.hansson@arm.com 1339294Sandreas.hansson@arm.com inline Addr PteAddr(Addr a) { return (a & PteMask) << PteShift; } 1349294Sandreas.hansson@arm.com 1359294Sandreas.hansson@arm.com // User Virtual 1369294Sandreas.hansson@arm.com inline bool IsUSeg(Addr a) { return USegBase <= a && a <= USegEnd; } 1379294Sandreas.hansson@arm.com 1389294Sandreas.hansson@arm.com // Kernel Direct Mapped 1399294Sandreas.hansson@arm.com inline bool IsK0Seg(Addr a) { return K0SegBase <= a && a <= K0SegEnd; } 1409294Sandreas.hansson@arm.com inline Addr K0Seg2Phys(Addr addr) { return addr & ~K0SegBase; } 1419294Sandreas.hansson@arm.com 1429294Sandreas.hansson@arm.com // Kernel Virtual 1439294Sandreas.hansson@arm.com inline bool IsK1Seg(Addr a) { return K1SegBase <= a && a <= K1SegEnd; } 1449294Sandreas.hansson@arm.com 1459294Sandreas.hansson@arm.com inline Addr 1469294Sandreas.hansson@arm.com TruncPage(Addr addr) 1479294Sandreas.hansson@arm.com { return addr & ~(PageBytes - 1); } 1489294Sandreas.hansson@arm.com 1499294Sandreas.hansson@arm.com inline Addr 1509294Sandreas.hansson@arm.com RoundPage(Addr addr) 1519294Sandreas.hansson@arm.com { return (addr + PageBytes - 1) & ~(PageBytes - 1); } 1529294Sandreas.hansson@arm.com 1539294Sandreas.hansson@arm.com void initCPU(ThreadContext *tc, int cpuId); 1549294Sandreas.hansson@arm.com void initIPRs(ThreadContext *tc, int cpuId); 1559294Sandreas.hansson@arm.com 1569294Sandreas.hansson@arm.com /** 1579294Sandreas.hansson@arm.com * Function to check for and process any interrupts. 1589294Sandreas.hansson@arm.com * @param tc The thread context. 1599294Sandreas.hansson@arm.com */ 1609294Sandreas.hansson@arm.com template <class TC> 1619294Sandreas.hansson@arm.com void processInterrupts(TC *tc); 1629294Sandreas.hansson@arm.com#endif 1639294Sandreas.hansson@arm.com 1649294Sandreas.hansson@arm.com} // namespace AlphaISA 1659294Sandreas.hansson@arm.com 1669294Sandreas.hansson@arm.com#endif 1679294Sandreas.hansson@arm.com