isa.cc revision 7442
14120Sgblack@eecs.umich.edu/*
24120Sgblack@eecs.umich.edu * Copyright (c) 2010 ARM Limited
37087Snate@binkert.org * All rights reserved
47087Snate@binkert.org *
57087Snate@binkert.org * The license below extends only to copyright in the software and shall
67087Snate@binkert.org * not be construed as granting a license to any other intellectual
77087Snate@binkert.org * property including but not limited to intellectual property relating
87087Snate@binkert.org * to a hardware implementation of the functionality of the software
97087Snate@binkert.org * licensed hereunder.  You may use the software subject to the license
107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated
117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software,
127087Snate@binkert.org * modified or unmodified, in source code or in binary form.
137087Snate@binkert.org *
147087Snate@binkert.org * Redistribution and use in source and binary forms, with or without
154120Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
164120Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
174120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
184120Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
194120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
204120Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
214120Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
224120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
234120Sgblack@eecs.umich.edu * this software without specific prior written permission.
244120Sgblack@eecs.umich.edu *
254120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
264120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
274120Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
284120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
294120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
304120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
314120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
324120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
334120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
344120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
354120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
364120Sgblack@eecs.umich.edu *
374120Sgblack@eecs.umich.edu * Authors: Gabe Black
384120Sgblack@eecs.umich.edu *          Ali Saidi
394120Sgblack@eecs.umich.edu */
404120Sgblack@eecs.umich.edu
414120Sgblack@eecs.umich.edu#include "arch/arm/isa.hh"
424120Sgblack@eecs.umich.edu
434202Sbinkertn@umich.edunamespace ArmISA
445069Sgblack@eecs.umich.edu{
454202Sbinkertn@umich.edu
465659Sgblack@eecs.umich.eduvoid
479022Sgblack@eecs.umich.eduISA::clear()
489023Sgblack@eecs.umich.edu{
494601Sgblack@eecs.umich.edu    SCTLR sctlr_rst = miscRegs[MISCREG_SCTLR_RST];
505124Sgblack@eecs.umich.edu
517966Sgblack@eecs.umich.edu    memset(miscRegs, 0, sizeof(miscRegs));
525083Sgblack@eecs.umich.edu    CPSR cpsr = 0;
534679Sgblack@eecs.umich.edu    cpsr.mode = MODE_USER;
546515Sgblack@eecs.umich.edu    miscRegs[MISCREG_CPSR] = cpsr;
555083Sgblack@eecs.umich.edu    updateRegMap(cpsr);
564679Sgblack@eecs.umich.edu
574679Sgblack@eecs.umich.edu    SCTLR sctlr = 0;
588745Sgblack@eecs.umich.edu    sctlr.nmfi = (bool)sctlr_rst.nmfi;
596313Sgblack@eecs.umich.edu    sctlr.v = (bool)sctlr_rst.v;
608771Sgblack@eecs.umich.edu    sctlr.u    = 1;
618771Sgblack@eecs.umich.edu    sctlr.xp = 1;
628771Sgblack@eecs.umich.edu    sctlr.rao2 = 1;
638771Sgblack@eecs.umich.edu    sctlr.rao3 = 1;
646365Sgblack@eecs.umich.edu    sctlr.rao4 = 1;
655124Sgblack@eecs.umich.edu    miscRegs[MISCREG_SCTLR] = sctlr;
668752Sgblack@eecs.umich.edu    miscRegs[MISCREG_SCTLR_RST] = sctlr_rst;
678771Sgblack@eecs.umich.edu
684202Sbinkertn@umich.edu
698771Sgblack@eecs.umich.edu    /*
708771Sgblack@eecs.umich.edu     * Technically this should be 0, but we don't support those
714997Sgblack@eecs.umich.edu     * settings.
727624Sgblack@eecs.umich.edu     */
735135Sgblack@eecs.umich.edu    CPACR cpacr = 0;
748753Sgblack@eecs.umich.edu    // Enable CP 10, 11
754997Sgblack@eecs.umich.edu    cpacr.cp10 = 0x3;
769384SAndreas.Sandberg@arm.com    cpacr.cp11 = 0x3;
778745Sgblack@eecs.umich.edu    miscRegs[MISCREG_CPACR] = cpacr;
786365Sgblack@eecs.umich.edu
798771Sgblack@eecs.umich.edu    /* Start with an event in the mailbox */
808740Sgblack@eecs.umich.edu    miscRegs[MISCREG_SEV_MAILBOX] = 1;
816365Sgblack@eecs.umich.edu
828740Sgblack@eecs.umich.edu    /*
838745Sgblack@eecs.umich.edu     * Implemented = '5' from "M5",
848752Sgblack@eecs.umich.edu     * Variant = 0,
858752Sgblack@eecs.umich.edu     */
869023Sgblack@eecs.umich.edu    miscRegs[MISCREG_MIDR] =
878335Snate@binkert.org        (0x35 << 24) | //Implementor is '5' from "M5"
884120Sgblack@eecs.umich.edu        (0 << 20)    | //Variant
895069Sgblack@eecs.umich.edu        (0xf << 16)  | //Architecture from CPUID scheme
905081Sgblack@eecs.umich.edu        (0 << 4)     | //Primary part number
915081Sgblack@eecs.umich.edu        (0 << 0)     | //Revision
925081Sgblack@eecs.umich.edu        0;
935081Sgblack@eecs.umich.edu
945081Sgblack@eecs.umich.edu    // Separate Instruction and Data TLBs.
955081Sgblack@eecs.umich.edu    miscRegs[MISCREG_TLBTR] = 1;
965081Sgblack@eecs.umich.edu
975081Sgblack@eecs.umich.edu    MVFR0 mvfr0 = 0;
985081Sgblack@eecs.umich.edu    mvfr0.advSimdRegisters = 2;
995081Sgblack@eecs.umich.edu    mvfr0.singlePrecision = 2;
1005081Sgblack@eecs.umich.edu    mvfr0.doublePrecision = 2;
1015081Sgblack@eecs.umich.edu    mvfr0.vfpExceptionTrapping = 0;
1025081Sgblack@eecs.umich.edu    mvfr0.divide = 1;
1035081Sgblack@eecs.umich.edu    mvfr0.squareRoot = 1;
1045081Sgblack@eecs.umich.edu    mvfr0.shortVectors = 1;
1055081Sgblack@eecs.umich.edu    mvfr0.roundingModes = 1;
1065081Sgblack@eecs.umich.edu    miscRegs[MISCREG_MVFR0] = mvfr0;
1075081Sgblack@eecs.umich.edu
1085081Sgblack@eecs.umich.edu    MVFR1 mvfr1 = 0;
1095081Sgblack@eecs.umich.edu    mvfr1.flushToZero = 1;
1105081Sgblack@eecs.umich.edu    mvfr1.defaultNaN = 1;
1115081Sgblack@eecs.umich.edu    mvfr1.advSimdLoadStore = 1;
1125081Sgblack@eecs.umich.edu    mvfr1.advSimdInteger = 1;
1135081Sgblack@eecs.umich.edu    mvfr1.advSimdSinglePrecision = 1;
1145081Sgblack@eecs.umich.edu    mvfr1.advSimdHalfPrecision = 1;
1155081Sgblack@eecs.umich.edu    mvfr1.vfpHalfPrecision = 1;
1165081Sgblack@eecs.umich.edu    miscRegs[MISCREG_MVFR1] = mvfr1;
1175081Sgblack@eecs.umich.edu
1185081Sgblack@eecs.umich.edu    miscRegs[MISCREG_MPIDR] = 0;
1195081Sgblack@eecs.umich.edu
1205081Sgblack@eecs.umich.edu    // Reset values of PRRR and NMRR are implementation dependent
1215081Sgblack@eecs.umich.edu
1225081Sgblack@eecs.umich.edu    miscRegs[MISCREG_PRRR] =
1235081Sgblack@eecs.umich.edu        (1 << 19) | // 19
1245081Sgblack@eecs.umich.edu        (0 << 18) | // 18
1255081Sgblack@eecs.umich.edu        (0 << 17) | // 17
1265081Sgblack@eecs.umich.edu        (1 << 16) | // 16
1275081Sgblack@eecs.umich.edu        (2 << 14) | // 15:14
1285081Sgblack@eecs.umich.edu        (0 << 12) | // 13:12
1295081Sgblack@eecs.umich.edu        (2 << 10) | // 11:10
1305081Sgblack@eecs.umich.edu        (2 << 8)  | // 9:8
1315081Sgblack@eecs.umich.edu        (2 << 6)  | // 7:6
1325081Sgblack@eecs.umich.edu        (2 << 4)  | // 5:4
1335081Sgblack@eecs.umich.edu        (1 << 2)  | // 3:2
1345081Sgblack@eecs.umich.edu        0;          // 1:0
1355081Sgblack@eecs.umich.edu    miscRegs[MISCREG_NMRR] =
1365081Sgblack@eecs.umich.edu        (1 << 30) | // 31:30
1375081Sgblack@eecs.umich.edu        (0 << 26) | // 27:26
1385081Sgblack@eecs.umich.edu        (0 << 24) | // 25:24
1395081Sgblack@eecs.umich.edu        (3 << 22) | // 23:22
1405081Sgblack@eecs.umich.edu        (2 << 20) | // 21:20
1415081Sgblack@eecs.umich.edu        (0 << 18) | // 19:18
1425081Sgblack@eecs.umich.edu        (0 << 16) | // 17:16
1435081Sgblack@eecs.umich.edu        (1 << 14) | // 15:14
1445081Sgblack@eecs.umich.edu        (0 << 12) | // 13:12
1455680Sgblack@eecs.umich.edu        (2 << 10) | // 11:10
1465081Sgblack@eecs.umich.edu        (0 << 8)  | // 9:8
1475933Sgblack@eecs.umich.edu        (3 << 6)  | // 7:6
1485173Sgblack@eecs.umich.edu        (2 << 4)  | // 5:4
1495359Sgblack@eecs.umich.edu        (0 << 2)  | // 3:2
1505081Sgblack@eecs.umich.edu        0;          // 1:0
1515149Sgblack@eecs.umich.edu
1525298Sgblack@eecs.umich.edu    //XXX We need to initialize the rest of the state.
1535081Sgblack@eecs.umich.edu}
1545081Sgblack@eecs.umich.edu
1555081Sgblack@eecs.umich.eduMiscReg
1565081Sgblack@eecs.umich.eduISA::readMiscRegNoEffect(int misc_reg)
1575081Sgblack@eecs.umich.edu{
1585081Sgblack@eecs.umich.edu    assert(misc_reg < NumMiscRegs);
1595081Sgblack@eecs.umich.edu    if (misc_reg == MISCREG_SPSR) {
1605081Sgblack@eecs.umich.edu        CPSR cpsr = miscRegs[MISCREG_CPSR];
1615081Sgblack@eecs.umich.edu        switch (cpsr.mode) {
1625081Sgblack@eecs.umich.edu          case MODE_USER:
1635081Sgblack@eecs.umich.edu            return miscRegs[MISCREG_SPSR];
1645081Sgblack@eecs.umich.edu          case MODE_FIQ:
1655081Sgblack@eecs.umich.edu            return miscRegs[MISCREG_SPSR_FIQ];
1665081Sgblack@eecs.umich.edu          case MODE_IRQ:
1675081Sgblack@eecs.umich.edu            return miscRegs[MISCREG_SPSR_IRQ];
1685081Sgblack@eecs.umich.edu          case MODE_SVC:
1695081Sgblack@eecs.umich.edu            return miscRegs[MISCREG_SPSR_SVC];
1705081Sgblack@eecs.umich.edu          case MODE_MON:
1715081Sgblack@eecs.umich.edu            return miscRegs[MISCREG_SPSR_MON];
1725081Sgblack@eecs.umich.edu          case MODE_ABORT:
1735081Sgblack@eecs.umich.edu            return miscRegs[MISCREG_SPSR_ABT];
1745081Sgblack@eecs.umich.edu          case MODE_UNDEFINED:
1755081Sgblack@eecs.umich.edu            return miscRegs[MISCREG_SPSR_UND];
1765081Sgblack@eecs.umich.edu          default:
1775081Sgblack@eecs.umich.edu            return miscRegs[MISCREG_SPSR];
1785081Sgblack@eecs.umich.edu        }
1795081Sgblack@eecs.umich.edu    }
1805081Sgblack@eecs.umich.edu    return miscRegs[misc_reg];
1815081Sgblack@eecs.umich.edu}
1825081Sgblack@eecs.umich.edu
1835081Sgblack@eecs.umich.edu
1845081Sgblack@eecs.umich.eduMiscReg
1855081Sgblack@eecs.umich.eduISA::readMiscReg(int misc_reg, ThreadContext *tc)
1865081Sgblack@eecs.umich.edu{
1875081Sgblack@eecs.umich.edu    if (misc_reg == MISCREG_CPSR) {
1885081Sgblack@eecs.umich.edu        CPSR cpsr = miscRegs[misc_reg];
1895081Sgblack@eecs.umich.edu        Addr pc = tc->readPC();
1905081Sgblack@eecs.umich.edu        if (pc & (ULL(1) << PcJBitShift))
1915081Sgblack@eecs.umich.edu            cpsr.j = 1;
1925081Sgblack@eecs.umich.edu        else
1935081Sgblack@eecs.umich.edu            cpsr.j = 0;
1945081Sgblack@eecs.umich.edu        if (pc & (ULL(1) << PcTBitShift))
1955081Sgblack@eecs.umich.edu            cpsr.t = 1;
1965081Sgblack@eecs.umich.edu        else
1975081Sgblack@eecs.umich.edu            cpsr.t = 0;
1985081Sgblack@eecs.umich.edu        return cpsr;
1995081Sgblack@eecs.umich.edu    }
2005081Sgblack@eecs.umich.edu    if (misc_reg >= MISCREG_CP15_UNIMP_START &&
2015081Sgblack@eecs.umich.edu        misc_reg < MISCREG_CP15_END) {
2025081Sgblack@eecs.umich.edu        panic("Unimplemented CP15 register %s read.\n",
2035081Sgblack@eecs.umich.edu              miscRegName[misc_reg]);
2045081Sgblack@eecs.umich.edu    }
2055081Sgblack@eecs.umich.edu    switch (misc_reg) {
2065081Sgblack@eecs.umich.edu      case MISCREG_CLIDR:
2075081Sgblack@eecs.umich.edu        warn("The clidr register always reports 0 caches.\n");
2085081Sgblack@eecs.umich.edu        break;
2095081Sgblack@eecs.umich.edu      case MISCREG_CCSIDR:
2105081Sgblack@eecs.umich.edu        warn("The ccsidr register isn't implemented and "
2115081Sgblack@eecs.umich.edu                "always reads as 0.\n");
2125081Sgblack@eecs.umich.edu        break;
2135081Sgblack@eecs.umich.edu      case MISCREG_ID_PFR0:
2145081Sgblack@eecs.umich.edu        return 0x1031; // ThumbEE | !Jazelle | Thumb | ARM
2155081Sgblack@eecs.umich.edu    }
2165081Sgblack@eecs.umich.edu    return readMiscRegNoEffect(misc_reg);
2175081Sgblack@eecs.umich.edu}
2185081Sgblack@eecs.umich.edu
2195081Sgblack@eecs.umich.eduvoid
2205081Sgblack@eecs.umich.eduISA::setMiscRegNoEffect(int misc_reg, const MiscReg &val)
2215081Sgblack@eecs.umich.edu{
2225081Sgblack@eecs.umich.edu    assert(misc_reg < NumMiscRegs);
2235081Sgblack@eecs.umich.edu    if (misc_reg == MISCREG_SPSR) {
2245081Sgblack@eecs.umich.edu        CPSR cpsr = miscRegs[MISCREG_CPSR];
2255081Sgblack@eecs.umich.edu        switch (cpsr.mode) {
2265081Sgblack@eecs.umich.edu          case MODE_USER:
2275081Sgblack@eecs.umich.edu            miscRegs[MISCREG_SPSR] = val;
2285081Sgblack@eecs.umich.edu            return;
2295081Sgblack@eecs.umich.edu          case MODE_FIQ:
2305081Sgblack@eecs.umich.edu            miscRegs[MISCREG_SPSR_FIQ] = val;
2315081Sgblack@eecs.umich.edu            return;
2325081Sgblack@eecs.umich.edu          case MODE_IRQ:
2335081Sgblack@eecs.umich.edu            miscRegs[MISCREG_SPSR_IRQ] = val;
2345081Sgblack@eecs.umich.edu            return;
2355081Sgblack@eecs.umich.edu          case MODE_SVC:
2365081Sgblack@eecs.umich.edu            miscRegs[MISCREG_SPSR_SVC] = val;
2375081Sgblack@eecs.umich.edu            return;
2385081Sgblack@eecs.umich.edu          case MODE_MON:
2395081Sgblack@eecs.umich.edu            miscRegs[MISCREG_SPSR_MON] = val;
2405081Sgblack@eecs.umich.edu            return;
2415081Sgblack@eecs.umich.edu          case MODE_ABORT:
2425081Sgblack@eecs.umich.edu            miscRegs[MISCREG_SPSR_ABT] = val;
2435081Sgblack@eecs.umich.edu            return;
2445081Sgblack@eecs.umich.edu          case MODE_UNDEFINED:
2455081Sgblack@eecs.umich.edu            miscRegs[MISCREG_SPSR_UND] = val;
2465081Sgblack@eecs.umich.edu            return;
2475081Sgblack@eecs.umich.edu          default:
2485081Sgblack@eecs.umich.edu            miscRegs[MISCREG_SPSR] = val;
2495081Sgblack@eecs.umich.edu            return;
2505081Sgblack@eecs.umich.edu        }
2515081Sgblack@eecs.umich.edu    }
2525081Sgblack@eecs.umich.edu    miscRegs[misc_reg] = val;
2535081Sgblack@eecs.umich.edu}
2545081Sgblack@eecs.umich.edu
2555081Sgblack@eecs.umich.eduvoid
2565081Sgblack@eecs.umich.eduISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
2575081Sgblack@eecs.umich.edu{
2585081Sgblack@eecs.umich.edu    MiscReg newVal = val;
2595081Sgblack@eecs.umich.edu    if (misc_reg == MISCREG_CPSR) {
2605081Sgblack@eecs.umich.edu        updateRegMap(val);
2615081Sgblack@eecs.umich.edu        CPSR cpsr = val;
2625081Sgblack@eecs.umich.edu        DPRINTF(Arm, "Updating CPSR to %#x f:%d i:%d a:%d mode:%#x\n",
2635081Sgblack@eecs.umich.edu                cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode);
2645081Sgblack@eecs.umich.edu        Addr npc = tc->readNextPC() & ~PcModeMask;
2655081Sgblack@eecs.umich.edu        if (cpsr.j)
2665081Sgblack@eecs.umich.edu            npc = npc | (ULL(1) << PcJBitShift);
2675081Sgblack@eecs.umich.edu        if (cpsr.t)
2685081Sgblack@eecs.umich.edu            npc = npc | (ULL(1) << PcTBitShift);
2695081Sgblack@eecs.umich.edu
2705081Sgblack@eecs.umich.edu        tc->setNextPC(npc);
2715081Sgblack@eecs.umich.edu    } else if (misc_reg >= MISCREG_CP15_UNIMP_START &&
2725081Sgblack@eecs.umich.edu        misc_reg < MISCREG_CP15_END) {
2735081Sgblack@eecs.umich.edu        panic("Unimplemented CP15 register %s wrote with %#x.\n",
2745081Sgblack@eecs.umich.edu              miscRegName[misc_reg], val);
2755081Sgblack@eecs.umich.edu    } else {
2765081Sgblack@eecs.umich.edu        switch (misc_reg) {
2775081Sgblack@eecs.umich.edu          case MISCREG_ITSTATE:
2785081Sgblack@eecs.umich.edu            {
2795081Sgblack@eecs.umich.edu                ITSTATE itstate = newVal;
2805081Sgblack@eecs.umich.edu                CPSR cpsr = miscRegs[MISCREG_CPSR];
2815081Sgblack@eecs.umich.edu                cpsr.it1 = itstate.bottom2;
2825081Sgblack@eecs.umich.edu                cpsr.it2 = itstate.top6;
2835081Sgblack@eecs.umich.edu                miscRegs[MISCREG_CPSR] = cpsr;
2845081Sgblack@eecs.umich.edu                DPRINTF(MiscRegs,
2855081Sgblack@eecs.umich.edu                        "Updating ITSTATE -> %#x in CPSR -> %#x.\n",
2865081Sgblack@eecs.umich.edu                        (uint8_t)itstate, (uint32_t)cpsr);
2875081Sgblack@eecs.umich.edu            }
2885081Sgblack@eecs.umich.edu            break;
2895081Sgblack@eecs.umich.edu          case MISCREG_CPACR:
2905081Sgblack@eecs.umich.edu            {
2915081Sgblack@eecs.umich.edu                CPACR newCpacr = 0;
2925081Sgblack@eecs.umich.edu                CPACR valCpacr = val;
2935081Sgblack@eecs.umich.edu                newCpacr.cp10 = valCpacr.cp10;
2945081Sgblack@eecs.umich.edu                newCpacr.cp11 = valCpacr.cp11;
2955081Sgblack@eecs.umich.edu                if (newCpacr.cp10 != 0x3 || newCpacr.cp11 != 3) {
2965081Sgblack@eecs.umich.edu                    panic("Disabling coprocessors isn't implemented.\n");
2975081Sgblack@eecs.umich.edu                }
2985081Sgblack@eecs.umich.edu                newVal = newCpacr;
2995081Sgblack@eecs.umich.edu            }
3005081Sgblack@eecs.umich.edu            break;
3015081Sgblack@eecs.umich.edu          case MISCREG_CSSELR:
3025081Sgblack@eecs.umich.edu            warn("The csselr register isn't implemented.\n");
3035081Sgblack@eecs.umich.edu            break;
3045081Sgblack@eecs.umich.edu          case MISCREG_FPSCR:
3055081Sgblack@eecs.umich.edu            {
3065081Sgblack@eecs.umich.edu                const uint32_t ones = (uint32_t)(-1);
3075081Sgblack@eecs.umich.edu                FPSCR fpscrMask = 0;
3085069Sgblack@eecs.umich.edu                fpscrMask.ioc = ones;
3094202Sbinkertn@umich.edu                fpscrMask.dzc = ones;
3104202Sbinkertn@umich.edu                fpscrMask.ofc = ones;
3114202Sbinkertn@umich.edu                fpscrMask.ufc = ones;
3125069Sgblack@eecs.umich.edu                fpscrMask.ixc = ones;
3135069Sgblack@eecs.umich.edu                fpscrMask.idc = ones;
3145069Sgblack@eecs.umich.edu                fpscrMask.len = ones;
3155069Sgblack@eecs.umich.edu                fpscrMask.stride = ones;
3164202Sbinkertn@umich.edu                fpscrMask.rMode = ones;
3174202Sbinkertn@umich.edu                fpscrMask.fz = ones;
318                fpscrMask.dn = ones;
319                fpscrMask.ahp = ones;
320                fpscrMask.qc = ones;
321                fpscrMask.v = ones;
322                fpscrMask.c = ones;
323                fpscrMask.z = ones;
324                fpscrMask.n = ones;
325                newVal = (newVal & (uint32_t)fpscrMask) |
326                         (miscRegs[MISCREG_FPSCR] & ~(uint32_t)fpscrMask);
327            }
328            break;
329          case MISCREG_FPEXC:
330            {
331                const uint32_t fpexcMask = 0x60000000;
332                newVal = (newVal & fpexcMask) |
333                         (miscRegs[MISCREG_FPEXC] & ~fpexcMask);
334            }
335            break;
336          case MISCREG_SCTLR:
337            {
338                DPRINTF(MiscRegs, "Writing SCTLR: %#x\n", newVal);
339                SCTLR sctlr = miscRegs[MISCREG_SCTLR];
340                SCTLR new_sctlr = newVal;
341                new_sctlr.nmfi =  (bool)sctlr.nmfi;
342                miscRegs[MISCREG_SCTLR] = (MiscReg)new_sctlr;
343                return;
344            }
345          case MISCREG_TLBTR:
346          case MISCREG_MVFR0:
347          case MISCREG_MVFR1:
348          case MISCREG_MPIDR:
349          case MISCREG_FPSID:
350            return;
351          case MISCREG_TLBIALLIS:
352          case MISCREG_TLBIALL:
353            warn("Need to flush all TLBs in MP\n");
354            tc->getITBPtr()->flushAll();
355            tc->getDTBPtr()->flushAll();
356            return;
357          case MISCREG_ITLBIALL:
358            tc->getITBPtr()->flushAll();
359            return;
360          case MISCREG_DTLBIALL:
361            tc->getDTBPtr()->flushAll();
362            return;
363          case MISCREG_TLBIMVAIS:
364          case MISCREG_TLBIMVA:
365            warn("Need to flush all TLBs in MP\n");
366            tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
367                    bits(newVal, 7,0));
368            tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
369                    bits(newVal, 7,0));
370            return;
371          case MISCREG_TLBIASIDIS:
372          case MISCREG_TLBIASID:
373            warn("Need to flush all TLBs in MP\n");
374            tc->getITBPtr()->flushAsid(bits(newVal, 7,0));
375            tc->getDTBPtr()->flushAsid(bits(newVal, 7,0));
376            return;
377          case MISCREG_TLBIMVAAIS:
378          case MISCREG_TLBIMVAA:
379            warn("Need to flush all TLBs in MP\n");
380            tc->getITBPtr()->flushMva(mbits(newVal, 31,12));
381            tc->getDTBPtr()->flushMva(mbits(newVal, 31,12));
382            return;
383          case MISCREG_ITLBIMVA:
384            tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
385                    bits(newVal, 7,0));
386            return;
387          case MISCREG_DTLBIMVA:
388            tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
389                    bits(newVal, 7,0));
390            return;
391          case MISCREG_ITLBIASID:
392            tc->getITBPtr()->flushAsid(bits(newVal, 7,0));
393            return;
394          case MISCREG_DTLBIASID:
395            tc->getDTBPtr()->flushAsid(bits(newVal, 7,0));
396            return;
397          case MISCREG_V2PCWPR:
398          case MISCREG_V2PCWPW:
399          case MISCREG_V2PCWUR:
400          case MISCREG_V2PCWUW:
401          case MISCREG_V2POWPR:
402          case MISCREG_V2POWPW:
403          case MISCREG_V2POWUR:
404          case MISCREG_V2POWUW:
405            {
406              RequestPtr req = new Request;
407              unsigned flags;
408              BaseTLB::Mode mode;
409              Fault fault;
410              switch(misc_reg) {
411                  case MISCREG_V2PCWPR:
412                      flags = TLB::MustBeOne;
413                      mode = BaseTLB::Read;
414                      break;
415                  case MISCREG_V2PCWPW:
416                      flags = TLB::MustBeOne;
417                      mode = BaseTLB::Write;
418                      break;
419                  case MISCREG_V2PCWUR:
420                      flags = TLB::MustBeOne | TLB::UserMode;
421                      mode = BaseTLB::Read;
422                      break;
423                  case MISCREG_V2PCWUW:
424                      flags = TLB::MustBeOne | TLB::UserMode;
425                      mode = BaseTLB::Write;
426                      break;
427                  default:
428                      panic("Security Extensions not implemented!");
429              }
430              req->setVirt(0, val, 1, flags, tc->readPC());
431              fault = tc->getDTBPtr()->translateAtomic(req, tc, mode);
432              if (fault == NoFault) {
433                  miscRegs[MISCREG_PAR] =
434                      (req->getPaddr() & 0xfffff000) |
435                      (tc->getDTBPtr()->getAttr() );
436                  DPRINTF(MiscRegs,
437                          "MISCREG: Translated addr 0x%08x: PAR: 0x%08x\n",
438                          val, miscRegs[MISCREG_PAR]);
439              }
440              else {
441                  // Set fault bit and FSR
442                  FSR fsr = miscRegs[MISCREG_DFSR];
443                  miscRegs[MISCREG_PAR] =
444                      (fsr.ext << 6) |
445                      (fsr.fsHigh << 5) |
446                      (fsr.fsLow << 1) |
447                      0x1; // F bit
448              }
449              return;
450            }
451        }
452    }
453    setMiscRegNoEffect(misc_reg, newVal);
454}
455
456}
457