faults.cc revision 2800
12131SN/A/*
22131SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan
32131SN/A * All rights reserved.
42131SN/A *
52131SN/A * Redistribution and use in source and binary forms, with or without
62131SN/A * modification, are permitted provided that the following conditions are
72131SN/A * met: redistributions of source code must retain the above copyright
82131SN/A * notice, this list of conditions and the following disclaimer;
92131SN/A * redistributions in binary form must reproduce the above copyright
102131SN/A * notice, this list of conditions and the following disclaimer in the
112131SN/A * documentation and/or other materials provided with the distribution;
122131SN/A * neither the name of the copyright holders nor the names of its
132131SN/A * contributors may be used to endorse or promote products derived from
142131SN/A * this software without specific prior written permission.
152131SN/A *
162131SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172131SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182131SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192131SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202131SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212131SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222131SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232131SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242131SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252131SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262131SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
282665Ssaidi@eecs.umich.edu * Authors: Korey Sewell
292131SN/A */
302131SN/A
312239SN/A#include "arch/mips/faults.hh"
322680Sktlim@umich.edu#include "cpu/thread_context.hh"
332447SN/A#include "cpu/base.hh"
342447SN/A#include "base/trace.hh"
352800Ssaidi@eecs.umich.edu#if !FULL_SYSTEM
362800Ssaidi@eecs.umich.edu#include "sim/process.hh"
372800Ssaidi@eecs.umich.edu#include "mem/page_table.hh"
382800Ssaidi@eecs.umich.edu#endif
392131SN/A
402447SN/Anamespace MipsISA
412447SN/A{
422131SN/A
432479SN/AFaultName MachineCheckFault::_name = "Machine Check";
442447SN/AFaultVect MachineCheckFault::_vect = 0x0401;
452447SN/AFaultStat MachineCheckFault::_count;
462131SN/A
472479SN/AFaultName AlignmentFault::_name = "Alignment";
482447SN/AFaultVect AlignmentFault::_vect = 0x0301;
492447SN/AFaultStat AlignmentFault::_count;
502447SN/A
512447SN/AFaultName ResetFault::_name = "reset";
522447SN/AFaultVect ResetFault::_vect = 0x0001;
532447SN/AFaultStat ResetFault::_count;
542447SN/A
552447SN/AFaultName ArithmeticFault::_name = "arith";
562447SN/AFaultVect ArithmeticFault::_vect = 0x0501;
572447SN/AFaultStat ArithmeticFault::_count;
582447SN/A
592800Ssaidi@eecs.umich.edu#if !FULL_SYSTEM
602800Ssaidi@eecs.umich.eduFaultName PageTableFault::_name = "page_table_fault";
612800Ssaidi@eecs.umich.eduFaultVect PageTableFault::_vect = 0x0000;
622800Ssaidi@eecs.umich.eduFaultStat PageTableFault::_count;
632800Ssaidi@eecs.umich.edu#endif
642800Ssaidi@eecs.umich.edu
652447SN/AFaultName InterruptFault::_name = "interrupt";
662447SN/AFaultVect InterruptFault::_vect = 0x0101;
672447SN/AFaultStat InterruptFault::_count;
682447SN/A
692447SN/AFaultName NDtbMissFault::_name = "dtb_miss_single";
702447SN/AFaultVect NDtbMissFault::_vect = 0x0201;
712447SN/AFaultStat NDtbMissFault::_count;
722447SN/A
732447SN/AFaultName PDtbMissFault::_name = "dtb_miss_double";
742447SN/AFaultVect PDtbMissFault::_vect = 0x0281;
752447SN/AFaultStat PDtbMissFault::_count;
762447SN/A
772447SN/AFaultName DtbPageFault::_name = "dfault";
782447SN/AFaultVect DtbPageFault::_vect = 0x0381;
792447SN/AFaultStat DtbPageFault::_count;
802447SN/A
812447SN/AFaultName DtbAcvFault::_name = "dfault";
822447SN/AFaultVect DtbAcvFault::_vect = 0x0381;
832447SN/AFaultStat DtbAcvFault::_count;
842447SN/A
852447SN/AFaultName ItbMissFault::_name = "itbmiss";
862447SN/AFaultVect ItbMissFault::_vect = 0x0181;
872447SN/AFaultStat ItbMissFault::_count;
882447SN/A
892447SN/AFaultName ItbPageFault::_name = "itbmiss";
902447SN/AFaultVect ItbPageFault::_vect = 0x0181;
912447SN/AFaultStat ItbPageFault::_count;
922447SN/A
932447SN/AFaultName ItbAcvFault::_name = "iaccvio";
942447SN/AFaultVect ItbAcvFault::_vect = 0x0081;
952447SN/AFaultStat ItbAcvFault::_count;
962447SN/A
972447SN/AFaultName UnimplementedOpcodeFault::_name = "opdec";
982447SN/AFaultVect UnimplementedOpcodeFault::_vect = 0x0481;
992447SN/AFaultStat UnimplementedOpcodeFault::_count;
1002447SN/A
1012447SN/AFaultName FloatEnableFault::_name = "fen";
1022447SN/AFaultVect FloatEnableFault::_vect = 0x0581;
1032447SN/AFaultStat FloatEnableFault::_count;
1042447SN/A
1052447SN/AFaultName PalFault::_name = "pal";
1062447SN/AFaultVect PalFault::_vect = 0x2001;
1072447SN/AFaultStat PalFault::_count;
1082447SN/A
1092447SN/AFaultName IntegerOverflowFault::_name = "intover";
1102447SN/AFaultVect IntegerOverflowFault::_vect = 0x0501;
1112447SN/AFaultStat IntegerOverflowFault::_count;
1122447SN/A
1132447SN/A#if FULL_SYSTEM
1142447SN/A
1152680Sktlim@umich.eduvoid MipsFault::invoke(ThreadContext * tc)
1162447SN/A{
1172680Sktlim@umich.edu    FaultBase::invoke(tc);
1182447SN/A    countStat()++;
1192447SN/A
1202447SN/A    // exception restart address
1212680Sktlim@umich.edu    if (setRestartAddress() || !tc->inPalMode())
1222680Sktlim@umich.edu        tc->setMiscReg(MipsISA::IPR_EXC_ADDR, tc->readPC());
1232447SN/A
1242447SN/A    if (skipFaultingInstruction()) {
1252447SN/A        // traps...  skip faulting instruction.
1262680Sktlim@umich.edu        tc->setMiscReg(MipsISA::IPR_EXC_ADDR,
1272680Sktlim@umich.edu                   tc->readMiscReg(MipsISA::IPR_EXC_ADDR) + 4);
1282447SN/A    }
1292447SN/A
1302680Sktlim@umich.edu    tc->setPC(tc->readMiscReg(MipsISA::IPR_PAL_BASE) + vect());
1312680Sktlim@umich.edu    tc->setNextPC(tc->readPC() + sizeof(MachInst));
1322447SN/A}
1332447SN/A
1342680Sktlim@umich.eduvoid ArithmeticFault::invoke(ThreadContext * tc)
1352447SN/A{
1362680Sktlim@umich.edu    FaultBase::invoke(tc);
1372447SN/A    panic("Arithmetic traps are unimplemented!");
1382447SN/A}
1392447SN/A
1402800Ssaidi@eecs.umich.edu#else //!FULL_SYSTEM
1412800Ssaidi@eecs.umich.edu
1422800Ssaidi@eecs.umich.eduvoid PageTableFault::invoke(ThreadContext *tc)
1432800Ssaidi@eecs.umich.edu{
1442800Ssaidi@eecs.umich.edu    Process *p = tc->getProcessPtr();
1452800Ssaidi@eecs.umich.edu
1462800Ssaidi@eecs.umich.edu    // address is higher than the stack region or in the current stack region
1472800Ssaidi@eecs.umich.edu    if (vaddr > p->stack_base || vaddr > p->stack_min)
1482800Ssaidi@eecs.umich.edu        FaultBase::invoke(tc);
1492800Ssaidi@eecs.umich.edu
1502800Ssaidi@eecs.umich.edu    // We've accessed the next page
1512800Ssaidi@eecs.umich.edu    if (vaddr > p->stack_min - PageBytes) {
1522800Ssaidi@eecs.umich.edu        p->stack_min -= PageBytes;
1532800Ssaidi@eecs.umich.edu        if (p->stack_base - p->stack_min > 8*1024*1024)
1542800Ssaidi@eecs.umich.edu            fatal("Over max stack size for one thread\n");
1552800Ssaidi@eecs.umich.edu        p->pTable->allocate(p->stack_min, PageBytes);
1562800Ssaidi@eecs.umich.edu        warn("Increasing stack size by one page.");
1572800Ssaidi@eecs.umich.edu    } else {
1582800Ssaidi@eecs.umich.edu        FaultBase::invoke(tc);
1592800Ssaidi@eecs.umich.edu    }
1602800Ssaidi@eecs.umich.edu}
1612800Ssaidi@eecs.umich.edu
1622447SN/A#endif
1632447SN/A} // namespace MipsISA
1642447SN/A
165