faults.cc revision 8575
12131SN/A/*
25268Sksewell@umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
35254Sksewell@umich.edu * Copyright (c) 2007 MIPS Technologies, Inc.
45254Sksewell@umich.edu * All rights reserved.
52131SN/A *
65254Sksewell@umich.edu * Redistribution and use in source and binary forms, with or without
75254Sksewell@umich.edu * modification, are permitted provided that the following conditions are
85254Sksewell@umich.edu * met: redistributions of source code must retain the above copyright
95254Sksewell@umich.edu * notice, this list of conditions and the following disclaimer;
105254Sksewell@umich.edu * redistributions in binary form must reproduce the above copyright
115254Sksewell@umich.edu * notice, this list of conditions and the following disclaimer in the
125254Sksewell@umich.edu * documentation and/or other materials provided with the distribution;
135254Sksewell@umich.edu * neither the name of the copyright holders nor the names of its
145254Sksewell@umich.edu * contributors may be used to endorse or promote products derived from
155254Sksewell@umich.edu * this software without specific prior written permission.
162131SN/A *
175254Sksewell@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
185254Sksewell@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
195254Sksewell@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
205254Sksewell@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
215254Sksewell@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
225254Sksewell@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
235254Sksewell@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
245254Sksewell@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
255254Sksewell@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
265254Sksewell@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
275254Sksewell@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282665Ssaidi@eecs.umich.edu *
295254Sksewell@umich.edu * Authors: Gabe Black
305254Sksewell@umich.edu *          Korey Sewell
315222Sksewell@umich.edu *          Jaidev Patwardhan
322131SN/A */
332131SN/A
342239SN/A#include "arch/mips/faults.hh"
357676Snate@binkert.org#include "arch/mips/pra_constants.hh"
367676Snate@binkert.org#include "base/trace.hh"
377676Snate@binkert.org#include "cpu/base.hh"
382680Sktlim@umich.edu#include "cpu/thread_context.hh"
398232Snate@binkert.org#include "debug/MipsPRA.hh"
407676Snate@binkert.org
412800Ssaidi@eecs.umich.edu#if !FULL_SYSTEM
427676Snate@binkert.org#include "mem/page_table.hh"
432800Ssaidi@eecs.umich.edu#include "sim/process.hh"
442800Ssaidi@eecs.umich.edu#endif
452131SN/A
462447SN/Anamespace MipsISA
472447SN/A{
482131SN/A
498566Sgblack@eecs.umich.edutypedef MipsFaultBase::FaultVals FaultVals;
502131SN/A
518566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<MachineCheckFault>::vals =
528566Sgblack@eecs.umich.edu    { "Machine Check", 0x0401 };
532447SN/A
548566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<ResetFault>::vals =
555222Sksewell@umich.edu#if  FULL_SYSTEM
568566Sgblack@eecs.umich.edu    { "Reset Fault", 0xBFC00000};
575222Sksewell@umich.edu#else
588566Sgblack@eecs.umich.edu    { "Reset Fault", 0x001};
595222Sksewell@umich.edu#endif
602447SN/A
618566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<AddressErrorFault>::vals =
628566Sgblack@eecs.umich.edu    { "Address Error", 0x0180 };
635222Sksewell@umich.edu
648566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<SystemCallFault>::vals =
658566Sgblack@eecs.umich.edu    { "Syscall", 0x0180 };
665222Sksewell@umich.edu
678566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<CoprocessorUnusableFault>::vals =
688566Sgblack@eecs.umich.edu    { "Coprocessor Unusable Fault", 0x180 };
695222Sksewell@umich.edu
708566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<ReservedInstructionFault>::vals =
718566Sgblack@eecs.umich.edu    { "Reserved Instruction Fault", 0x0180 };
724661Sksewell@umich.edu
738566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<ThreadFault>::vals =
748566Sgblack@eecs.umich.edu    { "Thread Fault", 0x00F1 };
754661Sksewell@umich.edu
768568Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<IntegerOverflowFault>::vals =
778568Sgblack@eecs.umich.edu    { "Integer Overflow Exception", 0x180 };
782447SN/A
798566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<InterruptFault>::vals =
808566Sgblack@eecs.umich.edu    { "interrupt", 0x0180 };
814661Sksewell@umich.edu
828566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<TrapFault>::vals =
838566Sgblack@eecs.umich.edu    { "Trap", 0x0180 };
842447SN/A
858566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<BreakpointFault>::vals =
868566Sgblack@eecs.umich.edu    { "Breakpoint", 0x0180 };
875222Sksewell@umich.edu
888573Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<TlbInvalidFault>::vals =
898573Sgblack@eecs.umich.edu    { "Invalid TLB Entry Exception", 0x0180 };
905222Sksewell@umich.edu
918573Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<TlbRefillFault>::vals =
928573Sgblack@eecs.umich.edu    { "TLB Refill Exception", 0x0180 };
932447SN/A
948575Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<TlbModifiedFault>::vals =
958566Sgblack@eecs.umich.edu    { "TLB Modified Exception", 0x0180 };
962447SN/A
978566Sgblack@eecs.umich.edutemplate <> FaultVals MipsFault<DspStateDisabledFault>::vals =
988566Sgblack@eecs.umich.edu    { "DSP Disabled Fault", 0x001a };
994661Sksewell@umich.edu
1006378Sgblack@eecs.umich.eduvoid
1018566Sgblack@eecs.umich.eduMipsFaultBase::setExceptionState(ThreadContext *tc, uint8_t excCode)
1025222Sksewell@umich.edu{
1036378Sgblack@eecs.umich.edu    // modify SRS Ctl - Save CSS, put ESS into CSS
1046383Sgblack@eecs.umich.edu    StatusReg status = tc->readMiscReg(MISCREG_STATUS);
1056379Sgblack@eecs.umich.edu    if (status.exl != 1 && status.bev != 1) {
1066378Sgblack@eecs.umich.edu        // SRS Ctl is modified only if Status_EXL and Status_BEV are not set
1076383Sgblack@eecs.umich.edu        SRSCtlReg srsCtl = tc->readMiscReg(MISCREG_SRSCTL);
1086379Sgblack@eecs.umich.edu        srsCtl.pss = srsCtl.css;
1096379Sgblack@eecs.umich.edu        srsCtl.css = srsCtl.ess;
1106383Sgblack@eecs.umich.edu        tc->setMiscRegNoEffect(MISCREG_SRSCTL, srsCtl);
1115222Sksewell@umich.edu    }
1125222Sksewell@umich.edu
1136378Sgblack@eecs.umich.edu    // set EXL bit (don't care if it is already set!)
1146379Sgblack@eecs.umich.edu    status.exl = 1;
1156383Sgblack@eecs.umich.edu    tc->setMiscRegNoEffect(MISCREG_STATUS, status);
1165222Sksewell@umich.edu
1176378Sgblack@eecs.umich.edu    // write EPC
1188574Sgblack@eecs.umich.edu    PCState pc = tc->pcState();
1198574Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "PC: %s\n", pc);
1208574Sgblack@eecs.umich.edu    bool delay_slot = pc.pc() + sizeof(MachInst) != pc.npc();
1218574Sgblack@eecs.umich.edu    tc->setMiscRegNoEffect(MISCREG_EPC,
1228574Sgblack@eecs.umich.edu            pc.pc() - delay_slot ? sizeof(MachInst) : 0);
1235222Sksewell@umich.edu
1246378Sgblack@eecs.umich.edu    // Set Cause_EXCCODE field
1256383Sgblack@eecs.umich.edu    CauseReg cause = tc->readMiscReg(MISCREG_CAUSE);
1266379Sgblack@eecs.umich.edu    cause.excCode = excCode;
1278574Sgblack@eecs.umich.edu    cause.bd = delay_slot ? 1 : 0;
1286379Sgblack@eecs.umich.edu    cause.ce = 0;
1296383Sgblack@eecs.umich.edu    tc->setMiscRegNoEffect(MISCREG_CAUSE, cause);
1306378Sgblack@eecs.umich.edu}
1316378Sgblack@eecs.umich.edu
1328574Sgblack@eecs.umich.edu#if FULL_SYSTEM
1338574Sgblack@eecs.umich.eduvoid
1348574Sgblack@eecs.umich.eduMipsFaultBase::setHandlerPC(Addr HandlerBase, ThreadContext *tc)
1358574Sgblack@eecs.umich.edu{
1368574Sgblack@eecs.umich.edu    tc->setPC(HandlerBase);
1378574Sgblack@eecs.umich.edu    tc->setNextPC(HandlerBase + sizeof(MachInst));
1388574Sgblack@eecs.umich.edu    tc->setNextNPC(HandlerBase + 2 * sizeof(MachInst));
1398574Sgblack@eecs.umich.edu}
1408574Sgblack@eecs.umich.edu
1416378Sgblack@eecs.umich.eduvoid
1428568Sgblack@eecs.umich.eduIntegerOverflowFault::invoke(ThreadContext *tc, StaticInstPtr inst)
1436378Sgblack@eecs.umich.edu{
1446378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
1456378Sgblack@eecs.umich.edu    setExceptionState(tc, 0xC);
1466378Sgblack@eecs.umich.edu
1476378Sgblack@eecs.umich.edu    // Set new PC
1486378Sgblack@eecs.umich.edu    Addr HandlerBase;
1496383Sgblack@eecs.umich.edu    StatusReg status = tc->readMiscReg(MISCREG_STATUS);
1506378Sgblack@eecs.umich.edu    // Here, the handler is dependent on BEV, which is not modified by
1516378Sgblack@eecs.umich.edu    // setExceptionState()
1526379Sgblack@eecs.umich.edu    if (!status.bev) {
1536378Sgblack@eecs.umich.edu        // See MIPS ARM Vol 3, Revision 2, Page 38
1546383Sgblack@eecs.umich.edu        HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
1556378Sgblack@eecs.umich.edu    } else {
1566378Sgblack@eecs.umich.edu        HandlerBase = 0xBFC00200;
1576378Sgblack@eecs.umich.edu    }
1586378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
1596378Sgblack@eecs.umich.edu}
1606378Sgblack@eecs.umich.edu
1616378Sgblack@eecs.umich.eduvoid
1627678Sgblack@eecs.umich.eduTrapFault::invoke(ThreadContext *tc, StaticInstPtr inst)
1636378Sgblack@eecs.umich.edu{
1646378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
1656378Sgblack@eecs.umich.edu    setExceptionState(tc, 0xD);
1666378Sgblack@eecs.umich.edu
1676378Sgblack@eecs.umich.edu    // Set new PC
1686378Sgblack@eecs.umich.edu    Addr HandlerBase;
1696378Sgblack@eecs.umich.edu    // Offset 0x180 - General Exception Vector
1706383Sgblack@eecs.umich.edu    HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
1716378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
1726378Sgblack@eecs.umich.edu}
1736378Sgblack@eecs.umich.edu
1746378Sgblack@eecs.umich.eduvoid
1757678Sgblack@eecs.umich.eduBreakpointFault::invoke(ThreadContext *tc, StaticInstPtr inst)
1766378Sgblack@eecs.umich.edu{
1776378Sgblack@eecs.umich.edu    setExceptionState(tc, 0x9);
1786378Sgblack@eecs.umich.edu
1796378Sgblack@eecs.umich.edu    // Set new PC
1806378Sgblack@eecs.umich.edu    Addr HandlerBase;
1816378Sgblack@eecs.umich.edu    // Offset 0x180 - General Exception Vector
1826383Sgblack@eecs.umich.edu    HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
1836378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
1846378Sgblack@eecs.umich.edu}
1856378Sgblack@eecs.umich.edu
1866378Sgblack@eecs.umich.eduvoid
1877678Sgblack@eecs.umich.eduAddressErrorFault::invoke(ThreadContext *tc, StaticInstPtr inst)
1886378Sgblack@eecs.umich.edu{
1896378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
1908570Sgblack@eecs.umich.edu    setExceptionState(tc, store ? 0x5 : 0x4);
1918570Sgblack@eecs.umich.edu    tc->setMiscRegNoEffect(MISCREG_BADVADDR, vaddr);
1926378Sgblack@eecs.umich.edu
1936378Sgblack@eecs.umich.edu    // Set new PC
1946378Sgblack@eecs.umich.edu    Addr HandlerBase;
1956378Sgblack@eecs.umich.edu    // Offset 0x180 - General Exception Vector
1966383Sgblack@eecs.umich.edu    HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
1976378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
1986378Sgblack@eecs.umich.edu}
1996378Sgblack@eecs.umich.edu
2006378Sgblack@eecs.umich.eduvoid
2018575Sgblack@eecs.umich.eduTlbInvalidFault::invoke(ThreadContext *tc, StaticInstPtr inst)
2028575Sgblack@eecs.umich.edu{
2038575Sgblack@eecs.umich.edu    setTlbExceptionState(tc, store ? 0x3 : 0x2);
2048575Sgblack@eecs.umich.edu    // Set new PC
2058575Sgblack@eecs.umich.edu    Addr HandlerBase;
2068575Sgblack@eecs.umich.edu    // Offset 0x180 - General Exception Vector
2078575Sgblack@eecs.umich.edu    HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
2088575Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
2098575Sgblack@eecs.umich.edu}
2108575Sgblack@eecs.umich.edu
2118575Sgblack@eecs.umich.eduvoid
2128573Sgblack@eecs.umich.eduTlbRefillFault::invoke(ThreadContext *tc, StaticInstPtr inst)
2136378Sgblack@eecs.umich.edu{
2148575Sgblack@eecs.umich.edu    // Since handler depends on EXL bit, must check EXL bit before setting it!!
2158575Sgblack@eecs.umich.edu    StatusReg status = tc->readMiscReg(MISCREG_STATUS);
2168573Sgblack@eecs.umich.edu
2178575Sgblack@eecs.umich.edu    setTlbExceptionState(tc, store ? 0x3 : 0x2);
2186378Sgblack@eecs.umich.edu
2196378Sgblack@eecs.umich.edu    // See MIPS ARM Vol 3, Revision 2, Page 38
2206379Sgblack@eecs.umich.edu    if (status.exl == 1) {
2216378Sgblack@eecs.umich.edu        // Offset 0x180 - General Exception Vector
2226383Sgblack@eecs.umich.edu        HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
2236378Sgblack@eecs.umich.edu    } else {
2246378Sgblack@eecs.umich.edu        // Offset 0x000
2256383Sgblack@eecs.umich.edu        HandlerBase = tc->readMiscReg(MISCREG_EBASE);
2266378Sgblack@eecs.umich.edu    }
2276378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
2286378Sgblack@eecs.umich.edu}
2296378Sgblack@eecs.umich.edu
2306378Sgblack@eecs.umich.eduvoid
2318575Sgblack@eecs.umich.eduTlbModifiedFault::invoke(ThreadContext *tc, StaticInstPtr inst)
2326378Sgblack@eecs.umich.edu{
2338575Sgblack@eecs.umich.edu    setTlbExceptionState(tc, 0x1);
2346378Sgblack@eecs.umich.edu
2356378Sgblack@eecs.umich.edu    // Set new PC
2366378Sgblack@eecs.umich.edu    Addr HandlerBase;
2376378Sgblack@eecs.umich.edu    // Offset 0x180 - General Exception Vector
2386383Sgblack@eecs.umich.edu    HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
2396378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
2405222Sksewell@umich.edu}
2415222Sksewell@umich.edu
2426378Sgblack@eecs.umich.eduvoid
2437678Sgblack@eecs.umich.eduSystemCallFault::invoke(ThreadContext *tc, StaticInstPtr inst)
2445222Sksewell@umich.edu{
2456378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
2466378Sgblack@eecs.umich.edu    setExceptionState(tc, 0x8);
2475222Sksewell@umich.edu
2486378Sgblack@eecs.umich.edu    // Set new PC
2496378Sgblack@eecs.umich.edu    Addr HandlerBase;
2506378Sgblack@eecs.umich.edu    // Offset 0x180 - General Exception Vector
2516383Sgblack@eecs.umich.edu    HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
2526378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
2535222Sksewell@umich.edu}
2545222Sksewell@umich.edu
2556378Sgblack@eecs.umich.eduvoid
2567678Sgblack@eecs.umich.eduInterruptFault::invoke(ThreadContext *tc, StaticInstPtr inst)
2575222Sksewell@umich.edu{
2585222Sksewell@umich.edu#if  FULL_SYSTEM
2596378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
2606378Sgblack@eecs.umich.edu    setExceptionState(tc, 0x0A);
2616378Sgblack@eecs.umich.edu    Addr HandlerBase;
2625222Sksewell@umich.edu
2636383Sgblack@eecs.umich.edu    CauseReg cause = tc->readMiscRegNoEffect(MISCREG_CAUSE);
2646379Sgblack@eecs.umich.edu    if (cause.iv) {
2656378Sgblack@eecs.umich.edu        // Offset 200 for release 2
2666383Sgblack@eecs.umich.edu        HandlerBase = 0x20 + vect() + tc->readMiscRegNoEffect(MISCREG_EBASE);
2676378Sgblack@eecs.umich.edu    } else {
2686378Sgblack@eecs.umich.edu        //Ofset at 180 for release 1
2696383Sgblack@eecs.umich.edu        HandlerBase = vect() + tc->readMiscRegNoEffect(MISCREG_EBASE);
2706378Sgblack@eecs.umich.edu    }
2715222Sksewell@umich.edu
2726378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
2735222Sksewell@umich.edu#endif
2745222Sksewell@umich.edu}
2755222Sksewell@umich.edu
2765222Sksewell@umich.edu#endif // FULL_SYSTEM
2775222Sksewell@umich.edu
2786378Sgblack@eecs.umich.eduvoid
2797678Sgblack@eecs.umich.eduResetFault::invoke(ThreadContext *tc, StaticInstPtr inst)
2804661Sksewell@umich.edu{
2815224Sksewell@umich.edu#if FULL_SYSTEM
2826378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
2836378Sgblack@eecs.umich.edu    /* All reset activity must be invoked from here */
2846378Sgblack@eecs.umich.edu    tc->setPC(vect());
2856378Sgblack@eecs.umich.edu    tc->setNextPC(vect() + sizeof(MachInst));
2866378Sgblack@eecs.umich.edu    tc->setNextNPC(vect() + sizeof(MachInst) + sizeof(MachInst));
2876379Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "ResetFault::invoke : PC set to %x", tc->readPC());
2885224Sksewell@umich.edu#endif
2895224Sksewell@umich.edu
2906378Sgblack@eecs.umich.edu    // Set Coprocessor 1 (Floating Point) To Usable
2916383Sgblack@eecs.umich.edu    StatusReg status = tc->readMiscRegNoEffect(MISCREG_STATUS);
2926379Sgblack@eecs.umich.edu    status.cu.cu1 = 1;
2936383Sgblack@eecs.umich.edu    tc->setMiscReg(MISCREG_STATUS, status);
2945222Sksewell@umich.edu}
2955222Sksewell@umich.edu
2966378Sgblack@eecs.umich.eduvoid
2977678Sgblack@eecs.umich.eduReservedInstructionFault::invoke(ThreadContext *tc, StaticInstPtr inst)
2985222Sksewell@umich.edu{
2995222Sksewell@umich.edu#if  FULL_SYSTEM
3006378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
3016378Sgblack@eecs.umich.edu    setExceptionState(tc, 0x0A);
3026378Sgblack@eecs.umich.edu    Addr HandlerBase;
3036378Sgblack@eecs.umich.edu    // Offset 0x180 - General Exception Vector
3046383Sgblack@eecs.umich.edu    HandlerBase = vect() + tc->readMiscRegNoEffect(MISCREG_EBASE);
3056378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
3065222Sksewell@umich.edu#else
3075222Sksewell@umich.edu    panic("%s encountered.\n", name());
3085222Sksewell@umich.edu#endif
3095222Sksewell@umich.edu}
3105222Sksewell@umich.edu
3116378Sgblack@eecs.umich.eduvoid
3127678Sgblack@eecs.umich.eduThreadFault::invoke(ThreadContext *tc, StaticInstPtr inst)
3135222Sksewell@umich.edu{
3146378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
3156378Sgblack@eecs.umich.edu    panic("%s encountered.\n", name());
3165222Sksewell@umich.edu}
3175222Sksewell@umich.edu
3186378Sgblack@eecs.umich.eduvoid
3197678Sgblack@eecs.umich.eduDspStateDisabledFault::invoke(ThreadContext *tc, StaticInstPtr inst)
3205222Sksewell@umich.edu{
3216378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
3226378Sgblack@eecs.umich.edu    panic("%s encountered.\n", name());
3234661Sksewell@umich.edu}
3244661Sksewell@umich.edu
3256378Sgblack@eecs.umich.eduvoid
3267678Sgblack@eecs.umich.eduCoprocessorUnusableFault::invoke(ThreadContext *tc, StaticInstPtr inst)
3274661Sksewell@umich.edu{
3285222Sksewell@umich.edu#if FULL_SYSTEM
3296378Sgblack@eecs.umich.edu    DPRINTF(MipsPRA, "%s encountered.\n", name());
3306378Sgblack@eecs.umich.edu    setExceptionState(tc, 0xb);
3316378Sgblack@eecs.umich.edu    // The ID of the coprocessor causing the exception is stored in
3326378Sgblack@eecs.umich.edu    // CoprocessorUnusableFault::coProcID
3336383Sgblack@eecs.umich.edu    CauseReg cause = tc->readMiscReg(MISCREG_CAUSE);
3346379Sgblack@eecs.umich.edu    cause.ce = coProcID;
3356383Sgblack@eecs.umich.edu    tc->setMiscRegNoEffect(MISCREG_CAUSE, cause);
3364661Sksewell@umich.edu
3376378Sgblack@eecs.umich.edu    Addr HandlerBase;
3386378Sgblack@eecs.umich.edu    // Offset 0x180 - General Exception Vector
3396383Sgblack@eecs.umich.edu    HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE);
3406378Sgblack@eecs.umich.edu    setHandlerPC(HandlerBase, tc);
3414661Sksewell@umich.edu
3425222Sksewell@umich.edu#else
3435224Sksewell@umich.edu    warn("%s (CP%d) encountered.\n", name(), coProcID);
3445222Sksewell@umich.edu#endif
3454661Sksewell@umich.edu}
3464661Sksewell@umich.edu
3472447SN/A} // namespace MipsISA
3482447SN/A
349