ev5.cc revision 12406
114089Sodanrc@yahoo.com.br/* 214089Sodanrc@yahoo.com.br * Copyright (c) 2002-2005 The Regents of The University of Michigan 314089Sodanrc@yahoo.com.br * All rights reserved. 414089Sodanrc@yahoo.com.br * 514089Sodanrc@yahoo.com.br * Redistribution and use in source and binary forms, with or without 614089Sodanrc@yahoo.com.br * modification, are permitted provided that the following conditions are 714089Sodanrc@yahoo.com.br * met: redistributions of source code must retain the above copyright 814089Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer; 914089Sodanrc@yahoo.com.br * redistributions in binary form must reproduce the above copyright 1014089Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer in the 1114089Sodanrc@yahoo.com.br * documentation and/or other materials provided with the distribution; 1214089Sodanrc@yahoo.com.br * neither the name of the copyright holders nor the names of its 1314089Sodanrc@yahoo.com.br * contributors may be used to endorse or promote products derived from 1414089Sodanrc@yahoo.com.br * this software without specific prior written permission. 1514089Sodanrc@yahoo.com.br * 1614089Sodanrc@yahoo.com.br * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1714089Sodanrc@yahoo.com.br * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1814089Sodanrc@yahoo.com.br * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1914089Sodanrc@yahoo.com.br * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2014089Sodanrc@yahoo.com.br * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2114089Sodanrc@yahoo.com.br * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2214089Sodanrc@yahoo.com.br * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2314089Sodanrc@yahoo.com.br * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2414089Sodanrc@yahoo.com.br * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2514089Sodanrc@yahoo.com.br * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2614089Sodanrc@yahoo.com.br * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2714089Sodanrc@yahoo.com.br * 2814089Sodanrc@yahoo.com.br * Authors: Steve Reinhardt 2914089Sodanrc@yahoo.com.br * Nathan Binkert 3014089Sodanrc@yahoo.com.br */ 3114089Sodanrc@yahoo.com.br 3214089Sodanrc@yahoo.com.br#include "arch/alpha/faults.hh" 3314089Sodanrc@yahoo.com.br#include "arch/alpha/isa_traits.hh" 3414089Sodanrc@yahoo.com.br#include "arch/alpha/kernel_stats.hh" 3514089Sodanrc@yahoo.com.br#include "arch/alpha/osfpal.hh" 3614089Sodanrc@yahoo.com.br#include "arch/alpha/tlb.hh" 3714089Sodanrc@yahoo.com.br#include "base/cp_annotate.hh" 3814089Sodanrc@yahoo.com.br#include "base/debug.hh" 3914089Sodanrc@yahoo.com.br#include "cpu/base.hh" 4014089Sodanrc@yahoo.com.br#include "cpu/simple_thread.hh" 4114089Sodanrc@yahoo.com.br#include "cpu/thread_context.hh" 4214089Sodanrc@yahoo.com.br#include "sim/sim_exit.hh" 4314089Sodanrc@yahoo.com.br 4414089Sodanrc@yahoo.com.brnamespace AlphaISA { 4514089Sodanrc@yahoo.com.br 4614089Sodanrc@yahoo.com.brtemplate<typename T> 4714089Sodanrc@yahoo.com.brTLB * 4814089Sodanrc@yahoo.com.brgetITBPtr(T *tc) 4914089Sodanrc@yahoo.com.br{ 5014089Sodanrc@yahoo.com.br auto tlb = dynamic_cast<TLB *>(tc->getITBPtr()); 5114089Sodanrc@yahoo.com.br assert(tlb); 5214089Sodanrc@yahoo.com.br return tlb; 5314089Sodanrc@yahoo.com.br} 5414089Sodanrc@yahoo.com.br 5514089Sodanrc@yahoo.com.brtemplate<typename T> 5614089Sodanrc@yahoo.com.brTLB * 5714089Sodanrc@yahoo.com.brgetDTBPtr(T *tc) 5814089Sodanrc@yahoo.com.br{ 5914089Sodanrc@yahoo.com.br auto tlb = dynamic_cast<TLB *>(tc->getDTBPtr()); 6014089Sodanrc@yahoo.com.br assert(tlb); 6114089Sodanrc@yahoo.com.br return tlb; 6214089Sodanrc@yahoo.com.br} 6314089Sodanrc@yahoo.com.br 6414089Sodanrc@yahoo.com.br//////////////////////////////////////////////////////////////////////// 6514089Sodanrc@yahoo.com.br// 6614089Sodanrc@yahoo.com.br// Machine dependent functions 6714089Sodanrc@yahoo.com.br// 6814089Sodanrc@yahoo.com.brvoid 6914089Sodanrc@yahoo.com.brinitCPU(ThreadContext *tc, int cpuId) 7014089Sodanrc@yahoo.com.br{ 7114089Sodanrc@yahoo.com.br initIPRs(tc, cpuId); 7214089Sodanrc@yahoo.com.br 7314089Sodanrc@yahoo.com.br tc->setIntReg(16, cpuId); 7414089Sodanrc@yahoo.com.br tc->setIntReg(0, cpuId); 7514089Sodanrc@yahoo.com.br 7614089Sodanrc@yahoo.com.br AlphaFault *reset = new ResetFault; 7714089Sodanrc@yahoo.com.br 7814089Sodanrc@yahoo.com.br tc->pcState(tc->readMiscRegNoEffect(IPR_PAL_BASE) + reset->vect()); 7914089Sodanrc@yahoo.com.br 8014089Sodanrc@yahoo.com.br delete reset; 8114089Sodanrc@yahoo.com.br} 8214089Sodanrc@yahoo.com.br 8314089Sodanrc@yahoo.com.brtemplate <class CPU> 8414089Sodanrc@yahoo.com.brvoid 8514089Sodanrc@yahoo.com.brzeroRegisters(CPU *cpu) 8614089Sodanrc@yahoo.com.br{ 8714089Sodanrc@yahoo.com.br // Insure ISA semantics 8814089Sodanrc@yahoo.com.br // (no longer very clean due to the change in setIntReg() in the 8914089Sodanrc@yahoo.com.br // cpu model. Consider changing later.) 9014089Sodanrc@yahoo.com.br cpu->thread->setIntReg(ZeroReg, 0); 9114089Sodanrc@yahoo.com.br cpu->thread->setFloatReg(ZeroReg, 0.0); 9214089Sodanrc@yahoo.com.br} 9314089Sodanrc@yahoo.com.br 9414089Sodanrc@yahoo.com.br//////////////////////////////////////////////////////////////////////// 9514089Sodanrc@yahoo.com.br// 9614089Sodanrc@yahoo.com.br// 9714089Sodanrc@yahoo.com.br// 9814089Sodanrc@yahoo.com.brvoid 9914089Sodanrc@yahoo.com.brinitIPRs(ThreadContext *tc, int cpuId) 10014089Sodanrc@yahoo.com.br{ 10114089Sodanrc@yahoo.com.br for (int i = 0; i < NumInternalProcRegs; ++i) { 10214089Sodanrc@yahoo.com.br tc->setMiscRegNoEffect(i, 0); 10314089Sodanrc@yahoo.com.br } 10414089Sodanrc@yahoo.com.br 10514089Sodanrc@yahoo.com.br tc->setMiscRegNoEffect(IPR_PAL_BASE, PalBase); 10614089Sodanrc@yahoo.com.br tc->setMiscRegNoEffect(IPR_MCSR, 0x6); 10714089Sodanrc@yahoo.com.br tc->setMiscRegNoEffect(IPR_PALtemp16, cpuId); 10814089Sodanrc@yahoo.com.br} 10914089Sodanrc@yahoo.com.br 11014089Sodanrc@yahoo.com.brMiscReg 11114089Sodanrc@yahoo.com.brISA::readIpr(int idx, ThreadContext *tc) 11214089Sodanrc@yahoo.com.br{ 11314089Sodanrc@yahoo.com.br uint64_t retval = 0; // return value, default 0 11414089Sodanrc@yahoo.com.br 11514089Sodanrc@yahoo.com.br switch (idx) { 11614089Sodanrc@yahoo.com.br case IPR_PALtemp0: 11714089Sodanrc@yahoo.com.br case IPR_PALtemp1: 11814089Sodanrc@yahoo.com.br case IPR_PALtemp2: 11914089Sodanrc@yahoo.com.br case IPR_PALtemp3: 12014089Sodanrc@yahoo.com.br case IPR_PALtemp4: 12114089Sodanrc@yahoo.com.br case IPR_PALtemp5: 12214089Sodanrc@yahoo.com.br case IPR_PALtemp6: 12314089Sodanrc@yahoo.com.br case IPR_PALtemp7: 12414089Sodanrc@yahoo.com.br case IPR_PALtemp8: 12514089Sodanrc@yahoo.com.br case IPR_PALtemp9: 12614089Sodanrc@yahoo.com.br case IPR_PALtemp10: 12714089Sodanrc@yahoo.com.br case IPR_PALtemp11: 12814089Sodanrc@yahoo.com.br case IPR_PALtemp12: 12914089Sodanrc@yahoo.com.br case IPR_PALtemp13: 13014089Sodanrc@yahoo.com.br case IPR_PALtemp14: 13114089Sodanrc@yahoo.com.br case IPR_PALtemp15: 13214089Sodanrc@yahoo.com.br case IPR_PALtemp16: 13314089Sodanrc@yahoo.com.br case IPR_PALtemp17: 13414089Sodanrc@yahoo.com.br case IPR_PALtemp18: 13514089Sodanrc@yahoo.com.br case IPR_PALtemp19: 13614089Sodanrc@yahoo.com.br case IPR_PALtemp20: 13714089Sodanrc@yahoo.com.br case IPR_PALtemp21: 13814089Sodanrc@yahoo.com.br case IPR_PALtemp22: 13914089Sodanrc@yahoo.com.br case IPR_PALtemp23: 14014089Sodanrc@yahoo.com.br case IPR_PAL_BASE: 14114089Sodanrc@yahoo.com.br 14214089Sodanrc@yahoo.com.br case IPR_IVPTBR: 14314089Sodanrc@yahoo.com.br case IPR_DC_MODE: 14414089Sodanrc@yahoo.com.br case IPR_MAF_MODE: 14514089Sodanrc@yahoo.com.br case IPR_ISR: 14614089Sodanrc@yahoo.com.br case IPR_EXC_ADDR: 14714089Sodanrc@yahoo.com.br case IPR_IC_PERR_STAT: 14814089Sodanrc@yahoo.com.br case IPR_DC_PERR_STAT: 14914089Sodanrc@yahoo.com.br case IPR_MCSR: 15014089Sodanrc@yahoo.com.br case IPR_ASTRR: 15114089Sodanrc@yahoo.com.br case IPR_ASTER: 15214089Sodanrc@yahoo.com.br case IPR_SIRR: 15314089Sodanrc@yahoo.com.br case IPR_ICSR: 15414089Sodanrc@yahoo.com.br case IPR_ICM: 15514089Sodanrc@yahoo.com.br case IPR_DTB_CM: 15614089Sodanrc@yahoo.com.br case IPR_IPLR: 15714089Sodanrc@yahoo.com.br case IPR_INTID: 15814089Sodanrc@yahoo.com.br case IPR_PMCTR: 15914089Sodanrc@yahoo.com.br // no side-effect 16014089Sodanrc@yahoo.com.br retval = ipr[idx]; 16114089Sodanrc@yahoo.com.br break; 16214089Sodanrc@yahoo.com.br 16314089Sodanrc@yahoo.com.br case IPR_CC: 16414089Sodanrc@yahoo.com.br retval |= ipr[idx] & ULL(0xffffffff00000000); 16514089Sodanrc@yahoo.com.br retval |= tc->getCpuPtr()->curCycle() & ULL(0x00000000ffffffff); 16614089Sodanrc@yahoo.com.br break; 16714089Sodanrc@yahoo.com.br 16814089Sodanrc@yahoo.com.br case IPR_VA: 16914089Sodanrc@yahoo.com.br retval = ipr[idx]; 17014089Sodanrc@yahoo.com.br break; 17114089Sodanrc@yahoo.com.br 17214089Sodanrc@yahoo.com.br case IPR_VA_FORM: 17314089Sodanrc@yahoo.com.br case IPR_MM_STAT: 17414089Sodanrc@yahoo.com.br case IPR_IFAULT_VA_FORM: 17514089Sodanrc@yahoo.com.br case IPR_EXC_MASK: 17614089Sodanrc@yahoo.com.br case IPR_EXC_SUM: 17714089Sodanrc@yahoo.com.br retval = ipr[idx]; 17814089Sodanrc@yahoo.com.br break; 17914089Sodanrc@yahoo.com.br 18014089Sodanrc@yahoo.com.br case IPR_DTB_PTE: 18114089Sodanrc@yahoo.com.br { 18214089Sodanrc@yahoo.com.br TlbEntry &entry = getDTBPtr(tc)->index(1); 18314089Sodanrc@yahoo.com.br 18414089Sodanrc@yahoo.com.br retval |= ((uint64_t)entry.ppn & ULL(0x7ffffff)) << 32; 18514089Sodanrc@yahoo.com.br retval |= ((uint64_t)entry.xre & ULL(0xf)) << 8; 18614089Sodanrc@yahoo.com.br retval |= ((uint64_t)entry.xwe & ULL(0xf)) << 12; 18714089Sodanrc@yahoo.com.br retval |= ((uint64_t)entry.fonr & ULL(0x1)) << 1; 18814089Sodanrc@yahoo.com.br retval |= ((uint64_t)entry.fonw & ULL(0x1))<< 2; 18914089Sodanrc@yahoo.com.br retval |= ((uint64_t)entry.asma & ULL(0x1)) << 4; 19014089Sodanrc@yahoo.com.br retval |= ((uint64_t)entry.asn & ULL(0x7f)) << 57; 19114089Sodanrc@yahoo.com.br } 19214089Sodanrc@yahoo.com.br break; 19314089Sodanrc@yahoo.com.br 19414089Sodanrc@yahoo.com.br // write only registers 19514089Sodanrc@yahoo.com.br case IPR_HWINT_CLR: 19614089Sodanrc@yahoo.com.br case IPR_SL_XMIT: 19714089Sodanrc@yahoo.com.br case IPR_DC_FLUSH: 19814089Sodanrc@yahoo.com.br case IPR_IC_FLUSH: 19914089Sodanrc@yahoo.com.br case IPR_ALT_MODE: 20014089Sodanrc@yahoo.com.br case IPR_DTB_IA: 20114089Sodanrc@yahoo.com.br case IPR_DTB_IAP: 20214089Sodanrc@yahoo.com.br case IPR_ITB_IA: 20314089Sodanrc@yahoo.com.br case IPR_ITB_IAP: 20414089Sodanrc@yahoo.com.br panic("Tried to read write only register %d\n", idx); 20514089Sodanrc@yahoo.com.br break; 20614089Sodanrc@yahoo.com.br 20714089Sodanrc@yahoo.com.br default: 20814089Sodanrc@yahoo.com.br // invalid IPR 20914089Sodanrc@yahoo.com.br panic("Tried to read from invalid ipr %d\n", idx); 21014089Sodanrc@yahoo.com.br break; 21114089Sodanrc@yahoo.com.br } 21214089Sodanrc@yahoo.com.br 21314089Sodanrc@yahoo.com.br return retval; 21414089Sodanrc@yahoo.com.br} 21514089Sodanrc@yahoo.com.br 21614089Sodanrc@yahoo.com.br// Cause the simulator to break when changing to the following IPL 21714089Sodanrc@yahoo.com.brint break_ipl = -1; 21814089Sodanrc@yahoo.com.br 21914089Sodanrc@yahoo.com.brvoid 22014089Sodanrc@yahoo.com.brISA::setIpr(int idx, uint64_t val, ThreadContext *tc) 22114089Sodanrc@yahoo.com.br{ 22214089Sodanrc@yahoo.com.br switch (idx) { 22314089Sodanrc@yahoo.com.br case IPR_PALtemp0: 22414089Sodanrc@yahoo.com.br case IPR_PALtemp1: 22514089Sodanrc@yahoo.com.br case IPR_PALtemp2: 22614089Sodanrc@yahoo.com.br case IPR_PALtemp3: 22714089Sodanrc@yahoo.com.br case IPR_PALtemp4: 22814089Sodanrc@yahoo.com.br case IPR_PALtemp5: 22914089Sodanrc@yahoo.com.br case IPR_PALtemp6: 23014089Sodanrc@yahoo.com.br case IPR_PALtemp7: 23114089Sodanrc@yahoo.com.br case IPR_PALtemp8: 23214089Sodanrc@yahoo.com.br case IPR_PALtemp9: 23314089Sodanrc@yahoo.com.br case IPR_PALtemp10: 23414089Sodanrc@yahoo.com.br case IPR_PALtemp11: 23514089Sodanrc@yahoo.com.br case IPR_PALtemp12: 23614089Sodanrc@yahoo.com.br case IPR_PALtemp13: 23714089Sodanrc@yahoo.com.br case IPR_PALtemp14: 23814089Sodanrc@yahoo.com.br case IPR_PALtemp15: 23914089Sodanrc@yahoo.com.br case IPR_PALtemp16: 24014089Sodanrc@yahoo.com.br case IPR_PALtemp17: 24114089Sodanrc@yahoo.com.br case IPR_PALtemp18: 24214089Sodanrc@yahoo.com.br case IPR_PALtemp19: 24314089Sodanrc@yahoo.com.br case IPR_PALtemp20: 24414089Sodanrc@yahoo.com.br case IPR_PALtemp21: 24514089Sodanrc@yahoo.com.br case IPR_PALtemp22: 24614089Sodanrc@yahoo.com.br case IPR_PAL_BASE: 24714089Sodanrc@yahoo.com.br case IPR_IC_PERR_STAT: 24814089Sodanrc@yahoo.com.br case IPR_DC_PERR_STAT: 24914089Sodanrc@yahoo.com.br case IPR_PMCTR: 25014089Sodanrc@yahoo.com.br // write entire quad w/ no side-effect 25114089Sodanrc@yahoo.com.br ipr[idx] = val; 25214089Sodanrc@yahoo.com.br break; 25314089Sodanrc@yahoo.com.br 25414089Sodanrc@yahoo.com.br case IPR_CC_CTL: 25514089Sodanrc@yahoo.com.br // This IPR resets the cycle counter. We assume this only 25614089Sodanrc@yahoo.com.br // happens once... let's verify that. 25714089Sodanrc@yahoo.com.br assert(ipr[idx] == 0); 25814089Sodanrc@yahoo.com.br ipr[idx] = 1; 25914089Sodanrc@yahoo.com.br break; 26014089Sodanrc@yahoo.com.br 26114089Sodanrc@yahoo.com.br case IPR_CC: 26214089Sodanrc@yahoo.com.br // This IPR only writes the upper 64 bits. It's ok to write 26314089Sodanrc@yahoo.com.br // all 64 here since we mask out the lower 32 in rpcc (see 26414089Sodanrc@yahoo.com.br // isa_desc). 26514089Sodanrc@yahoo.com.br ipr[idx] = val; 26614089Sodanrc@yahoo.com.br break; 26714089Sodanrc@yahoo.com.br 26814089Sodanrc@yahoo.com.br case IPR_PALtemp23: 26914089Sodanrc@yahoo.com.br // write entire quad w/ no side-effect 27014089Sodanrc@yahoo.com.br if (tc->getKernelStats()) 27114089Sodanrc@yahoo.com.br tc->getKernelStats()->context(ipr[idx], val, tc); 27214089Sodanrc@yahoo.com.br ipr[idx] = val; 27314089Sodanrc@yahoo.com.br break; 27414089Sodanrc@yahoo.com.br 27514089Sodanrc@yahoo.com.br case IPR_DTB_PTE: 27614089Sodanrc@yahoo.com.br // write entire quad w/ no side-effect, tag is forthcoming 27714089Sodanrc@yahoo.com.br ipr[idx] = val; 27814089Sodanrc@yahoo.com.br break; 27914089Sodanrc@yahoo.com.br 28014089Sodanrc@yahoo.com.br case IPR_EXC_ADDR: 28114089Sodanrc@yahoo.com.br // second least significant bit in PC is always zero 28214089Sodanrc@yahoo.com.br ipr[idx] = val & ~2; 28314089Sodanrc@yahoo.com.br break; 28414089Sodanrc@yahoo.com.br 28514089Sodanrc@yahoo.com.br case IPR_ASTRR: 28614089Sodanrc@yahoo.com.br case IPR_ASTER: 28714089Sodanrc@yahoo.com.br // only write least significant four bits - privilege mask 28814089Sodanrc@yahoo.com.br ipr[idx] = val & 0xf; 28914089Sodanrc@yahoo.com.br break; 29014089Sodanrc@yahoo.com.br 29114089Sodanrc@yahoo.com.br case IPR_IPLR: 29214089Sodanrc@yahoo.com.br // only write least significant five bits - interrupt level 29314089Sodanrc@yahoo.com.br ipr[idx] = val & 0x1f; 29414089Sodanrc@yahoo.com.br if (tc->getKernelStats()) 29514089Sodanrc@yahoo.com.br tc->getKernelStats()->swpipl(ipr[idx]); 29614089Sodanrc@yahoo.com.br break; 29714089Sodanrc@yahoo.com.br 29814089Sodanrc@yahoo.com.br case IPR_DTB_CM: 29914089Sodanrc@yahoo.com.br if (val & 0x18) { 30014089Sodanrc@yahoo.com.br if (tc->getKernelStats()) 30114089Sodanrc@yahoo.com.br tc->getKernelStats()->mode(Kernel::user, tc); 30214089Sodanrc@yahoo.com.br } else { 30314089Sodanrc@yahoo.com.br if (tc->getKernelStats()) 30414089Sodanrc@yahoo.com.br tc->getKernelStats()->mode(Kernel::kernel, tc); 30514089Sodanrc@yahoo.com.br } 30614089Sodanrc@yahoo.com.br 30714089Sodanrc@yahoo.com.br case IPR_ICM: 30814089Sodanrc@yahoo.com.br // only write two mode bits - processor mode 30914089Sodanrc@yahoo.com.br ipr[idx] = val & 0x18; 31014089Sodanrc@yahoo.com.br break; 31114089Sodanrc@yahoo.com.br 31214089Sodanrc@yahoo.com.br case IPR_ALT_MODE: 31314089Sodanrc@yahoo.com.br // only write two mode bits - processor mode 31414089Sodanrc@yahoo.com.br ipr[idx] = val & 0x18; 31514089Sodanrc@yahoo.com.br break; 31614089Sodanrc@yahoo.com.br 31714089Sodanrc@yahoo.com.br case IPR_MCSR: 31814089Sodanrc@yahoo.com.br // more here after optimization... 31914089Sodanrc@yahoo.com.br ipr[idx] = val; 32014089Sodanrc@yahoo.com.br break; 32114089Sodanrc@yahoo.com.br 32214089Sodanrc@yahoo.com.br case IPR_SIRR: 32314089Sodanrc@yahoo.com.br // only write software interrupt mask 32414089Sodanrc@yahoo.com.br ipr[idx] = val & 0x7fff0; 32514089Sodanrc@yahoo.com.br break; 32614089Sodanrc@yahoo.com.br 32714089Sodanrc@yahoo.com.br case IPR_ICSR: 32814089Sodanrc@yahoo.com.br ipr[idx] = val & ULL(0xffffff0300); 32914089Sodanrc@yahoo.com.br break; 33014089Sodanrc@yahoo.com.br 33114089Sodanrc@yahoo.com.br case IPR_IVPTBR: 33214089Sodanrc@yahoo.com.br case IPR_MVPTBR: 33314089Sodanrc@yahoo.com.br ipr[idx] = val & ULL(0xffffffffc0000000); 33414089Sodanrc@yahoo.com.br break; 33514089Sodanrc@yahoo.com.br 33614089Sodanrc@yahoo.com.br case IPR_DC_TEST_CTL: 33714089Sodanrc@yahoo.com.br ipr[idx] = val & 0x1ffb; 33814089Sodanrc@yahoo.com.br break; 33914089Sodanrc@yahoo.com.br 34014089Sodanrc@yahoo.com.br case IPR_DC_MODE: 34114089Sodanrc@yahoo.com.br case IPR_MAF_MODE: 34214089Sodanrc@yahoo.com.br ipr[idx] = val & 0x3f; 34314089Sodanrc@yahoo.com.br break; 34414089Sodanrc@yahoo.com.br 34514089Sodanrc@yahoo.com.br case IPR_ITB_ASN: 34614089Sodanrc@yahoo.com.br ipr[idx] = val & 0x7f0; 34714089Sodanrc@yahoo.com.br break; 34814089Sodanrc@yahoo.com.br 34914089Sodanrc@yahoo.com.br case IPR_DTB_ASN: 35014089Sodanrc@yahoo.com.br ipr[idx] = val & ULL(0xfe00000000000000); 35114089Sodanrc@yahoo.com.br break; 35214089Sodanrc@yahoo.com.br 35314089Sodanrc@yahoo.com.br case IPR_EXC_SUM: 35414089Sodanrc@yahoo.com.br case IPR_EXC_MASK: 35514089Sodanrc@yahoo.com.br // any write to this register clears it 35614089Sodanrc@yahoo.com.br ipr[idx] = 0; 35714089Sodanrc@yahoo.com.br break; 35814089Sodanrc@yahoo.com.br 35914089Sodanrc@yahoo.com.br case IPR_INTID: 36014089Sodanrc@yahoo.com.br case IPR_SL_RCV: 36114089Sodanrc@yahoo.com.br case IPR_MM_STAT: 36214089Sodanrc@yahoo.com.br case IPR_ITB_PTE_TEMP: 36314089Sodanrc@yahoo.com.br case IPR_DTB_PTE_TEMP: 36414089Sodanrc@yahoo.com.br // read-only registers 36514089Sodanrc@yahoo.com.br panic("Tried to write read only ipr %d\n", idx); 36614089Sodanrc@yahoo.com.br 36714089Sodanrc@yahoo.com.br case IPR_HWINT_CLR: 36814089Sodanrc@yahoo.com.br case IPR_SL_XMIT: 36914089Sodanrc@yahoo.com.br case IPR_DC_FLUSH: 37014089Sodanrc@yahoo.com.br case IPR_IC_FLUSH: 37114089Sodanrc@yahoo.com.br // the following are write only 37214089Sodanrc@yahoo.com.br ipr[idx] = val; 37314089Sodanrc@yahoo.com.br break; 37414089Sodanrc@yahoo.com.br 37514089Sodanrc@yahoo.com.br case IPR_DTB_IA: 37614089Sodanrc@yahoo.com.br // really a control write 37714089Sodanrc@yahoo.com.br ipr[idx] = 0; 37814089Sodanrc@yahoo.com.br 37914089Sodanrc@yahoo.com.br getDTBPtr(tc)->flushAll(); 38014089Sodanrc@yahoo.com.br break; 38114089Sodanrc@yahoo.com.br 38214089Sodanrc@yahoo.com.br case IPR_DTB_IAP: 38314089Sodanrc@yahoo.com.br // really a control write 38414089Sodanrc@yahoo.com.br ipr[idx] = 0; 38514089Sodanrc@yahoo.com.br 38614089Sodanrc@yahoo.com.br getDTBPtr(tc)->flushProcesses(); 38714089Sodanrc@yahoo.com.br break; 38814089Sodanrc@yahoo.com.br 38914089Sodanrc@yahoo.com.br case IPR_DTB_IS: 39014089Sodanrc@yahoo.com.br // really a control write 39114089Sodanrc@yahoo.com.br ipr[idx] = val; 39214089Sodanrc@yahoo.com.br 39314089Sodanrc@yahoo.com.br getDTBPtr(tc)->flushAddr(val, DTB_ASN_ASN(ipr[IPR_DTB_ASN])); 39414089Sodanrc@yahoo.com.br break; 39514089Sodanrc@yahoo.com.br 39614089Sodanrc@yahoo.com.br case IPR_DTB_TAG: { 39714089Sodanrc@yahoo.com.br struct TlbEntry entry; 39814089Sodanrc@yahoo.com.br 39914089Sodanrc@yahoo.com.br // FIXME: granularity hints NYI... 40014089Sodanrc@yahoo.com.br if (DTB_PTE_GH(ipr[IPR_DTB_PTE]) != 0) 40114089Sodanrc@yahoo.com.br panic("PTE GH field != 0"); 40214089Sodanrc@yahoo.com.br 40314089Sodanrc@yahoo.com.br // write entire quad 40414089Sodanrc@yahoo.com.br ipr[idx] = val; 40514089Sodanrc@yahoo.com.br 40614089Sodanrc@yahoo.com.br // construct PTE for new entry 40714089Sodanrc@yahoo.com.br entry.ppn = DTB_PTE_PPN(ipr[IPR_DTB_PTE]); 40814089Sodanrc@yahoo.com.br entry.xre = DTB_PTE_XRE(ipr[IPR_DTB_PTE]); 40914089Sodanrc@yahoo.com.br entry.xwe = DTB_PTE_XWE(ipr[IPR_DTB_PTE]); 41014089Sodanrc@yahoo.com.br entry.fonr = DTB_PTE_FONR(ipr[IPR_DTB_PTE]); 41114089Sodanrc@yahoo.com.br entry.fonw = DTB_PTE_FONW(ipr[IPR_DTB_PTE]); 41214089Sodanrc@yahoo.com.br entry.asma = DTB_PTE_ASMA(ipr[IPR_DTB_PTE]); 41314089Sodanrc@yahoo.com.br entry.asn = DTB_ASN_ASN(ipr[IPR_DTB_ASN]); 41414089Sodanrc@yahoo.com.br 41514089Sodanrc@yahoo.com.br // insert new TAG/PTE value into data TLB 41614089Sodanrc@yahoo.com.br getDTBPtr(tc)->insert(val, entry); 41714089Sodanrc@yahoo.com.br } 41814089Sodanrc@yahoo.com.br break; 41914089Sodanrc@yahoo.com.br 42014089Sodanrc@yahoo.com.br case IPR_ITB_PTE: { 42114089Sodanrc@yahoo.com.br struct TlbEntry entry; 42214089Sodanrc@yahoo.com.br 42314089Sodanrc@yahoo.com.br // FIXME: granularity hints NYI... 42414089Sodanrc@yahoo.com.br if (ITB_PTE_GH(val) != 0) 42514089Sodanrc@yahoo.com.br panic("PTE GH field != 0"); 42614089Sodanrc@yahoo.com.br 42714089Sodanrc@yahoo.com.br // write entire quad 42814089Sodanrc@yahoo.com.br ipr[idx] = val; 42914089Sodanrc@yahoo.com.br 43014089Sodanrc@yahoo.com.br // construct PTE for new entry 43114089Sodanrc@yahoo.com.br entry.ppn = ITB_PTE_PPN(val); 43214089Sodanrc@yahoo.com.br entry.xre = ITB_PTE_XRE(val); 43314089Sodanrc@yahoo.com.br entry.xwe = 0; 43414089Sodanrc@yahoo.com.br entry.fonr = ITB_PTE_FONR(val); 43514089Sodanrc@yahoo.com.br entry.fonw = ITB_PTE_FONW(val); 43614089Sodanrc@yahoo.com.br entry.asma = ITB_PTE_ASMA(val); 43714089Sodanrc@yahoo.com.br entry.asn = ITB_ASN_ASN(ipr[IPR_ITB_ASN]); 43814089Sodanrc@yahoo.com.br 43914089Sodanrc@yahoo.com.br // insert new TAG/PTE value into data TLB 44014089Sodanrc@yahoo.com.br getITBPtr(tc)->insert(ipr[IPR_ITB_TAG], entry); 44114089Sodanrc@yahoo.com.br } 44214089Sodanrc@yahoo.com.br break; 44314089Sodanrc@yahoo.com.br 44414089Sodanrc@yahoo.com.br case IPR_ITB_IA: 44514089Sodanrc@yahoo.com.br // really a control write 44614089Sodanrc@yahoo.com.br ipr[idx] = 0; 44714089Sodanrc@yahoo.com.br 44814089Sodanrc@yahoo.com.br getITBPtr(tc)->flushAll(); 44914089Sodanrc@yahoo.com.br break; 45014089Sodanrc@yahoo.com.br 45114089Sodanrc@yahoo.com.br case IPR_ITB_IAP: 45214089Sodanrc@yahoo.com.br // really a control write 45314089Sodanrc@yahoo.com.br ipr[idx] = 0; 45414089Sodanrc@yahoo.com.br 45514089Sodanrc@yahoo.com.br getITBPtr(tc)->flushProcesses(); 45614089Sodanrc@yahoo.com.br break; 45714089Sodanrc@yahoo.com.br 45814089Sodanrc@yahoo.com.br case IPR_ITB_IS: 45914089Sodanrc@yahoo.com.br // really a control write 46014089Sodanrc@yahoo.com.br ipr[idx] = val; 46114089Sodanrc@yahoo.com.br 46214089Sodanrc@yahoo.com.br getITBPtr(tc)->flushAddr(val, ITB_ASN_ASN(ipr[IPR_ITB_ASN])); 46314089Sodanrc@yahoo.com.br break; 46414089Sodanrc@yahoo.com.br 46514089Sodanrc@yahoo.com.br default: 46614089Sodanrc@yahoo.com.br // invalid IPR 46714089Sodanrc@yahoo.com.br panic("Tried to write to invalid ipr %d\n", idx); 46814089Sodanrc@yahoo.com.br } 46914089Sodanrc@yahoo.com.br 47014089Sodanrc@yahoo.com.br // no error... 47114089Sodanrc@yahoo.com.br} 47214089Sodanrc@yahoo.com.br 47314089Sodanrc@yahoo.com.brvoid 47414089Sodanrc@yahoo.com.brcopyIprs(ThreadContext *src, ThreadContext *dest) 47514089Sodanrc@yahoo.com.br{ 47614089Sodanrc@yahoo.com.br for (int i = 0; i < NumInternalProcRegs; ++i) 47714089Sodanrc@yahoo.com.br dest->setMiscRegNoEffect(i, src->readMiscRegNoEffect(i)); 47814089Sodanrc@yahoo.com.br} 47914089Sodanrc@yahoo.com.br 48014089Sodanrc@yahoo.com.br} // namespace AlphaISA 48114089Sodanrc@yahoo.com.br 48214089Sodanrc@yahoo.com.brusing namespace AlphaISA; 48314089Sodanrc@yahoo.com.br 48414089Sodanrc@yahoo.com.brFault 48514089Sodanrc@yahoo.com.brSimpleThread::hwrei() 48614089Sodanrc@yahoo.com.br{ 48714089Sodanrc@yahoo.com.br PCState pc = pcState(); 48814089Sodanrc@yahoo.com.br if (!(pc.pc() & 0x3)) 48914089Sodanrc@yahoo.com.br return std::make_shared<UnimplementedOpcodeFault>(); 49014089Sodanrc@yahoo.com.br 49114089Sodanrc@yahoo.com.br pc.npc(readMiscRegNoEffect(IPR_EXC_ADDR)); 49214089Sodanrc@yahoo.com.br pcState(pc); 49314089Sodanrc@yahoo.com.br 49414089Sodanrc@yahoo.com.br CPA::cpa()->swAutoBegin(tc, pc.npc()); 49514089Sodanrc@yahoo.com.br 49614089Sodanrc@yahoo.com.br if (kernelStats) 49714089Sodanrc@yahoo.com.br kernelStats->hwrei(); 49814089Sodanrc@yahoo.com.br 49914089Sodanrc@yahoo.com.br // FIXME: XXX check for interrupts? XXX 50014089Sodanrc@yahoo.com.br return NoFault; 50114089Sodanrc@yahoo.com.br} 50214089Sodanrc@yahoo.com.br 50314089Sodanrc@yahoo.com.br/** 50414089Sodanrc@yahoo.com.br * Check for special simulator handling of specific PAL calls. 50514089Sodanrc@yahoo.com.br * If return value is false, actual PAL call will be suppressed. 50614089Sodanrc@yahoo.com.br */ 50714089Sodanrc@yahoo.com.brbool 50814089Sodanrc@yahoo.com.brSimpleThread::simPalCheck(int palFunc) 50914089Sodanrc@yahoo.com.br{ 51014089Sodanrc@yahoo.com.br if (kernelStats) 51114089Sodanrc@yahoo.com.br kernelStats->callpal(palFunc, tc); 51214089Sodanrc@yahoo.com.br 51314089Sodanrc@yahoo.com.br switch (palFunc) { 51414089Sodanrc@yahoo.com.br case PAL::halt: 51514089Sodanrc@yahoo.com.br halt(); 51614089Sodanrc@yahoo.com.br if (--System::numSystemsRunning == 0) 51714089Sodanrc@yahoo.com.br exitSimLoop("all cpus halted"); 51814089Sodanrc@yahoo.com.br break; 51914089Sodanrc@yahoo.com.br 52014089Sodanrc@yahoo.com.br case PAL::bpt: 52114089Sodanrc@yahoo.com.br case PAL::bugchk: 52214089Sodanrc@yahoo.com.br if (system->breakpoint()) 52314089Sodanrc@yahoo.com.br return false; 52414089Sodanrc@yahoo.com.br break; 52514089Sodanrc@yahoo.com.br } 52614089Sodanrc@yahoo.com.br 52714089Sodanrc@yahoo.com.br return true; 52814089Sodanrc@yahoo.com.br} 52914089Sodanrc@yahoo.com.br