isa.cc revision 7583
12381SN/A/*
28853Sandreas.hansson@arm.com * Copyright (c) 2010 ARM Limited
38711Sandreas.hansson@arm.com * All rights reserved
48711Sandreas.hansson@arm.com *
58711Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
68711Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
78711Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
88711Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
98711Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
108711Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
118711Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
128711Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
138711Sandreas.hansson@arm.com *
142381SN/A * Redistribution and use in source and binary forms, with or without
152381SN/A * modification, are permitted provided that the following conditions are
162381SN/A * met: redistributions of source code must retain the above copyright
172381SN/A * notice, this list of conditions and the following disclaimer;
182381SN/A * redistributions in binary form must reproduce the above copyright
192381SN/A * notice, this list of conditions and the following disclaimer in the
202381SN/A * documentation and/or other materials provided with the distribution;
212381SN/A * neither the name of the copyright holders nor the names of its
222381SN/A * contributors may be used to endorse or promote products derived from
232381SN/A * this software without specific prior written permission.
242381SN/A *
252381SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
262381SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
272381SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
282381SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
292381SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
302381SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
312381SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
322381SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
332381SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
342381SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
352381SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
362381SN/A *
372381SN/A * Authors: Gabe Black
382381SN/A *          Ali Saidi
392665Ssaidi@eecs.umich.edu */
402665Ssaidi@eecs.umich.edu
418853Sandreas.hansson@arm.com#include "arch/arm/isa.hh"
428922Swilliam.wang@arm.com
432381SN/Anamespace ArmISA
442381SN/A{
452381SN/A
462381SN/Avoid
478922Swilliam.wang@arm.comISA::clear()
482381SN/A{
492381SN/A    SCTLR sctlr_rst = miscRegs[MISCREG_SCTLR_RST];
502381SN/A
512381SN/A    memset(miscRegs, 0, sizeof(miscRegs));
522381SN/A    CPSR cpsr = 0;
532381SN/A    cpsr.mode = MODE_USER;
542381SN/A    miscRegs[MISCREG_CPSR] = cpsr;
552381SN/A    updateRegMap(cpsr);
562381SN/A
572381SN/A    SCTLR sctlr = 0;
588922Swilliam.wang@arm.com    sctlr.nmfi = (bool)sctlr_rst.nmfi;
598922Swilliam.wang@arm.com    sctlr.v = (bool)sctlr_rst.v;
602407SN/A    sctlr.u    = 1;
612407SN/A    sctlr.xp = 1;
622407SN/A    sctlr.rao2 = 1;
632407SN/A    sctlr.rao3 = 1;
642407SN/A    sctlr.rao4 = 1;
652407SN/A    miscRegs[MISCREG_SCTLR] = sctlr;
662521SN/A    miscRegs[MISCREG_SCTLR_RST] = sctlr_rst;
672407SN/A
683401Sktlim@umich.edu
693401Sktlim@umich.edu    /*
702381SN/A     * Technically this should be 0, but we don't support those
718922Swilliam.wang@arm.com     * settings.
728922Swilliam.wang@arm.com     */
739087Sandreas.hansson@arm.com    CPACR cpacr = 0;
742381SN/A    // Enable CP 10, 11
758708Sandreas.hansson@arm.com    cpacr.cp10 = 0x3;
762381SN/A    cpacr.cp11 = 0x3;
778922Swilliam.wang@arm.com    miscRegs[MISCREG_CPACR] = cpacr;
788922Swilliam.wang@arm.com
798922Swilliam.wang@arm.com    /* Start with an event in the mailbox */
808922Swilliam.wang@arm.com    miscRegs[MISCREG_SEV_MAILBOX] = 1;
818922Swilliam.wang@arm.com
828922Swilliam.wang@arm.com    /*
835476Snate@binkert.org     * Implemented = '5' from "M5",
842640Sstever@eecs.umich.edu     * Variant = 0,
858965Sandreas.hansson@arm.com     */
868965Sandreas.hansson@arm.com    miscRegs[MISCREG_MIDR] =
879031Sandreas.hansson@arm.com        (0x35 << 24) | //Implementor is '5' from "M5"
888965Sandreas.hansson@arm.com        (0 << 20)    | //Variant
899031Sandreas.hansson@arm.com        (0xf << 16)  | //Architecture from CPUID scheme
908965Sandreas.hansson@arm.com        (0 << 4)     | //Primary part number
918922Swilliam.wang@arm.com        (0 << 0)     | //Revision
928922Swilliam.wang@arm.com        0;
938922Swilliam.wang@arm.com
948922Swilliam.wang@arm.com    // Separate Instruction and Data TLBs.
958922Swilliam.wang@arm.com    miscRegs[MISCREG_TLBTR] = 1;
968922Swilliam.wang@arm.com
978922Swilliam.wang@arm.com    MVFR0 mvfr0 = 0;
988922Swilliam.wang@arm.com    mvfr0.advSimdRegisters = 2;
998965Sandreas.hansson@arm.com    mvfr0.singlePrecision = 2;
1008922Swilliam.wang@arm.com    mvfr0.doublePrecision = 2;
1019031Sandreas.hansson@arm.com    mvfr0.vfpExceptionTrapping = 0;
1028922Swilliam.wang@arm.com    mvfr0.divide = 1;
1038922Swilliam.wang@arm.com    mvfr0.squareRoot = 1;
1048922Swilliam.wang@arm.com    mvfr0.shortVectors = 1;
1058922Swilliam.wang@arm.com    mvfr0.roundingModes = 1;
1068922Swilliam.wang@arm.com    miscRegs[MISCREG_MVFR0] = mvfr0;
1073401Sktlim@umich.edu
1082381SN/A    MVFR1 mvfr1 = 0;
1092640Sstever@eecs.umich.edu    mvfr1.flushToZero = 1;
1102640Sstever@eecs.umich.edu    mvfr1.defaultNaN = 1;
1118922Swilliam.wang@arm.com    mvfr1.advSimdLoadStore = 1;
1124190Ssaidi@eecs.umich.edu    mvfr1.advSimdInteger = 1;
1138965Sandreas.hansson@arm.com    mvfr1.advSimdSinglePrecision = 1;
1149031Sandreas.hansson@arm.com    mvfr1.advSimdHalfPrecision = 1;
1158965Sandreas.hansson@arm.com    mvfr1.vfpHalfPrecision = 1;
1168922Swilliam.wang@arm.com    miscRegs[MISCREG_MVFR1] = mvfr1;
1178922Swilliam.wang@arm.com
1188922Swilliam.wang@arm.com    miscRegs[MISCREG_MPIDR] = 0;
1198922Swilliam.wang@arm.com
1208922Swilliam.wang@arm.com    // Reset values of PRRR and NMRR are implementation dependent
1218922Swilliam.wang@arm.com
1228922Swilliam.wang@arm.com    miscRegs[MISCREG_PRRR] =
1238922Swilliam.wang@arm.com        (1 << 19) | // 19
1248922Swilliam.wang@arm.com        (0 << 18) | // 18
1258922Swilliam.wang@arm.com        (0 << 17) | // 17
1268922Swilliam.wang@arm.com        (1 << 16) | // 16
1278922Swilliam.wang@arm.com        (2 << 14) | // 15:14
1288922Swilliam.wang@arm.com        (0 << 12) | // 13:12
1298922Swilliam.wang@arm.com        (2 << 10) | // 11:10
1308975Sandreas.hansson@arm.com        (2 << 8)  | // 9:8
1318975Sandreas.hansson@arm.com        (2 << 6)  | // 7:6
1328922Swilliam.wang@arm.com        (2 << 4)  | // 5:4
1338922Swilliam.wang@arm.com        (1 << 2)  | // 3:2
1348922Swilliam.wang@arm.com        0;          // 1:0
1358922Swilliam.wang@arm.com    miscRegs[MISCREG_NMRR] =
1368922Swilliam.wang@arm.com        (1 << 30) | // 31:30
1378922Swilliam.wang@arm.com        (0 << 26) | // 27:26
1388965Sandreas.hansson@arm.com        (0 << 24) | // 25:24
1399031Sandreas.hansson@arm.com        (3 << 22) | // 23:22
1408922Swilliam.wang@arm.com        (2 << 20) | // 21:20
1418922Swilliam.wang@arm.com        (0 << 18) | // 19:18
1428922Swilliam.wang@arm.com        (0 << 16) | // 17:16
1438922Swilliam.wang@arm.com        (1 << 14) | // 15:14
1448922Swilliam.wang@arm.com        (0 << 12) | // 13:12
1458922Swilliam.wang@arm.com        (2 << 10) | // 11:10
1468922Swilliam.wang@arm.com        (0 << 8)  | // 9:8
1478948Sandreas.hansson@arm.com        (3 << 6)  | // 7:6
1488948Sandreas.hansson@arm.com        (2 << 4)  | // 5:4
1498948Sandreas.hansson@arm.com        (0 << 2)  | // 3:2
1508948Sandreas.hansson@arm.com        0;          // 1:0
1518948Sandreas.hansson@arm.com
1528948Sandreas.hansson@arm.com    //XXX We need to initialize the rest of the state.
1538948Sandreas.hansson@arm.com}
1548948Sandreas.hansson@arm.com
1558948Sandreas.hansson@arm.comMiscReg
1568948Sandreas.hansson@arm.comISA::readMiscRegNoEffect(int misc_reg)
1578948Sandreas.hansson@arm.com{
1588948Sandreas.hansson@arm.com    assert(misc_reg < NumMiscRegs);
1598948Sandreas.hansson@arm.com    if (misc_reg == MISCREG_SPSR) {
1608948Sandreas.hansson@arm.com        CPSR cpsr = miscRegs[MISCREG_CPSR];
1618948Sandreas.hansson@arm.com        switch (cpsr.mode) {
1628948Sandreas.hansson@arm.com          case MODE_USER:
1638948Sandreas.hansson@arm.com            return miscRegs[MISCREG_SPSR];
1648948Sandreas.hansson@arm.com          case MODE_FIQ:
1658948Sandreas.hansson@arm.com            return miscRegs[MISCREG_SPSR_FIQ];
1668948Sandreas.hansson@arm.com          case MODE_IRQ:
1678975Sandreas.hansson@arm.com            return miscRegs[MISCREG_SPSR_IRQ];
1688975Sandreas.hansson@arm.com          case MODE_SVC:
1698975Sandreas.hansson@arm.com            return miscRegs[MISCREG_SPSR_SVC];
1708975Sandreas.hansson@arm.com          case MODE_MON:
1718975Sandreas.hansson@arm.com            return miscRegs[MISCREG_SPSR_MON];
1728975Sandreas.hansson@arm.com          case MODE_ABORT:
1738975Sandreas.hansson@arm.com            return miscRegs[MISCREG_SPSR_ABT];
1748975Sandreas.hansson@arm.com          case MODE_UNDEFINED:
1758975Sandreas.hansson@arm.com            return miscRegs[MISCREG_SPSR_UND];
1768975Sandreas.hansson@arm.com          default:
1778975Sandreas.hansson@arm.com            return miscRegs[MISCREG_SPSR];
1788948Sandreas.hansson@arm.com        }
1798948Sandreas.hansson@arm.com    }
1808975Sandreas.hansson@arm.com    return miscRegs[misc_reg];
1818975Sandreas.hansson@arm.com}
1828975Sandreas.hansson@arm.com
1838975Sandreas.hansson@arm.com
1848975Sandreas.hansson@arm.comMiscReg
1858975Sandreas.hansson@arm.comISA::readMiscReg(int misc_reg, ThreadContext *tc)
1868975Sandreas.hansson@arm.com{
1878948Sandreas.hansson@arm.com    if (misc_reg == MISCREG_CPSR) {
1888975Sandreas.hansson@arm.com        CPSR cpsr = miscRegs[misc_reg];
1898922Swilliam.wang@arm.com        Addr pc = tc->readPC();
1908922Swilliam.wang@arm.com        if (pc & (ULL(1) << PcJBitShift))
1919087Sandreas.hansson@arm.com            cpsr.j = 1;
1929087Sandreas.hansson@arm.com        else
1939087Sandreas.hansson@arm.com            cpsr.j = 0;
1949087Sandreas.hansson@arm.com        if (pc & (ULL(1) << PcTBitShift))
1959087Sandreas.hansson@arm.com            cpsr.t = 1;
1969087Sandreas.hansson@arm.com        else
1978922Swilliam.wang@arm.com            cpsr.t = 0;
1988711Sandreas.hansson@arm.com        return cpsr;
1998922Swilliam.wang@arm.com    }
2008922Swilliam.wang@arm.com    if (misc_reg >= MISCREG_CP15_UNIMP_START &&
2018922Swilliam.wang@arm.com        misc_reg < MISCREG_CP15_END) {
2028711Sandreas.hansson@arm.com        panic("Unimplemented CP15 register %s read.\n",
2038711Sandreas.hansson@arm.com              miscRegName[misc_reg]);
2048711Sandreas.hansson@arm.com    }
2058922Swilliam.wang@arm.com    switch (misc_reg) {
2062381SN/A      case MISCREG_CLIDR:
2078711Sandreas.hansson@arm.com        warn("The clidr register always reports 0 caches.\n");
2088922Swilliam.wang@arm.com        break;
2098922Swilliam.wang@arm.com      case MISCREG_CCSIDR:
2108711Sandreas.hansson@arm.com        warn("The ccsidr register isn't implemented and "
2118922Swilliam.wang@arm.com                "always reads as 0.\n");
2122381SN/A        break;
2132381SN/A      case MISCREG_ID_PFR0:
2142381SN/A        return 0x1031; // ThumbEE | !Jazelle | Thumb | ARM
2152381SN/A      case MISCREG_ID_MMFR0:
2168922Swilliam.wang@arm.com        return 0x03; //VMSAz7
2172381SN/A      case MISCREG_CTR:
2185314Sstever@gmail.com        return 0x86468006; // V7, 64 byte cache line, load/exclusive is exact
2195314Sstever@gmail.com      case MISCREG_ACTLR:
2205314Sstever@gmail.com        warn("Not doing anything for miscreg ACTLR\n");
2215314Sstever@gmail.com        break;
2228975Sandreas.hansson@arm.com      case MISCREG_PMCR:
2238975Sandreas.hansson@arm.com      case MISCREG_PMCCNTR:
2248975Sandreas.hansson@arm.com      case MISCREG_PMSELR:
2258975Sandreas.hansson@arm.com        warn("Not doing anyhting for read to miscreg %s\n",
2268975Sandreas.hansson@arm.com                miscRegName[misc_reg]);
2278975Sandreas.hansson@arm.com        break;
2288975Sandreas.hansson@arm.com
2298975Sandreas.hansson@arm.com    }
2308975Sandreas.hansson@arm.com    return readMiscRegNoEffect(misc_reg);
2318975Sandreas.hansson@arm.com}
2328975Sandreas.hansson@arm.com
2338975Sandreas.hansson@arm.comvoid
2348975Sandreas.hansson@arm.comISA::setMiscRegNoEffect(int misc_reg, const MiscReg &val)
2358975Sandreas.hansson@arm.com{
2368975Sandreas.hansson@arm.com    assert(misc_reg < NumMiscRegs);
2378975Sandreas.hansson@arm.com    if (misc_reg == MISCREG_SPSR) {
2388975Sandreas.hansson@arm.com        CPSR cpsr = miscRegs[MISCREG_CPSR];
2398975Sandreas.hansson@arm.com        switch (cpsr.mode) {
2408975Sandreas.hansson@arm.com          case MODE_USER:
2418975Sandreas.hansson@arm.com            miscRegs[MISCREG_SPSR] = val;
2428975Sandreas.hansson@arm.com            return;
2438975Sandreas.hansson@arm.com          case MODE_FIQ:
2448975Sandreas.hansson@arm.com            miscRegs[MISCREG_SPSR_FIQ] = val;
2458975Sandreas.hansson@arm.com            return;
2468975Sandreas.hansson@arm.com          case MODE_IRQ:
2478975Sandreas.hansson@arm.com            miscRegs[MISCREG_SPSR_IRQ] = val;
2488975Sandreas.hansson@arm.com            return;
2498975Sandreas.hansson@arm.com          case MODE_SVC:
2508975Sandreas.hansson@arm.com            miscRegs[MISCREG_SPSR_SVC] = val;
2518975Sandreas.hansson@arm.com            return;
2528975Sandreas.hansson@arm.com          case MODE_MON:
2538975Sandreas.hansson@arm.com            miscRegs[MISCREG_SPSR_MON] = val;
2548975Sandreas.hansson@arm.com            return;
2558975Sandreas.hansson@arm.com          case MODE_ABORT:
2569087Sandreas.hansson@arm.com            miscRegs[MISCREG_SPSR_ABT] = val;
2579087Sandreas.hansson@arm.com            return;
2589087Sandreas.hansson@arm.com          case MODE_UNDEFINED:
2599087Sandreas.hansson@arm.com            miscRegs[MISCREG_SPSR_UND] = val;
2609087Sandreas.hansson@arm.com            return;
2619087Sandreas.hansson@arm.com          default:
2629087Sandreas.hansson@arm.com            miscRegs[MISCREG_SPSR] = val;
2639087Sandreas.hansson@arm.com            return;
2648975Sandreas.hansson@arm.com        }
2658975Sandreas.hansson@arm.com    }
2668975Sandreas.hansson@arm.com    miscRegs[misc_reg] = val;
2678975Sandreas.hansson@arm.com}
2688975Sandreas.hansson@arm.com
2698975Sandreas.hansson@arm.comvoid
2708975Sandreas.hansson@arm.comISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
2712381SN/A{
2722381SN/A    MiscReg newVal = val;
2738922Swilliam.wang@arm.com    if (misc_reg == MISCREG_CPSR) {
2748922Swilliam.wang@arm.com        updateRegMap(val);
2758922Swilliam.wang@arm.com        CPSR cpsr = val;
2768922Swilliam.wang@arm.com        DPRINTF(Arm, "Updating CPSR to %#x f:%d i:%d a:%d mode:%#x\n",
2778922Swilliam.wang@arm.com                cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode);
2788922Swilliam.wang@arm.com        Addr npc = tc->readNextPC() & ~PcModeMask;
2798922Swilliam.wang@arm.com        if (cpsr.j)
2808922Swilliam.wang@arm.com            npc = npc | (ULL(1) << PcJBitShift);
2818922Swilliam.wang@arm.com        if (cpsr.t)
2828975Sandreas.hansson@arm.com            npc = npc | (ULL(1) << PcTBitShift);
2838975Sandreas.hansson@arm.com
2848922Swilliam.wang@arm.com        tc->setNextPC(npc);
2858922Swilliam.wang@arm.com    } else if (misc_reg >= MISCREG_CP15_UNIMP_START &&
2868922Swilliam.wang@arm.com        misc_reg < MISCREG_CP15_END) {
2878922Swilliam.wang@arm.com        panic("Unimplemented CP15 register %s wrote with %#x.\n",
2888922Swilliam.wang@arm.com              miscRegName[misc_reg], val);
2898922Swilliam.wang@arm.com    } else {
2908965Sandreas.hansson@arm.com        switch (misc_reg) {
2919031Sandreas.hansson@arm.com          case MISCREG_ITSTATE:
2928922Swilliam.wang@arm.com            {
2938922Swilliam.wang@arm.com                ITSTATE itstate = newVal;
2948922Swilliam.wang@arm.com                CPSR cpsr = miscRegs[MISCREG_CPSR];
2958922Swilliam.wang@arm.com                cpsr.it1 = itstate.bottom2;
2968922Swilliam.wang@arm.com                cpsr.it2 = itstate.top6;
2978922Swilliam.wang@arm.com                miscRegs[MISCREG_CPSR] = cpsr;
2988922Swilliam.wang@arm.com                DPRINTF(MiscRegs,
2998948Sandreas.hansson@arm.com                        "Updating ITSTATE -> %#x in CPSR -> %#x.\n",
3008948Sandreas.hansson@arm.com                        (uint8_t)itstate, (uint32_t)cpsr);
3018948Sandreas.hansson@arm.com            }
3028948Sandreas.hansson@arm.com            break;
3038948Sandreas.hansson@arm.com          case MISCREG_CPACR:
3048948Sandreas.hansson@arm.com            {
3058948Sandreas.hansson@arm.com                CPACR newCpacr = 0;
3068948Sandreas.hansson@arm.com                CPACR valCpacr = val;
3078948Sandreas.hansson@arm.com                newCpacr.cp10 = valCpacr.cp10;
3088948Sandreas.hansson@arm.com                newCpacr.cp11 = valCpacr.cp11;
3098948Sandreas.hansson@arm.com                if (newCpacr.cp10 != 0x3 || newCpacr.cp11 != 3) {
3108948Sandreas.hansson@arm.com                    panic("Disabling coprocessors isn't implemented.\n");
3118948Sandreas.hansson@arm.com                }
3128948Sandreas.hansson@arm.com                newVal = newCpacr;
3138948Sandreas.hansson@arm.com            }
3148948Sandreas.hansson@arm.com            break;
3158948Sandreas.hansson@arm.com          case MISCREG_CSSELR:
3168948Sandreas.hansson@arm.com            warn("The csselr register isn't implemented.\n");
3178948Sandreas.hansson@arm.com            break;
3188948Sandreas.hansson@arm.com          case MISCREG_FPSCR:
3198975Sandreas.hansson@arm.com            {
3208975Sandreas.hansson@arm.com                const uint32_t ones = (uint32_t)(-1);
3218975Sandreas.hansson@arm.com                FPSCR fpscrMask = 0;
3228975Sandreas.hansson@arm.com                fpscrMask.ioc = ones;
3238975Sandreas.hansson@arm.com                fpscrMask.dzc = ones;
3248975Sandreas.hansson@arm.com                fpscrMask.ofc = ones;
3258975Sandreas.hansson@arm.com                fpscrMask.ufc = ones;
3268975Sandreas.hansson@arm.com                fpscrMask.ixc = ones;
3278975Sandreas.hansson@arm.com                fpscrMask.idc = ones;
3288975Sandreas.hansson@arm.com                fpscrMask.len = ones;
3298975Sandreas.hansson@arm.com                fpscrMask.stride = ones;
3308948Sandreas.hansson@arm.com                fpscrMask.rMode = ones;
3318948Sandreas.hansson@arm.com                fpscrMask.fz = ones;
3328975Sandreas.hansson@arm.com                fpscrMask.dn = ones;
3338975Sandreas.hansson@arm.com                fpscrMask.ahp = ones;
3348975Sandreas.hansson@arm.com                fpscrMask.qc = ones;
3358975Sandreas.hansson@arm.com                fpscrMask.v = ones;
3368975Sandreas.hansson@arm.com                fpscrMask.c = ones;
3378948Sandreas.hansson@arm.com                fpscrMask.z = ones;
3388975Sandreas.hansson@arm.com                fpscrMask.n = ones;
3398948Sandreas.hansson@arm.com                newVal = (newVal & (uint32_t)fpscrMask) |
3408948Sandreas.hansson@arm.com                         (miscRegs[MISCREG_FPSCR] & ~(uint32_t)fpscrMask);
3419087Sandreas.hansson@arm.com            }
3429087Sandreas.hansson@arm.com            break;
3439087Sandreas.hansson@arm.com          case MISCREG_FPEXC:
3449087Sandreas.hansson@arm.com            {
3459087Sandreas.hansson@arm.com                const uint32_t fpexcMask = 0x60000000;
3469087Sandreas.hansson@arm.com                newVal = (newVal & fpexcMask) |
3479087Sandreas.hansson@arm.com                         (miscRegs[MISCREG_FPEXC] & ~fpexcMask);
3488922Swilliam.wang@arm.com            }
3498922Swilliam.wang@arm.com            break;
3508922Swilliam.wang@arm.com          case MISCREG_SCTLR:
3518922Swilliam.wang@arm.com            {
3528922Swilliam.wang@arm.com                DPRINTF(MiscRegs, "Writing SCTLR: %#x\n", newVal);
3538922Swilliam.wang@arm.com                SCTLR sctlr = miscRegs[MISCREG_SCTLR];
3548922Swilliam.wang@arm.com                SCTLR new_sctlr = newVal;
3558922Swilliam.wang@arm.com                new_sctlr.nmfi =  (bool)sctlr.nmfi;
3568922Swilliam.wang@arm.com                miscRegs[MISCREG_SCTLR] = (MiscReg)new_sctlr;
3578922Swilliam.wang@arm.com                return;
3588922Swilliam.wang@arm.com            }
3598922Swilliam.wang@arm.com          case MISCREG_TLBTR:
3608922Swilliam.wang@arm.com          case MISCREG_MVFR0:
3618922Swilliam.wang@arm.com          case MISCREG_MVFR1:
3628922Swilliam.wang@arm.com          case MISCREG_MPIDR:
3638922Swilliam.wang@arm.com          case MISCREG_FPSID:
3648922Swilliam.wang@arm.com            return;
3658922Swilliam.wang@arm.com          case MISCREG_TLBIALLIS:
3668922Swilliam.wang@arm.com          case MISCREG_TLBIALL:
3678922Swilliam.wang@arm.com            warn("Need to flush all TLBs in MP\n");
3688922Swilliam.wang@arm.com            tc->getITBPtr()->flushAll();
3698922Swilliam.wang@arm.com            tc->getDTBPtr()->flushAll();
3708922Swilliam.wang@arm.com            return;
3718975Sandreas.hansson@arm.com          case MISCREG_ITLBIALL:
3728975Sandreas.hansson@arm.com            tc->getITBPtr()->flushAll();
3738975Sandreas.hansson@arm.com            return;
3748975Sandreas.hansson@arm.com          case MISCREG_DTLBIALL:
3758975Sandreas.hansson@arm.com            tc->getDTBPtr()->flushAll();
3768975Sandreas.hansson@arm.com            return;
3778975Sandreas.hansson@arm.com          case MISCREG_TLBIMVAIS:
3788975Sandreas.hansson@arm.com          case MISCREG_TLBIMVA:
3798975Sandreas.hansson@arm.com            warn("Need to flush all TLBs in MP\n");
3808975Sandreas.hansson@arm.com            tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
3818975Sandreas.hansson@arm.com                    bits(newVal, 7,0));
3828975Sandreas.hansson@arm.com            tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
3838975Sandreas.hansson@arm.com                    bits(newVal, 7,0));
3848975Sandreas.hansson@arm.com            return;
3858975Sandreas.hansson@arm.com          case MISCREG_TLBIASIDIS:
3868975Sandreas.hansson@arm.com          case MISCREG_TLBIASID:
3878975Sandreas.hansson@arm.com            warn("Need to flush all TLBs in MP\n");
3888975Sandreas.hansson@arm.com            tc->getITBPtr()->flushAsid(bits(newVal, 7,0));
3898975Sandreas.hansson@arm.com            tc->getDTBPtr()->flushAsid(bits(newVal, 7,0));
3908975Sandreas.hansson@arm.com            return;
3918975Sandreas.hansson@arm.com          case MISCREG_TLBIMVAAIS:
3928975Sandreas.hansson@arm.com          case MISCREG_TLBIMVAA:
3938975Sandreas.hansson@arm.com            warn("Need to flush all TLBs in MP\n");
3948975Sandreas.hansson@arm.com            tc->getITBPtr()->flushMva(mbits(newVal, 31,12));
3958975Sandreas.hansson@arm.com            tc->getDTBPtr()->flushMva(mbits(newVal, 31,12));
3968975Sandreas.hansson@arm.com            return;
3979087Sandreas.hansson@arm.com          case MISCREG_ITLBIMVA:
3989087Sandreas.hansson@arm.com            tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
3999087Sandreas.hansson@arm.com                    bits(newVal, 7,0));
4009087Sandreas.hansson@arm.com            return;
4019087Sandreas.hansson@arm.com          case MISCREG_DTLBIMVA:
4029087Sandreas.hansson@arm.com            tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12),
4039087Sandreas.hansson@arm.com                    bits(newVal, 7,0));
4048922Swilliam.wang@arm.com            return;
4058922Swilliam.wang@arm.com          case MISCREG_ITLBIASID:
4062381SN/A            tc->getITBPtr()->flushAsid(bits(newVal, 7,0));
407            return;
408          case MISCREG_DTLBIASID:
409            tc->getDTBPtr()->flushAsid(bits(newVal, 7,0));
410            return;
411          case MISCREG_ACTLR:
412            warn("Not doing anything for write of miscreg ACTLR\n");
413            break;
414          case MISCREG_PMCR:
415          case MISCREG_PMCCNTR:
416          case MISCREG_PMSELR:
417            warn("Not doing anything for write to miscreg %s\n",
418                    miscRegName[misc_reg]);
419            break;
420          case MISCREG_V2PCWPR:
421          case MISCREG_V2PCWPW:
422          case MISCREG_V2PCWUR:
423          case MISCREG_V2PCWUW:
424          case MISCREG_V2POWPR:
425          case MISCREG_V2POWPW:
426          case MISCREG_V2POWUR:
427          case MISCREG_V2POWUW:
428            {
429              RequestPtr req = new Request;
430              unsigned flags;
431              BaseTLB::Mode mode;
432              Fault fault;
433              switch(misc_reg) {
434                  case MISCREG_V2PCWPR:
435                      flags = TLB::MustBeOne;
436                      mode = BaseTLB::Read;
437                      break;
438                  case MISCREG_V2PCWPW:
439                      flags = TLB::MustBeOne;
440                      mode = BaseTLB::Write;
441                      break;
442                  case MISCREG_V2PCWUR:
443                      flags = TLB::MustBeOne | TLB::UserMode;
444                      mode = BaseTLB::Read;
445                      break;
446                  case MISCREG_V2PCWUW:
447                      flags = TLB::MustBeOne | TLB::UserMode;
448                      mode = BaseTLB::Write;
449                      break;
450                  default:
451                      panic("Security Extensions not implemented!");
452              }
453              req->setVirt(0, val, 1, flags, tc->readPC());
454              fault = tc->getDTBPtr()->translateAtomic(req, tc, mode);
455              if (fault == NoFault) {
456                  miscRegs[MISCREG_PAR] =
457                      (req->getPaddr() & 0xfffff000) |
458                      (tc->getDTBPtr()->getAttr() );
459                  DPRINTF(MiscRegs,
460                          "MISCREG: Translated addr 0x%08x: PAR: 0x%08x\n",
461                          val, miscRegs[MISCREG_PAR]);
462              }
463              else {
464                  // Set fault bit and FSR
465                  FSR fsr = miscRegs[MISCREG_DFSR];
466                  miscRegs[MISCREG_PAR] =
467                      (fsr.ext << 6) |
468                      (fsr.fsHigh << 5) |
469                      (fsr.fsLow << 1) |
470                      0x1; // F bit
471              }
472              return;
473            }
474        }
475    }
476    setMiscRegNoEffect(misc_reg, newVal);
477}
478
479}
480