ev5.cc revision 2670:9107b8bd08cd
112027Sjungma@eit.uni-kl.de/* 212027Sjungma@eit.uni-kl.de * Copyright (c) 2002-2005 The Regents of The University of Michigan 312027Sjungma@eit.uni-kl.de * All rights reserved. 412027Sjungma@eit.uni-kl.de * 512027Sjungma@eit.uni-kl.de * Redistribution and use in source and binary forms, with or without 612027Sjungma@eit.uni-kl.de * modification, are permitted provided that the following conditions are 712027Sjungma@eit.uni-kl.de * met: redistributions of source code must retain the above copyright 812027Sjungma@eit.uni-kl.de * notice, this list of conditions and the following disclaimer; 912027Sjungma@eit.uni-kl.de * redistributions in binary form must reproduce the above copyright 1012027Sjungma@eit.uni-kl.de * notice, this list of conditions and the following disclaimer in the 1112027Sjungma@eit.uni-kl.de * documentation and/or other materials provided with the distribution; 1212027Sjungma@eit.uni-kl.de * neither the name of the copyright holders nor the names of its 1312027Sjungma@eit.uni-kl.de * contributors may be used to endorse or promote products derived from 1412027Sjungma@eit.uni-kl.de * this software without specific prior written permission. 1512027Sjungma@eit.uni-kl.de * 1612027Sjungma@eit.uni-kl.de * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712027Sjungma@eit.uni-kl.de * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812027Sjungma@eit.uni-kl.de * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912027Sjungma@eit.uni-kl.de * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012027Sjungma@eit.uni-kl.de * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112027Sjungma@eit.uni-kl.de * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212027Sjungma@eit.uni-kl.de * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312027Sjungma@eit.uni-kl.de * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412027Sjungma@eit.uni-kl.de * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512027Sjungma@eit.uni-kl.de * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612027Sjungma@eit.uni-kl.de * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712027Sjungma@eit.uni-kl.de * 2812027Sjungma@eit.uni-kl.de * Authors: Steve Reinhardt 2912027Sjungma@eit.uni-kl.de * Nathan Binkert 3012027Sjungma@eit.uni-kl.de */ 3112027Sjungma@eit.uni-kl.de 3212027Sjungma@eit.uni-kl.de#include "arch/alpha/tlb.hh" 3312027Sjungma@eit.uni-kl.de#include "arch/alpha/isa_traits.hh" 3412027Sjungma@eit.uni-kl.de#include "arch/alpha/osfpal.hh" 3512027Sjungma@eit.uni-kl.de#include "base/kgdb.h" 3612027Sjungma@eit.uni-kl.de#include "base/remote_gdb.hh" 3712027Sjungma@eit.uni-kl.de#include "base/stats/events.hh" 3812027Sjungma@eit.uni-kl.de#include "config/full_system.hh" 3912027Sjungma@eit.uni-kl.de#include "cpu/base.hh" 4012027Sjungma@eit.uni-kl.de#include "cpu/cpu_exec_context.hh" 4112027Sjungma@eit.uni-kl.de#include "cpu/exec_context.hh" 4212027Sjungma@eit.uni-kl.de#include "kern/kernel_stats.hh" 4312027Sjungma@eit.uni-kl.de#include "sim/debug.hh" 4412027Sjungma@eit.uni-kl.de#include "sim/sim_events.hh" 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.de#if FULL_SYSTEM 4712027Sjungma@eit.uni-kl.de 4812027Sjungma@eit.uni-kl.deusing namespace EV5; 4912027Sjungma@eit.uni-kl.de 5012027Sjungma@eit.uni-kl.de//////////////////////////////////////////////////////////////////////// 5112027Sjungma@eit.uni-kl.de// 5212027Sjungma@eit.uni-kl.de// Machine dependent functions 5312027Sjungma@eit.uni-kl.de// 5412027Sjungma@eit.uni-kl.devoid 5512027Sjungma@eit.uni-kl.deAlphaISA::initCPU(ExecContext *xc, int cpuId) 5612027Sjungma@eit.uni-kl.de{ 5712027Sjungma@eit.uni-kl.de initIPRs(xc, cpuId); 5812027Sjungma@eit.uni-kl.de 5912027Sjungma@eit.uni-kl.de xc->setIntReg(16, cpuId); 6012027Sjungma@eit.uni-kl.de xc->setIntReg(0, cpuId); 6112027Sjungma@eit.uni-kl.de 6212027Sjungma@eit.uni-kl.de xc->setPC(xc->readMiscReg(IPR_PAL_BASE) + (new ResetFault)->vect()); 6312027Sjungma@eit.uni-kl.de xc->setNextPC(xc->readPC() + sizeof(MachInst)); 6412027Sjungma@eit.uni-kl.de} 6512027Sjungma@eit.uni-kl.de 6612027Sjungma@eit.uni-kl.de//////////////////////////////////////////////////////////////////////// 6712027Sjungma@eit.uni-kl.de// 6812027Sjungma@eit.uni-kl.de// 6912027Sjungma@eit.uni-kl.de// 7012027Sjungma@eit.uni-kl.devoid 7112027Sjungma@eit.uni-kl.deAlphaISA::initIPRs(ExecContext *xc, int cpuId) 7212027Sjungma@eit.uni-kl.de{ 7312027Sjungma@eit.uni-kl.de for (int i = 0; i < NumInternalProcRegs; ++i) { 7412027Sjungma@eit.uni-kl.de xc->setMiscReg(i, 0); 7512027Sjungma@eit.uni-kl.de } 7612027Sjungma@eit.uni-kl.de 7712027Sjungma@eit.uni-kl.de xc->setMiscReg(IPR_PAL_BASE, PalBase); 7812027Sjungma@eit.uni-kl.de xc->setMiscReg(IPR_MCSR, 0x6); 7912027Sjungma@eit.uni-kl.de xc->setMiscReg(IPR_PALtemp16, cpuId); 8012027Sjungma@eit.uni-kl.de} 8112027Sjungma@eit.uni-kl.de 8212027Sjungma@eit.uni-kl.de 8312027Sjungma@eit.uni-kl.detemplate <class CPU> 8412027Sjungma@eit.uni-kl.devoid 8512027Sjungma@eit.uni-kl.deAlphaISA::processInterrupts(CPU *cpu) 8612027Sjungma@eit.uni-kl.de{ 8712027Sjungma@eit.uni-kl.de //Check if there are any outstanding interrupts 8812027Sjungma@eit.uni-kl.de //Handle the interrupts 8912027Sjungma@eit.uni-kl.de int ipl = 0; 9012027Sjungma@eit.uni-kl.de int summary = 0; 9112027Sjungma@eit.uni-kl.de 9212027Sjungma@eit.uni-kl.de cpu->checkInterrupts = false; 9312027Sjungma@eit.uni-kl.de 9412027Sjungma@eit.uni-kl.de if (cpu->readMiscReg(IPR_ASTRR)) 9512027Sjungma@eit.uni-kl.de panic("asynchronous traps not implemented\n"); 9612027Sjungma@eit.uni-kl.de 9712027Sjungma@eit.uni-kl.de if (cpu->readMiscReg(IPR_SIRR)) { 9812027Sjungma@eit.uni-kl.de for (int i = INTLEVEL_SOFTWARE_MIN; 9912027Sjungma@eit.uni-kl.de i < INTLEVEL_SOFTWARE_MAX; i++) { 10012027Sjungma@eit.uni-kl.de if (cpu->readMiscReg(IPR_SIRR) & (ULL(1) << i)) { 10112027Sjungma@eit.uni-kl.de // See table 4-19 of the 21164 hardware reference 10212027Sjungma@eit.uni-kl.de ipl = (i - INTLEVEL_SOFTWARE_MIN) + 1; 10312027Sjungma@eit.uni-kl.de summary |= (ULL(1) << i); 10412027Sjungma@eit.uni-kl.de } 10512027Sjungma@eit.uni-kl.de } 10612027Sjungma@eit.uni-kl.de } 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.de uint64_t interrupts = cpu->intr_status(); 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de if (interrupts) { 11112027Sjungma@eit.uni-kl.de for (int i = INTLEVEL_EXTERNAL_MIN; 11212027Sjungma@eit.uni-kl.de i < INTLEVEL_EXTERNAL_MAX; i++) { 11312027Sjungma@eit.uni-kl.de if (interrupts & (ULL(1) << i)) { 11412027Sjungma@eit.uni-kl.de // See table 4-19 of the 21164 hardware reference 11512027Sjungma@eit.uni-kl.de ipl = i; 11612027Sjungma@eit.uni-kl.de summary |= (ULL(1) << i); 11712027Sjungma@eit.uni-kl.de } 11812027Sjungma@eit.uni-kl.de } 11912027Sjungma@eit.uni-kl.de } 12012027Sjungma@eit.uni-kl.de 12112027Sjungma@eit.uni-kl.de if (ipl && ipl > cpu->readMiscReg(IPR_IPLR)) { 12212027Sjungma@eit.uni-kl.de cpu->setMiscReg(IPR_ISR, summary); 12312027Sjungma@eit.uni-kl.de cpu->setMiscReg(IPR_INTID, ipl); 12412027Sjungma@eit.uni-kl.de cpu->trap(new InterruptFault); 12512027Sjungma@eit.uni-kl.de DPRINTF(Flow, "Interrupt! IPLR=%d ipl=%d summary=%x\n", 12612027Sjungma@eit.uni-kl.de cpu->readMiscReg(IPR_IPLR), ipl, summary); 12712027Sjungma@eit.uni-kl.de } 12812027Sjungma@eit.uni-kl.de 12912027Sjungma@eit.uni-kl.de} 13012027Sjungma@eit.uni-kl.de 13112027Sjungma@eit.uni-kl.detemplate <class CPU> 13212027Sjungma@eit.uni-kl.devoid 13312027Sjungma@eit.uni-kl.deAlphaISA::zeroRegisters(CPU *cpu) 13412027Sjungma@eit.uni-kl.de{ 13512027Sjungma@eit.uni-kl.de // Insure ISA semantics 13612027Sjungma@eit.uni-kl.de // (no longer very clean due to the change in setIntReg() in the 13712027Sjungma@eit.uni-kl.de // cpu model. Consider changing later.) 13812027Sjungma@eit.uni-kl.de cpu->cpuXC->setIntReg(ZeroReg, 0); 13912027Sjungma@eit.uni-kl.de cpu->cpuXC->setFloatReg(ZeroReg, 0.0); 14012027Sjungma@eit.uni-kl.de} 14112027Sjungma@eit.uni-kl.de 14212027Sjungma@eit.uni-kl.deFault 14312027Sjungma@eit.uni-kl.deCPUExecContext::hwrei() 14412027Sjungma@eit.uni-kl.de{ 14512027Sjungma@eit.uni-kl.de if (!inPalMode()) 14612027Sjungma@eit.uni-kl.de return new UnimplementedOpcodeFault; 14712027Sjungma@eit.uni-kl.de 14812027Sjungma@eit.uni-kl.de setNextPC(readMiscReg(AlphaISA::IPR_EXC_ADDR)); 14912027Sjungma@eit.uni-kl.de 15012027Sjungma@eit.uni-kl.de if (!misspeculating()) { 15112027Sjungma@eit.uni-kl.de if (kernelStats) 15212027Sjungma@eit.uni-kl.de kernelStats->hwrei(); 15312027Sjungma@eit.uni-kl.de 15412027Sjungma@eit.uni-kl.de cpu->checkInterrupts = true; 15512027Sjungma@eit.uni-kl.de } 15612027Sjungma@eit.uni-kl.de 15712027Sjungma@eit.uni-kl.de // FIXME: XXX check for interrupts? XXX 15812027Sjungma@eit.uni-kl.de return NoFault; 15912027Sjungma@eit.uni-kl.de} 16012027Sjungma@eit.uni-kl.de 16112027Sjungma@eit.uni-kl.deint 16212027Sjungma@eit.uni-kl.deAlphaISA::MiscRegFile::getInstAsid() 16312027Sjungma@eit.uni-kl.de{ 16412027Sjungma@eit.uni-kl.de return EV5::ITB_ASN_ASN(ipr[IPR_ITB_ASN]); 16512027Sjungma@eit.uni-kl.de} 16612027Sjungma@eit.uni-kl.de 16712027Sjungma@eit.uni-kl.deint 16812027Sjungma@eit.uni-kl.deAlphaISA::MiscRegFile::getDataAsid() 16912027Sjungma@eit.uni-kl.de{ 17012027Sjungma@eit.uni-kl.de return EV5::DTB_ASN_ASN(ipr[IPR_DTB_ASN]); 17112027Sjungma@eit.uni-kl.de} 17212027Sjungma@eit.uni-kl.de 17312027Sjungma@eit.uni-kl.deAlphaISA::MiscReg 17412027Sjungma@eit.uni-kl.deAlphaISA::MiscRegFile::readIpr(int idx, Fault &fault, ExecContext *xc) 17512027Sjungma@eit.uni-kl.de{ 17612027Sjungma@eit.uni-kl.de uint64_t retval = 0; // return value, default 0 17712027Sjungma@eit.uni-kl.de 17812027Sjungma@eit.uni-kl.de switch (idx) { 17912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp0: 18012027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp1: 18112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp2: 18212027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp3: 18312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp4: 18412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp5: 18512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp6: 18612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp7: 18712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp8: 18812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp9: 18912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp10: 19012027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp11: 19112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp12: 19212027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp13: 19312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp14: 19412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp15: 19512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp16: 19612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp17: 19712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp18: 19812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp19: 19912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp20: 20012027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp21: 20112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp22: 20212027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp23: 20312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PAL_BASE: 20412027Sjungma@eit.uni-kl.de 20512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_IVPTBR: 20612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DC_MODE: 20712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_MAF_MODE: 20812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ISR: 20912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_EXC_ADDR: 21012027Sjungma@eit.uni-kl.de case AlphaISA::IPR_IC_PERR_STAT: 21112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DC_PERR_STAT: 21212027Sjungma@eit.uni-kl.de case AlphaISA::IPR_MCSR: 21312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ASTRR: 21412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ASTER: 21512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_SIRR: 21612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ICSR: 21712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ICM: 21812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DTB_CM: 21912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_IPLR: 22012027Sjungma@eit.uni-kl.de case AlphaISA::IPR_INTID: 22112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PMCTR: 22212027Sjungma@eit.uni-kl.de // no side-effect 22312027Sjungma@eit.uni-kl.de retval = ipr[idx]; 22412027Sjungma@eit.uni-kl.de break; 22512027Sjungma@eit.uni-kl.de 22612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_CC: 22712027Sjungma@eit.uni-kl.de retval |= ipr[idx] & ULL(0xffffffff00000000); 22812027Sjungma@eit.uni-kl.de retval |= xc->getCpuPtr()->curCycle() & ULL(0x00000000ffffffff); 22912027Sjungma@eit.uni-kl.de break; 23012027Sjungma@eit.uni-kl.de 23112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_VA: 23212027Sjungma@eit.uni-kl.de retval = ipr[idx]; 23312027Sjungma@eit.uni-kl.de break; 23412027Sjungma@eit.uni-kl.de 23512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_VA_FORM: 23612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_MM_STAT: 23712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_IFAULT_VA_FORM: 23812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_EXC_MASK: 23912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_EXC_SUM: 24012027Sjungma@eit.uni-kl.de retval = ipr[idx]; 24112027Sjungma@eit.uni-kl.de break; 24212027Sjungma@eit.uni-kl.de 24312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DTB_PTE: 24412027Sjungma@eit.uni-kl.de { 24512027Sjungma@eit.uni-kl.de AlphaISA::PTE &pte = xc->getDTBPtr()->index(!xc->misspeculating()); 24612027Sjungma@eit.uni-kl.de 24712027Sjungma@eit.uni-kl.de retval |= ((u_int64_t)pte.ppn & ULL(0x7ffffff)) << 32; 24812027Sjungma@eit.uni-kl.de retval |= ((u_int64_t)pte.xre & ULL(0xf)) << 8; 24912027Sjungma@eit.uni-kl.de retval |= ((u_int64_t)pte.xwe & ULL(0xf)) << 12; 25012027Sjungma@eit.uni-kl.de retval |= ((u_int64_t)pte.fonr & ULL(0x1)) << 1; 25112027Sjungma@eit.uni-kl.de retval |= ((u_int64_t)pte.fonw & ULL(0x1))<< 2; 25212027Sjungma@eit.uni-kl.de retval |= ((u_int64_t)pte.asma & ULL(0x1)) << 4; 25312027Sjungma@eit.uni-kl.de retval |= ((u_int64_t)pte.asn & ULL(0x7f)) << 57; 25412027Sjungma@eit.uni-kl.de } 25512027Sjungma@eit.uni-kl.de break; 25612027Sjungma@eit.uni-kl.de 25712027Sjungma@eit.uni-kl.de // write only registers 25812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_HWINT_CLR: 25912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_SL_XMIT: 26012027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DC_FLUSH: 26112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_IC_FLUSH: 26212027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ALT_MODE: 26312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DTB_IA: 26412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DTB_IAP: 26512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ITB_IA: 26612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ITB_IAP: 26712027Sjungma@eit.uni-kl.de fault = new UnimplementedOpcodeFault; 26812027Sjungma@eit.uni-kl.de break; 26912027Sjungma@eit.uni-kl.de 27012027Sjungma@eit.uni-kl.de default: 27112027Sjungma@eit.uni-kl.de // invalid IPR 27212027Sjungma@eit.uni-kl.de fault = new UnimplementedOpcodeFault; 27312027Sjungma@eit.uni-kl.de break; 27412027Sjungma@eit.uni-kl.de } 27512027Sjungma@eit.uni-kl.de 27612027Sjungma@eit.uni-kl.de return retval; 27712027Sjungma@eit.uni-kl.de} 27812027Sjungma@eit.uni-kl.de 27912027Sjungma@eit.uni-kl.de#ifdef DEBUG 28012027Sjungma@eit.uni-kl.de// Cause the simulator to break when changing to the following IPL 28112027Sjungma@eit.uni-kl.deint break_ipl = -1; 28212027Sjungma@eit.uni-kl.de#endif 28312027Sjungma@eit.uni-kl.de 28412027Sjungma@eit.uni-kl.deFault 28512027Sjungma@eit.uni-kl.deAlphaISA::MiscRegFile::setIpr(int idx, uint64_t val, ExecContext *xc) 28612027Sjungma@eit.uni-kl.de{ 28712027Sjungma@eit.uni-kl.de uint64_t old; 28812027Sjungma@eit.uni-kl.de 28912027Sjungma@eit.uni-kl.de if (xc->misspeculating()) 29012027Sjungma@eit.uni-kl.de return NoFault; 29112027Sjungma@eit.uni-kl.de 29212027Sjungma@eit.uni-kl.de switch (idx) { 29312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp0: 29412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp1: 29512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp2: 29612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp3: 29712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp4: 29812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp5: 29912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp6: 30012027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp7: 30112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp8: 30212027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp9: 30312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp10: 30412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp11: 30512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp12: 30612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp13: 30712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp14: 30812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp15: 30912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp16: 31012027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp17: 31112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp18: 31212027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp19: 31312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp20: 31412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp21: 31512027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp22: 31612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PAL_BASE: 31712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_IC_PERR_STAT: 31812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DC_PERR_STAT: 31912027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PMCTR: 32012027Sjungma@eit.uni-kl.de // write entire quad w/ no side-effect 32112027Sjungma@eit.uni-kl.de ipr[idx] = val; 32212027Sjungma@eit.uni-kl.de break; 32312027Sjungma@eit.uni-kl.de 32412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_CC_CTL: 32512027Sjungma@eit.uni-kl.de // This IPR resets the cycle counter. We assume this only 32612027Sjungma@eit.uni-kl.de // happens once... let's verify that. 32712027Sjungma@eit.uni-kl.de assert(ipr[idx] == 0); 32812027Sjungma@eit.uni-kl.de ipr[idx] = 1; 32912027Sjungma@eit.uni-kl.de break; 33012027Sjungma@eit.uni-kl.de 33112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_CC: 33212027Sjungma@eit.uni-kl.de // This IPR only writes the upper 64 bits. It's ok to write 33312027Sjungma@eit.uni-kl.de // all 64 here since we mask out the lower 32 in rpcc (see 33412027Sjungma@eit.uni-kl.de // isa_desc). 33512027Sjungma@eit.uni-kl.de ipr[idx] = val; 33612027Sjungma@eit.uni-kl.de break; 33712027Sjungma@eit.uni-kl.de 33812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_PALtemp23: 33912027Sjungma@eit.uni-kl.de // write entire quad w/ no side-effect 34012027Sjungma@eit.uni-kl.de old = ipr[idx]; 34112027Sjungma@eit.uni-kl.de ipr[idx] = val; 34212027Sjungma@eit.uni-kl.de if (xc->getKernelStats()) 34312027Sjungma@eit.uni-kl.de xc->getKernelStats()->context(old, val, xc); 34412027Sjungma@eit.uni-kl.de break; 34512027Sjungma@eit.uni-kl.de 34612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DTB_PTE: 34712027Sjungma@eit.uni-kl.de // write entire quad w/ no side-effect, tag is forthcoming 34812027Sjungma@eit.uni-kl.de ipr[idx] = val; 34912027Sjungma@eit.uni-kl.de break; 35012027Sjungma@eit.uni-kl.de 35112027Sjungma@eit.uni-kl.de case AlphaISA::IPR_EXC_ADDR: 35212027Sjungma@eit.uni-kl.de // second least significant bit in PC is always zero 35312027Sjungma@eit.uni-kl.de ipr[idx] = val & ~2; 35412027Sjungma@eit.uni-kl.de break; 35512027Sjungma@eit.uni-kl.de 35612027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ASTRR: 35712027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ASTER: 35812027Sjungma@eit.uni-kl.de // only write least significant four bits - privilege mask 35912027Sjungma@eit.uni-kl.de ipr[idx] = val & 0xf; 36012027Sjungma@eit.uni-kl.de break; 36112027Sjungma@eit.uni-kl.de 36212027Sjungma@eit.uni-kl.de case AlphaISA::IPR_IPLR: 36312027Sjungma@eit.uni-kl.de#ifdef DEBUG 36412027Sjungma@eit.uni-kl.de if (break_ipl != -1 && break_ipl == (val & 0x1f)) 36512027Sjungma@eit.uni-kl.de debug_break(); 36612027Sjungma@eit.uni-kl.de#endif 36712027Sjungma@eit.uni-kl.de 36812027Sjungma@eit.uni-kl.de // only write least significant five bits - interrupt level 36912027Sjungma@eit.uni-kl.de ipr[idx] = val & 0x1f; 37012027Sjungma@eit.uni-kl.de if (xc->getKernelStats()) 37112027Sjungma@eit.uni-kl.de xc->getKernelStats()->swpipl(ipr[idx]); 37212027Sjungma@eit.uni-kl.de break; 37312027Sjungma@eit.uni-kl.de 37412027Sjungma@eit.uni-kl.de case AlphaISA::IPR_DTB_CM: 37512027Sjungma@eit.uni-kl.de if (val & 0x18) { 37612027Sjungma@eit.uni-kl.de if (xc->getKernelStats()) 37712027Sjungma@eit.uni-kl.de xc->getKernelStats()->mode(Kernel::user, xc); 37812027Sjungma@eit.uni-kl.de } else { 37912027Sjungma@eit.uni-kl.de if (xc->getKernelStats()) 38012027Sjungma@eit.uni-kl.de xc->getKernelStats()->mode(Kernel::kernel, xc); 38112027Sjungma@eit.uni-kl.de } 38212027Sjungma@eit.uni-kl.de 38312027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ICM: 38412027Sjungma@eit.uni-kl.de // only write two mode bits - processor mode 38512027Sjungma@eit.uni-kl.de ipr[idx] = val & 0x18; 38612027Sjungma@eit.uni-kl.de break; 38712027Sjungma@eit.uni-kl.de 38812027Sjungma@eit.uni-kl.de case AlphaISA::IPR_ALT_MODE: 389 // only write two mode bits - processor mode 390 ipr[idx] = val & 0x18; 391 break; 392 393 case AlphaISA::IPR_MCSR: 394 // more here after optimization... 395 ipr[idx] = val; 396 break; 397 398 case AlphaISA::IPR_SIRR: 399 // only write software interrupt mask 400 ipr[idx] = val & 0x7fff0; 401 break; 402 403 case AlphaISA::IPR_ICSR: 404 ipr[idx] = val & ULL(0xffffff0300); 405 break; 406 407 case AlphaISA::IPR_IVPTBR: 408 case AlphaISA::IPR_MVPTBR: 409 ipr[idx] = val & ULL(0xffffffffc0000000); 410 break; 411 412 case AlphaISA::IPR_DC_TEST_CTL: 413 ipr[idx] = val & 0x1ffb; 414 break; 415 416 case AlphaISA::IPR_DC_MODE: 417 case AlphaISA::IPR_MAF_MODE: 418 ipr[idx] = val & 0x3f; 419 break; 420 421 case AlphaISA::IPR_ITB_ASN: 422 ipr[idx] = val & 0x7f0; 423 break; 424 425 case AlphaISA::IPR_DTB_ASN: 426 ipr[idx] = val & ULL(0xfe00000000000000); 427 break; 428 429 case AlphaISA::IPR_EXC_SUM: 430 case AlphaISA::IPR_EXC_MASK: 431 // any write to this register clears it 432 ipr[idx] = 0; 433 break; 434 435 case AlphaISA::IPR_INTID: 436 case AlphaISA::IPR_SL_RCV: 437 case AlphaISA::IPR_MM_STAT: 438 case AlphaISA::IPR_ITB_PTE_TEMP: 439 case AlphaISA::IPR_DTB_PTE_TEMP: 440 // read-only registers 441 return new UnimplementedOpcodeFault; 442 443 case AlphaISA::IPR_HWINT_CLR: 444 case AlphaISA::IPR_SL_XMIT: 445 case AlphaISA::IPR_DC_FLUSH: 446 case AlphaISA::IPR_IC_FLUSH: 447 // the following are write only 448 ipr[idx] = val; 449 break; 450 451 case AlphaISA::IPR_DTB_IA: 452 // really a control write 453 ipr[idx] = 0; 454 455 xc->getDTBPtr()->flushAll(); 456 break; 457 458 case AlphaISA::IPR_DTB_IAP: 459 // really a control write 460 ipr[idx] = 0; 461 462 xc->getDTBPtr()->flushProcesses(); 463 break; 464 465 case AlphaISA::IPR_DTB_IS: 466 // really a control write 467 ipr[idx] = val; 468 469 xc->getDTBPtr()->flushAddr(val, 470 DTB_ASN_ASN(ipr[AlphaISA::IPR_DTB_ASN])); 471 break; 472 473 case AlphaISA::IPR_DTB_TAG: { 474 struct AlphaISA::PTE pte; 475 476 // FIXME: granularity hints NYI... 477 if (DTB_PTE_GH(ipr[AlphaISA::IPR_DTB_PTE]) != 0) 478 panic("PTE GH field != 0"); 479 480 // write entire quad 481 ipr[idx] = val; 482 483 // construct PTE for new entry 484 pte.ppn = DTB_PTE_PPN(ipr[AlphaISA::IPR_DTB_PTE]); 485 pte.xre = DTB_PTE_XRE(ipr[AlphaISA::IPR_DTB_PTE]); 486 pte.xwe = DTB_PTE_XWE(ipr[AlphaISA::IPR_DTB_PTE]); 487 pte.fonr = DTB_PTE_FONR(ipr[AlphaISA::IPR_DTB_PTE]); 488 pte.fonw = DTB_PTE_FONW(ipr[AlphaISA::IPR_DTB_PTE]); 489 pte.asma = DTB_PTE_ASMA(ipr[AlphaISA::IPR_DTB_PTE]); 490 pte.asn = DTB_ASN_ASN(ipr[AlphaISA::IPR_DTB_ASN]); 491 492 // insert new TAG/PTE value into data TLB 493 xc->getDTBPtr()->insert(val, pte); 494 } 495 break; 496 497 case AlphaISA::IPR_ITB_PTE: { 498 struct AlphaISA::PTE pte; 499 500 // FIXME: granularity hints NYI... 501 if (ITB_PTE_GH(val) != 0) 502 panic("PTE GH field != 0"); 503 504 // write entire quad 505 ipr[idx] = val; 506 507 // construct PTE for new entry 508 pte.ppn = ITB_PTE_PPN(val); 509 pte.xre = ITB_PTE_XRE(val); 510 pte.xwe = 0; 511 pte.fonr = ITB_PTE_FONR(val); 512 pte.fonw = ITB_PTE_FONW(val); 513 pte.asma = ITB_PTE_ASMA(val); 514 pte.asn = ITB_ASN_ASN(ipr[AlphaISA::IPR_ITB_ASN]); 515 516 // insert new TAG/PTE value into data TLB 517 xc->getITBPtr()->insert(ipr[AlphaISA::IPR_ITB_TAG], pte); 518 } 519 break; 520 521 case AlphaISA::IPR_ITB_IA: 522 // really a control write 523 ipr[idx] = 0; 524 525 xc->getITBPtr()->flushAll(); 526 break; 527 528 case AlphaISA::IPR_ITB_IAP: 529 // really a control write 530 ipr[idx] = 0; 531 532 xc->getITBPtr()->flushProcesses(); 533 break; 534 535 case AlphaISA::IPR_ITB_IS: 536 // really a control write 537 ipr[idx] = val; 538 539 xc->getITBPtr()->flushAddr(val, 540 ITB_ASN_ASN(ipr[AlphaISA::IPR_ITB_ASN])); 541 break; 542 543 default: 544 // invalid IPR 545 return new UnimplementedOpcodeFault; 546 } 547 548 // no error... 549 return NoFault; 550} 551 552void 553AlphaISA::copyIprs(ExecContext *src, ExecContext *dest) 554{ 555 for (int i = IPR_Base_DepTag; i < NumInternalProcRegs; ++i) { 556 dest->setMiscReg(i, src->readMiscReg(i)); 557 } 558} 559 560/** 561 * Check for special simulator handling of specific PAL calls. 562 * If return value is false, actual PAL call will be suppressed. 563 */ 564bool 565CPUExecContext::simPalCheck(int palFunc) 566{ 567 if (kernelStats) 568 kernelStats->callpal(palFunc, proxy); 569 570 switch (palFunc) { 571 case PAL::halt: 572 halt(); 573 if (--System::numSystemsRunning == 0) 574 new SimExitEvent("all cpus halted"); 575 break; 576 577 case PAL::bpt: 578 case PAL::bugchk: 579 if (system->breakpoint()) 580 return false; 581 break; 582 } 583 584 return true; 585} 586 587#endif // FULL_SYSTEM 588