faults.cc revision 2665:a124942bacb8
12SN/A/*
21762SN/A * Copyright (c) 2003-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.
272665Ssaidi@eecs.umich.edu *
282665Ssaidi@eecs.umich.edu * Authors: Gabe Black
292SN/A *          Kevin Lim
302SN/A */
311798SN/A
321798SN/A#include "arch/alpha/faults.hh"
332SN/A#include "cpu/exec_context.hh"
3456SN/A#include "cpu/base.hh"
352SN/A#include "base/trace.hh"
362SN/A#if FULL_SYSTEM
372SN/A#include "arch/alpha/ev5.hh"
382SN/A#endif
392667Sstever@eecs.umich.edu
402SN/Anamespace AlphaISA
412SN/A{
422SN/A
432SN/AFaultName MachineCheckFault::_name = "mchk";
442SN/AFaultVect MachineCheckFault::_vect = 0x0401;
452SN/AFaultStat MachineCheckFault::_count;
462SN/A
472797Sktlim@umich.eduFaultName AlignmentFault::_name = "unalign";
482797Sktlim@umich.eduFaultVect AlignmentFault::_vect = 0x0301;
492797Sktlim@umich.eduFaultStat AlignmentFault::_count;
502797Sktlim@umich.edu
512797Sktlim@umich.eduFaultName ResetFault::_name = "reset";
522667Sstever@eecs.umich.eduFaultVect ResetFault::_vect = 0x0001;
53396SN/AFaultStat ResetFault::_count;
542SN/A
552667Sstever@eecs.umich.eduFaultName ArithmeticFault::_name = "arith";
562SN/AFaultVect ArithmeticFault::_vect = 0x0501;
572667Sstever@eecs.umich.eduFaultStat ArithmeticFault::_count;
582667Sstever@eecs.umich.edu
592667Sstever@eecs.umich.eduFaultName InterruptFault::_name = "interrupt";
602667Sstever@eecs.umich.eduFaultVect InterruptFault::_vect = 0x0101;
612SN/AFaultStat InterruptFault::_count;
622667Sstever@eecs.umich.edu
632667Sstever@eecs.umich.eduFaultName NDtbMissFault::_name = "dtb_miss_single";
642SN/AFaultVect NDtbMissFault::_vect = 0x0201;
652SN/AFaultStat NDtbMissFault::_count;
662SN/A
672SN/AFaultName PDtbMissFault::_name = "dtb_miss_double";
682SN/AFaultVect PDtbMissFault::_vect = 0x0281;
692SN/AFaultStat PDtbMissFault::_count;
702839Sktlim@umich.edu
712797Sktlim@umich.eduFaultName DtbPageFault::_name = "dfault";
722797Sktlim@umich.eduFaultVect DtbPageFault::_vect = 0x0381;
732839Sktlim@umich.eduFaultStat DtbPageFault::_count;
742797Sktlim@umich.edu
752797Sktlim@umich.eduFaultName DtbAcvFault::_name = "dfault";
762839Sktlim@umich.eduFaultVect DtbAcvFault::_vect = 0x0381;
772797Sktlim@umich.eduFaultStat DtbAcvFault::_count;
782797Sktlim@umich.edu
792797Sktlim@umich.eduFaultName DtbAlignmentFault::_name = "unalign";
802797Sktlim@umich.eduFaultVect DtbAlignmentFault::_vect = 0x0301;
812797Sktlim@umich.eduFaultStat DtbAlignmentFault::_count;
822797Sktlim@umich.edu
832797Sktlim@umich.eduFaultName ItbMissFault::_name = "itbmiss";
842797Sktlim@umich.eduFaultVect ItbMissFault::_vect = 0x0181;
852797Sktlim@umich.eduFaultStat ItbMissFault::_count;
862SN/A
872SN/AFaultName ItbPageFault::_name = "itbmiss";
882SN/AFaultVect ItbPageFault::_vect = 0x0181;
892SN/AFaultStat ItbPageFault::_count;
902SN/A
912SN/AFaultName ItbAcvFault::_name = "iaccvio";
922SN/AFaultVect ItbAcvFault::_vect = 0x0081;
932SN/AFaultStat ItbAcvFault::_count;
942SN/A
952SN/AFaultName UnimplementedOpcodeFault::_name = "opdec";
962SN/AFaultVect UnimplementedOpcodeFault::_vect = 0x0481;
972SN/AFaultStat UnimplementedOpcodeFault::_count;
982SN/A
992SN/AFaultName FloatEnableFault::_name = "fen";
1002SN/AFaultVect FloatEnableFault::_vect = 0x0581;
1012SN/AFaultStat FloatEnableFault::_count;
1022SN/A
1032SN/AFaultName PalFault::_name = "pal";
1042SN/AFaultVect PalFault::_vect = 0x2001;
1052SN/AFaultStat PalFault::_count;
1062SN/A
1071798SN/AFaultName IntegerOverflowFault::_name = "intover";
1082SN/AFaultVect IntegerOverflowFault::_vect = 0x0501;
1092SN/AFaultStat IntegerOverflowFault::_count;
1102SN/A
1112SN/A#if FULL_SYSTEM
1122SN/A
1132SN/Avoid AlphaFault::invoke(ExecContext * xc)
1142SN/A{
1152SN/A    FaultBase::invoke(xc);
1162SN/A    countStat()++;
1171798SN/A
1182SN/A    // exception restart address
1192SN/A    if (setRestartAddress() || !xc->inPalMode())
1202SN/A        xc->setMiscReg(AlphaISA::IPR_EXC_ADDR, xc->readPC());
1212SN/A
1222SN/A    if (skipFaultingInstruction()) {
1232SN/A        // traps...  skip faulting instruction.
1241798SN/A        xc->setMiscReg(AlphaISA::IPR_EXC_ADDR,
1251798SN/A                   xc->readMiscReg(AlphaISA::IPR_EXC_ADDR) + 4);
1261798SN/A    }
1271798SN/A
1281798SN/A    xc->setPC(xc->readMiscReg(AlphaISA::IPR_PAL_BASE) + vect());
1291798SN/A    xc->setNextPC(xc->readPC() + sizeof(MachInst));
1301798SN/A}
1311798SN/A
1321798SN/Avoid ArithmeticFault::invoke(ExecContext * xc)
1331798SN/A{
1341798SN/A    FaultBase::invoke(xc);
1351798SN/A    panic("Arithmetic traps are unimplemented!");
1361798SN/A}
1371798SN/A
1381798SN/Avoid DtbFault::invoke(ExecContext * xc)
1391798SN/A{
1401798SN/A    // Set fault address and flags.  Even though we're modeling an
1411798SN/A    // EV5, we use the EV6 technique of not latching fault registers
1421798SN/A    // on VPTE loads (instead of locking the registers until IPR_VA is
1431798SN/A    // read, like the EV5).  The EV6 approach is cleaner and seems to
144    // work with EV5 PAL code, but not the other way around.
145    if (!xc->misspeculating()
146        && !(reqFlags & VPTE) && !(reqFlags & NO_FAULT)) {
147        // set VA register with faulting address
148        xc->setMiscReg(AlphaISA::IPR_VA, vaddr);
149
150        // set MM_STAT register flags
151        xc->setMiscReg(AlphaISA::IPR_MM_STAT,
152            (((EV5::Opcode(xc->getInst()) & 0x3f) << 11)
153             | ((EV5::Ra(xc->getInst()) & 0x1f) << 6)
154             | (flags & 0x3f)));
155
156        // set VA_FORM register with faulting formatted address
157        xc->setMiscReg(AlphaISA::IPR_VA_FORM,
158            xc->readMiscReg(AlphaISA::IPR_MVPTBR) | (vaddr.vpn() << 3));
159    }
160
161    AlphaFault::invoke(xc);
162}
163
164void ItbFault::invoke(ExecContext * xc)
165{
166    if (!xc->misspeculating()) {
167        xc->setMiscReg(AlphaISA::IPR_ITB_TAG, pc);
168        xc->setMiscReg(AlphaISA::IPR_IFAULT_VA_FORM,
169                       xc->readMiscReg(AlphaISA::IPR_IVPTBR) |
170                       (AlphaISA::VAddr(pc).vpn() << 3));
171    }
172
173    AlphaFault::invoke(xc);
174}
175
176#endif
177
178} // namespace AlphaISA
179
180