ua2005.cc revision 3827
12650Ssaidi@eecs.umich.edu/*
22650Ssaidi@eecs.umich.edu * Copyright (c) 2006 The Regents of The University of Michigan
32650Ssaidi@eecs.umich.edu * All rights reserved.
42650Ssaidi@eecs.umich.edu *
52650Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
62650Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
72650Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
82650Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
92650Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
102650Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
112650Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
122650Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
132650Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
142650Ssaidi@eecs.umich.edu * this software without specific prior written permission.
152650Ssaidi@eecs.umich.edu *
162650Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172650Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182650Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192650Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202650Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212650Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222650Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232650Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242650Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252650Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262650Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
282665Ssaidi@eecs.umich.edu * Authors: Ali Saidi
292650Ssaidi@eecs.umich.edu */
302650Ssaidi@eecs.umich.edu
313817Ssaidi@eecs.umich.edu#include "arch/sparc/miscregfile.hh"
323817Ssaidi@eecs.umich.edu#include "base/bitfield.hh"
333817Ssaidi@eecs.umich.edu#include "base/trace.hh"
343817Ssaidi@eecs.umich.edu#include "cpu/base.hh"
353817Ssaidi@eecs.umich.edu#include "cpu/thread_context.hh"
362650Ssaidi@eecs.umich.edu
373817Ssaidi@eecs.umich.eduusing namespace SparcISA;
383817Ssaidi@eecs.umich.edu
393817Ssaidi@eecs.umich.eduvoid
403817Ssaidi@eecs.umich.eduMiscRegFile::setFSRegWithEffect(int miscReg, const MiscReg &val,
412680Sktlim@umich.edu        ThreadContext *tc)
422650Ssaidi@eecs.umich.edu{
432650Ssaidi@eecs.umich.edu    int64_t time;
442650Ssaidi@eecs.umich.edu    switch (miscReg) {
452982Sstever@eecs.umich.edu        /* Full system only ASRs */
462650Ssaidi@eecs.umich.edu        case MISCREG_SOFTINT:
472650Ssaidi@eecs.umich.edu          // Check if we are going to interrupt because of something
482650Ssaidi@eecs.umich.edu          setReg(miscReg, val);
493827Shsul@eecs.umich.edu          tc->getCpuPtr()->checkInterrupts = true;
503817Ssaidi@eecs.umich.edu          break;
512650Ssaidi@eecs.umich.edu
522650Ssaidi@eecs.umich.edu        case MISCREG_SOFTINT_CLR:
532680Sktlim@umich.edu          return setRegWithEffect(miscReg, ~val & softint, tc);
542650Ssaidi@eecs.umich.edu        case MISCREG_SOFTINT_SET:
552680Sktlim@umich.edu          return setRegWithEffect(miscReg, val | softint, tc);
562650Ssaidi@eecs.umich.edu
572650Ssaidi@eecs.umich.edu        case MISCREG_TICK_CMPR:
582651Ssaidi@eecs.umich.edu          if (tickCompare == NULL)
592680Sktlim@umich.edu              tickCompare = new TickCompareEvent(this, tc);
602650Ssaidi@eecs.umich.edu          setReg(miscReg, val);
613817Ssaidi@eecs.umich.edu          if ((tick_cmpr & mask(63)) && tickCompare->scheduled())
623817Ssaidi@eecs.umich.edu                  tickCompare->deschedule();
633817Ssaidi@eecs.umich.edu          time = (tick_cmpr & mask(63)) - (tick & mask(63));
643817Ssaidi@eecs.umich.edu          if (!(tick_cmpr & ~mask(63)) && time > 0)
653817Ssaidi@eecs.umich.edu              tickCompare->schedule(time * tc->getCpuPtr()->cycles(1));
663817Ssaidi@eecs.umich.edu          break;
672650Ssaidi@eecs.umich.edu
682650Ssaidi@eecs.umich.edu        case MISCREG_STICK_CMPR:
692651Ssaidi@eecs.umich.edu          if (sTickCompare == NULL)
702680Sktlim@umich.edu              sTickCompare = new STickCompareEvent(this, tc);
712650Ssaidi@eecs.umich.edu          setReg(miscReg, val);
723817Ssaidi@eecs.umich.edu          if ((stick_cmpr & mask(63)) && sTickCompare->scheduled())
733817Ssaidi@eecs.umich.edu                  sTickCompare->deschedule();
743817Ssaidi@eecs.umich.edu          time = (stick_cmpr & mask(63)) - (stick & mask(63));
753817Ssaidi@eecs.umich.edu          if (!(stick_cmpr & ~mask(63)) && time > 0)
763817Ssaidi@eecs.umich.edu              sTickCompare->schedule(time * tc->getCpuPtr()->cycles(1));
773817Ssaidi@eecs.umich.edu          break;
782650Ssaidi@eecs.umich.edu
793827Shsul@eecs.umich.edu        case MISCREG_PSTATE:
803827Shsul@eecs.umich.edu          if (val & ie && !(pstate & ie)) {
813827Shsul@eecs.umich.edu              tc->getCpuPtr()->checkInterrupts = true;
823827Shsul@eecs.umich.edu          }
833827Shsul@eecs.umich.edu          setReg(miscReg, val);
843827Shsul@eecs.umich.edu
852650Ssaidi@eecs.umich.edu        case MISCREG_PIL:
863827Shsul@eecs.umich.edu          if (val < pil) {
873827Shsul@eecs.umich.edu              tc->getCpuPtr()->checkInterrupts = true;
883827Shsul@eecs.umich.edu          }
893817Ssaidi@eecs.umich.edu          setReg(miscReg, val);
903817Ssaidi@eecs.umich.edu          break;
912650Ssaidi@eecs.umich.edu
923817Ssaidi@eecs.umich.edu        case MISCREG_HVER:
933817Ssaidi@eecs.umich.edu          panic("Shouldn't be writing HVER\n");
942650Ssaidi@eecs.umich.edu
952650Ssaidi@eecs.umich.edu        case MISCREG_HTBA:
962650Ssaidi@eecs.umich.edu          // clear lower 7 bits on writes.
972650Ssaidi@eecs.umich.edu          setReg(miscReg, val & ULL(~0x7FFF));
983817Ssaidi@eecs.umich.edu          break;
992650Ssaidi@eecs.umich.edu
1002650Ssaidi@eecs.umich.edu        case MISCREG_HSTICK_CMPR:
1012651Ssaidi@eecs.umich.edu          if (hSTickCompare == NULL)
1022680Sktlim@umich.edu              hSTickCompare = new HSTickCompareEvent(this, tc);
1032650Ssaidi@eecs.umich.edu          setReg(miscReg, val);
1043817Ssaidi@eecs.umich.edu          if ((hstick_cmpr & mask(63)) && hSTickCompare->scheduled())
1053817Ssaidi@eecs.umich.edu                  hSTickCompare->deschedule();
1063817Ssaidi@eecs.umich.edu          time = (hstick_cmpr & mask(63)) - (stick & mask(63));
1073817Ssaidi@eecs.umich.edu          if (!(hstick_cmpr & ~mask(63)) && time > 0)
1083817Ssaidi@eecs.umich.edu              hSTickCompare->schedule(time * tc->getCpuPtr()->cycles(1));
1093817Ssaidi@eecs.umich.edu          break;
1103817Ssaidi@eecs.umich.edu
1113817Ssaidi@eecs.umich.edu        case MISCREG_HPSTATE:
1123827Shsul@eecs.umich.edu          // T1000 spec says impl. dependent val must always be 1
1133827Shsul@eecs.umich.edu          setReg(miscReg, val | id);
1143827Shsul@eecs.umich.edu
1153817Ssaidi@eecs.umich.edu        case MISCREG_HTSTATE:
1163817Ssaidi@eecs.umich.edu        case MISCREG_STRAND_STS_REG:
1173817Ssaidi@eecs.umich.edu          setReg(miscReg, val);
1183817Ssaidi@eecs.umich.edu          break;
1193817Ssaidi@eecs.umich.edu
1202650Ssaidi@eecs.umich.edu        default:
1213827Shsul@eecs.umich.edu          panic("Invalid write to FS misc register %s\n", getMiscRegName(miscReg));
1222650Ssaidi@eecs.umich.edu    }
1232650Ssaidi@eecs.umich.edu}
1242650Ssaidi@eecs.umich.edu
1252650Ssaidi@eecs.umich.eduMiscReg
1263817Ssaidi@eecs.umich.eduMiscRegFile::readFSRegWithEffect(int miscReg, ThreadContext * tc)
1272650Ssaidi@eecs.umich.edu{
1282650Ssaidi@eecs.umich.edu    switch (miscReg) {
1292650Ssaidi@eecs.umich.edu
1302982Sstever@eecs.umich.edu        /* Privileged registers. */
1312650Ssaidi@eecs.umich.edu        case MISCREG_SOFTINT:
1322650Ssaidi@eecs.umich.edu        case MISCREG_TICK_CMPR:
1332650Ssaidi@eecs.umich.edu        case MISCREG_STICK_CMPR:
1343817Ssaidi@eecs.umich.edu        case MISCREG_PIL:
1352650Ssaidi@eecs.umich.edu        case MISCREG_HPSTATE:
1362650Ssaidi@eecs.umich.edu        case MISCREG_HINTP:
1372650Ssaidi@eecs.umich.edu        case MISCREG_HTSTATE:
1383817Ssaidi@eecs.umich.edu        case MISCREG_STRAND_STS_REG:
1393817Ssaidi@eecs.umich.edu        case MISCREG_HSTICK_CMPR:
1403817Ssaidi@eecs.umich.edu           return readReg(miscReg) ;
1412650Ssaidi@eecs.umich.edu
1422650Ssaidi@eecs.umich.edu        case MISCREG_HTBA:
1432650Ssaidi@eecs.umich.edu          return readReg(miscReg) & ULL(~0x7FFF);
1442650Ssaidi@eecs.umich.edu        case MISCREG_HVER:
1452650Ssaidi@eecs.umich.edu          return NWindows | MaxTL << 8 | MaxGL << 16;
1462650Ssaidi@eecs.umich.edu
1472650Ssaidi@eecs.umich.edu        default:
1483817Ssaidi@eecs.umich.edu          panic("Invalid read to FS misc register\n");
1492650Ssaidi@eecs.umich.edu    }
1502650Ssaidi@eecs.umich.edu}
1513817Ssaidi@eecs.umich.edu/*
1523817Ssaidi@eecs.umich.edu        In Niagra STICK==TICK so this isn't needed
1533817Ssaidi@eecs.umich.edu        case MISCREG_STICK:
1543817Ssaidi@eecs.umich.edu          SparcSystem *sys;
1553817Ssaidi@eecs.umich.edu          sys = dynamic_cast<SparcSystem*>(tc->getSystemPtr());
1563817Ssaidi@eecs.umich.edu          assert(sys != NULL);
1573817Ssaidi@eecs.umich.edu          return curTick/Clock::Int::ns - sys->sysTick | (stick & ~(mask(63)));
1583817Ssaidi@eecs.umich.edu*/
1593817Ssaidi@eecs.umich.edu
1603817Ssaidi@eecs.umich.edu
1612650Ssaidi@eecs.umich.edu
1622651Ssaidi@eecs.umich.eduvoid
1632680Sktlim@umich.eduMiscRegFile::processTickCompare(ThreadContext *tc)
1642651Ssaidi@eecs.umich.edu{
1652651Ssaidi@eecs.umich.edu    panic("tick compare not implemented\n");
1662651Ssaidi@eecs.umich.edu}
1672651Ssaidi@eecs.umich.edu
1682651Ssaidi@eecs.umich.eduvoid
1692680Sktlim@umich.eduMiscRegFile::processSTickCompare(ThreadContext *tc)
1702651Ssaidi@eecs.umich.edu{
1712651Ssaidi@eecs.umich.edu    panic("tick compare not implemented\n");
1722651Ssaidi@eecs.umich.edu}
1732651Ssaidi@eecs.umich.edu
1742651Ssaidi@eecs.umich.eduvoid
1752680Sktlim@umich.eduMiscRegFile::processHSTickCompare(ThreadContext *tc)
1762651Ssaidi@eecs.umich.edu{
1772651Ssaidi@eecs.umich.edu    panic("tick compare not implemented\n");
1782651Ssaidi@eecs.umich.edu}
1792650Ssaidi@eecs.umich.edu
180