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