isa.cc revision 7405
17405SAli.Saidi@ARM.com/* 27405SAli.Saidi@ARM.com * Copyright (c) 2010 ARM Limited 37405SAli.Saidi@ARM.com * All rights reserved 47405SAli.Saidi@ARM.com * 57405SAli.Saidi@ARM.com * The license below extends only to copyright in the software and shall 67405SAli.Saidi@ARM.com * not be construed as granting a license to any other intellectual 77405SAli.Saidi@ARM.com * property including but not limited to intellectual property relating 87405SAli.Saidi@ARM.com * to a hardware implementation of the functionality of the software 97405SAli.Saidi@ARM.com * licensed hereunder. You may use the software subject to the license 107405SAli.Saidi@ARM.com * terms below provided that you ensure that this notice is replicated 117405SAli.Saidi@ARM.com * unmodified and in its entirety in all distributions of the software, 127405SAli.Saidi@ARM.com * modified or unmodified, in source code or in binary form. 137405SAli.Saidi@ARM.com * 147405SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 157405SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 167405SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 177405SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 187405SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 197405SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 207405SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 217405SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 227405SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 237405SAli.Saidi@ARM.com * this software without specific prior written permission. 247405SAli.Saidi@ARM.com * 257405SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 267405SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 277405SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 287405SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 297405SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 307405SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 317405SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 327405SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 337405SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 347405SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 357405SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 367405SAli.Saidi@ARM.com * 377405SAli.Saidi@ARM.com * Authors: Gabe Black 387405SAli.Saidi@ARM.com * Ali Saidi 397405SAli.Saidi@ARM.com */ 407405SAli.Saidi@ARM.com 417405SAli.Saidi@ARM.com#include "arch/arm/isa.hh" 428232Snate@binkert.org 438232Snate@binkert.orgnamespace ArmISA 447678Sgblack@eecs.umich.edu{ 458059SAli.Saidi@ARM.com 468284SAli.Saidi@ARM.comMiscReg 477405SAli.Saidi@ARM.comISA::readMiscRegNoEffect(int misc_reg) 487405SAli.Saidi@ARM.com{ 497405SAli.Saidi@ARM.com assert(misc_reg < NumMiscRegs); 507405SAli.Saidi@ARM.com if (misc_reg == MISCREG_SPSR) { 517427Sgblack@eecs.umich.edu CPSR cpsr = miscRegs[MISCREG_CPSR]; 527427Sgblack@eecs.umich.edu switch (cpsr.mode) { 537427Sgblack@eecs.umich.edu case MODE_USER: 547427Sgblack@eecs.umich.edu return miscRegs[MISCREG_SPSR]; 558299Schander.sudanthi@arm.com case MODE_FIQ: 567427Sgblack@eecs.umich.edu return miscRegs[MISCREG_SPSR_FIQ]; 577427Sgblack@eecs.umich.edu case MODE_IRQ: 587427Sgblack@eecs.umich.edu return miscRegs[MISCREG_SPSR_IRQ]; 597427Sgblack@eecs.umich.edu case MODE_SVC: 607427Sgblack@eecs.umich.edu return miscRegs[MISCREG_SPSR_SVC]; 617427Sgblack@eecs.umich.edu case MODE_MON: 627427Sgblack@eecs.umich.edu return miscRegs[MISCREG_SPSR_MON]; 637604SGene.Wu@arm.com case MODE_ABORT: 647427Sgblack@eecs.umich.edu return miscRegs[MISCREG_SPSR_ABT]; 657427Sgblack@eecs.umich.edu case MODE_UNDEFINED: 667427Sgblack@eecs.umich.edu return miscRegs[MISCREG_SPSR_UND]; 677427Sgblack@eecs.umich.edu default: 687427Sgblack@eecs.umich.edu return miscRegs[MISCREG_SPSR]; 697427Sgblack@eecs.umich.edu } 707427Sgblack@eecs.umich.edu } 717427Sgblack@eecs.umich.edu return miscRegs[misc_reg]; 727427Sgblack@eecs.umich.edu} 737427Sgblack@eecs.umich.edu 748299Schander.sudanthi@arm.com 758299Schander.sudanthi@arm.comMiscReg 768299Schander.sudanthi@arm.comISA::readMiscReg(int misc_reg, ThreadContext *tc) 777427Sgblack@eecs.umich.edu{ 787427Sgblack@eecs.umich.edu if (misc_reg == MISCREG_CPSR) { 797427Sgblack@eecs.umich.edu CPSR cpsr = miscRegs[misc_reg]; 807427Sgblack@eecs.umich.edu Addr pc = tc->readPC(); 817427Sgblack@eecs.umich.edu if (pc & (ULL(1) << PcJBitShift)) 827427Sgblack@eecs.umich.edu cpsr.j = 1; 837427Sgblack@eecs.umich.edu else 847427Sgblack@eecs.umich.edu cpsr.j = 0; 857427Sgblack@eecs.umich.edu if (pc & (ULL(1) << PcTBitShift)) 867427Sgblack@eecs.umich.edu cpsr.t = 1; 877427Sgblack@eecs.umich.edu else 887427Sgblack@eecs.umich.edu cpsr.t = 0; 897427Sgblack@eecs.umich.edu return cpsr; 907427Sgblack@eecs.umich.edu } 917427Sgblack@eecs.umich.edu if (misc_reg >= MISCREG_CP15_UNIMP_START && 927427Sgblack@eecs.umich.edu misc_reg < MISCREG_CP15_END) { 937427Sgblack@eecs.umich.edu panic("Unimplemented CP15 register %s read.\n", 947427Sgblack@eecs.umich.edu miscRegName[misc_reg]); 957427Sgblack@eecs.umich.edu } 967427Sgblack@eecs.umich.edu switch (misc_reg) { 977427Sgblack@eecs.umich.edu case MISCREG_CLIDR: 987427Sgblack@eecs.umich.edu warn("The clidr register always reports 0 caches.\n"); 997427Sgblack@eecs.umich.edu break; 1007427Sgblack@eecs.umich.edu case MISCREG_CCSIDR: 1017427Sgblack@eecs.umich.edu warn("The ccsidr register isn't implemented and " 1027427Sgblack@eecs.umich.edu "always reads as 0.\n"); 1037427Sgblack@eecs.umich.edu break; 1047427Sgblack@eecs.umich.edu case MISCREG_ID_PFR0: 1057427Sgblack@eecs.umich.edu return 0x1031; // ThumbEE | !Jazelle | Thumb | ARM 1067436Sdam.sunwoo@arm.com } 1077436Sdam.sunwoo@arm.com return readMiscRegNoEffect(misc_reg); 1087436Sdam.sunwoo@arm.com} 1097436Sdam.sunwoo@arm.com 1107436Sdam.sunwoo@arm.comvoid 1117436Sdam.sunwoo@arm.comISA::setMiscRegNoEffect(int misc_reg, const MiscReg &val) 1127436Sdam.sunwoo@arm.com{ 1137436Sdam.sunwoo@arm.com assert(misc_reg < NumMiscRegs); 1147436Sdam.sunwoo@arm.com if (misc_reg == MISCREG_SPSR) { 1157436Sdam.sunwoo@arm.com CPSR cpsr = miscRegs[MISCREG_CPSR]; 1167436Sdam.sunwoo@arm.com switch (cpsr.mode) { 1177436Sdam.sunwoo@arm.com case MODE_USER: 1187436Sdam.sunwoo@arm.com miscRegs[MISCREG_SPSR] = val; 1197436Sdam.sunwoo@arm.com return; 1207436Sdam.sunwoo@arm.com case MODE_FIQ: 1217436Sdam.sunwoo@arm.com miscRegs[MISCREG_SPSR_FIQ] = val; 1227436Sdam.sunwoo@arm.com return; 1237436Sdam.sunwoo@arm.com case MODE_IRQ: 1247436Sdam.sunwoo@arm.com miscRegs[MISCREG_SPSR_IRQ] = val; 1257436Sdam.sunwoo@arm.com return; 1267436Sdam.sunwoo@arm.com case MODE_SVC: 1277436Sdam.sunwoo@arm.com miscRegs[MISCREG_SPSR_SVC] = val; 1287436Sdam.sunwoo@arm.com return; 1297436Sdam.sunwoo@arm.com case MODE_MON: 1307436Sdam.sunwoo@arm.com miscRegs[MISCREG_SPSR_MON] = val; 1317436Sdam.sunwoo@arm.com return; 1327436Sdam.sunwoo@arm.com case MODE_ABORT: 1337436Sdam.sunwoo@arm.com miscRegs[MISCREG_SPSR_ABT] = val; 1347436Sdam.sunwoo@arm.com return; 1357436Sdam.sunwoo@arm.com case MODE_UNDEFINED: 1367436Sdam.sunwoo@arm.com miscRegs[MISCREG_SPSR_UND] = val; 1377436Sdam.sunwoo@arm.com return; 1387644Sali.saidi@arm.com default: 1397644Sali.saidi@arm.com miscRegs[MISCREG_SPSR] = val; 1408147SAli.Saidi@ARM.com return; 1418147SAli.Saidi@ARM.com } 1428147SAli.Saidi@ARM.com } 1438520SAli.Saidi@ARM.com miscRegs[misc_reg] = val; 1448147SAli.Saidi@ARM.com} 1458147SAli.Saidi@ARM.com 1468147SAli.Saidi@ARM.comvoid 1478147SAli.Saidi@ARM.comISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc) 1488147SAli.Saidi@ARM.com{ 1498147SAli.Saidi@ARM.com MiscReg newVal = val; 1507427Sgblack@eecs.umich.edu if (misc_reg == MISCREG_CPSR) { 1517427Sgblack@eecs.umich.edu updateRegMap(val); 1527427Sgblack@eecs.umich.edu CPSR cpsr = val; 1537405SAli.Saidi@ARM.com DPRINTF(Arm, "Updating CPSR to %#x f:%d i:%d a:%d mode:%#x\n", 1547405SAli.Saidi@ARM.com cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode); 1557405SAli.Saidi@ARM.com Addr npc = tc->readNextPC() & ~PcModeMask; 1567405SAli.Saidi@ARM.com if (cpsr.j) 1577614Sminkyu.jeong@arm.com npc = npc | (ULL(1) << PcJBitShift); 1587614Sminkyu.jeong@arm.com if (cpsr.t) 1597614Sminkyu.jeong@arm.com npc = npc | (ULL(1) << PcTBitShift); 1607614Sminkyu.jeong@arm.com 1617614Sminkyu.jeong@arm.com tc->setNextPC(npc); 1627614Sminkyu.jeong@arm.com } 1637614Sminkyu.jeong@arm.com if (misc_reg >= MISCREG_CP15_UNIMP_START && 1647614Sminkyu.jeong@arm.com misc_reg < MISCREG_CP15_END) { 1657614Sminkyu.jeong@arm.com panic("Unimplemented CP15 register %s wrote with %#x.\n", 1667614Sminkyu.jeong@arm.com miscRegName[misc_reg], val); 1677614Sminkyu.jeong@arm.com } 1687405SAli.Saidi@ARM.com switch (misc_reg) { 1697405SAli.Saidi@ARM.com case MISCREG_CPACR: 1707405SAli.Saidi@ARM.com { 1717405SAli.Saidi@ARM.com CPACR newCpacr = 0; 1727405SAli.Saidi@ARM.com CPACR valCpacr = val; 1737405SAli.Saidi@ARM.com newCpacr.cp10 = valCpacr.cp10; 1747405SAli.Saidi@ARM.com newCpacr.cp11 = valCpacr.cp11; 1757405SAli.Saidi@ARM.com if (newCpacr.cp10 != 0x3 || newCpacr.cp11 != 3) { 1767720Sgblack@eecs.umich.edu panic("Disabling coprocessors isn't implemented.\n"); 1777720Sgblack@eecs.umich.edu } 1787720Sgblack@eecs.umich.edu newVal = newCpacr; 1797405SAli.Saidi@ARM.com } 1807405SAli.Saidi@ARM.com break; 1817757SAli.Saidi@ARM.com case MISCREG_CSSELR: 1827405SAli.Saidi@ARM.com warn("The csselr register isn't implemented.\n"); 1837405SAli.Saidi@ARM.com break; 1847757SAli.Saidi@ARM.com case MISCREG_FPSCR: 1857405SAli.Saidi@ARM.com { 1868284SAli.Saidi@ARM.com const uint32_t ones = (uint32_t)(-1); 1878284SAli.Saidi@ARM.com FPSCR fpscrMask = 0; 1888284SAli.Saidi@ARM.com fpscrMask.ioc = ones; 1898468Swade.walker@arm.com fpscrMask.dzc = ones; 1908468Swade.walker@arm.com fpscrMask.ofc = ones; 1918468Swade.walker@arm.com fpscrMask.ufc = ones; 1928468Swade.walker@arm.com fpscrMask.ixc = ones; 1938468Swade.walker@arm.com fpscrMask.idc = ones; 1948284SAli.Saidi@ARM.com fpscrMask.len = ones; 1958284SAli.Saidi@ARM.com fpscrMask.stride = ones; 1968284SAli.Saidi@ARM.com fpscrMask.rMode = ones; 1977405SAli.Saidi@ARM.com fpscrMask.fz = ones; 1987731SAli.Saidi@ARM.com fpscrMask.dn = ones; 1998468Swade.walker@arm.com fpscrMask.ahp = ones; 2008468Swade.walker@arm.com fpscrMask.qc = ones; 2018468Swade.walker@arm.com fpscrMask.v = ones; 2027405SAli.Saidi@ARM.com fpscrMask.c = ones; 2037731SAli.Saidi@ARM.com fpscrMask.z = ones; 2047405SAli.Saidi@ARM.com fpscrMask.n = ones; 2057405SAli.Saidi@ARM.com newVal = (newVal & (uint32_t)fpscrMask) | 2067405SAli.Saidi@ARM.com (miscRegs[MISCREG_FPSCR] & ~(uint32_t)fpscrMask); 2077588SAli.Saidi@arm.com } 2087588SAli.Saidi@arm.com break; 2097588SAli.Saidi@arm.com case MISCREG_FPEXC: 2108299Schander.sudanthi@arm.com { 2118299Schander.sudanthi@arm.com const uint32_t fpexcMask = 0x60000000; 2128299Schander.sudanthi@arm.com newVal = (newVal & fpexcMask) | 2137583SAli.Saidi@arm.com (miscRegs[MISCREG_FPEXC] & ~fpexcMask); 2147583SAli.Saidi@arm.com } 2157583SAli.Saidi@arm.com break; 2167583SAli.Saidi@arm.com case MISCREG_SCTLR: 2177583SAli.Saidi@arm.com { 2187583SAli.Saidi@arm.com SCTLR sctlr = miscRegs[MISCREG_SCTLR]; 2197583SAli.Saidi@arm.com SCTLR new_sctlr = newVal; 2207583SAli.Saidi@arm.com new_sctlr.nmfi = (bool)sctlr.nmfi; 2218299Schander.sudanthi@arm.com miscRegs[MISCREG_SCTLR] = (MiscReg)new_sctlr; 2227583SAli.Saidi@arm.com return; 2237583SAli.Saidi@arm.com } 2248302SAli.Saidi@ARM.com case MISCREG_TLBTR: 2258302SAli.Saidi@ARM.com case MISCREG_MVFR0: 2267783SGiacomo.Gabrielli@arm.com case MISCREG_MVFR1: 2277783SGiacomo.Gabrielli@arm.com case MISCREG_MPIDR: 2287783SGiacomo.Gabrielli@arm.com case MISCREG_FPSID: 2297783SGiacomo.Gabrielli@arm.com return; 2308549Sdaniel.johnson@arm.com case MISCREG_TLBIALLIS: 2318549Sdaniel.johnson@arm.com case MISCREG_TLBIALL: 2328549Sdaniel.johnson@arm.com warn("Need to flush all TLBs in MP\n"); 2338549Sdaniel.johnson@arm.com tc->getITBPtr()->flushAll(); 2348549Sdaniel.johnson@arm.com tc->getDTBPtr()->flushAll(); 2358549Sdaniel.johnson@arm.com return; 2367405SAli.Saidi@ARM.com case MISCREG_ITLBIALL: 2377405SAli.Saidi@ARM.com tc->getITBPtr()->flushAll(); 2387405SAli.Saidi@ARM.com return; 2397405SAli.Saidi@ARM.com case MISCREG_DTLBIALL: 2407405SAli.Saidi@ARM.com tc->getDTBPtr()->flushAll(); 2417405SAli.Saidi@ARM.com return; 2427405SAli.Saidi@ARM.com case MISCREG_TLBIMVAIS: 2437405SAli.Saidi@ARM.com case MISCREG_TLBIMVA: 2447614Sminkyu.jeong@arm.com warn("Need to flush all TLBs in MP\n"); 2457614Sminkyu.jeong@arm.com tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12), 2467614Sminkyu.jeong@arm.com bits(newVal, 7,0)); 2477614Sminkyu.jeong@arm.com tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12), 2487614Sminkyu.jeong@arm.com bits(newVal, 7,0)); 2497614Sminkyu.jeong@arm.com return; 2507614Sminkyu.jeong@arm.com case MISCREG_TLBIASIDIS: 2517614Sminkyu.jeong@arm.com case MISCREG_TLBIASID: 2527614Sminkyu.jeong@arm.com warn("Need to flush all TLBs in MP\n"); 2537614Sminkyu.jeong@arm.com tc->getITBPtr()->flushAsid(bits(newVal, 7,0)); 2547405SAli.Saidi@ARM.com tc->getDTBPtr()->flushAsid(bits(newVal, 7,0)); 2557405SAli.Saidi@ARM.com return; 2567405SAli.Saidi@ARM.com case MISCREG_TLBIMVAAIS: 2577405SAli.Saidi@ARM.com case MISCREG_TLBIMVAA: 2587405SAli.Saidi@ARM.com warn("Need to flush all TLBs in MP\n"); 2597749SAli.Saidi@ARM.com tc->getITBPtr()->flushMva(mbits(newVal, 31,12)); 2607405SAli.Saidi@ARM.com tc->getDTBPtr()->flushMva(mbits(newVal, 31,12)); 2618284SAli.Saidi@ARM.com return; 2628284SAli.Saidi@ARM.com case MISCREG_ITLBIMVA: 2638284SAli.Saidi@ARM.com tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12), 2648284SAli.Saidi@ARM.com bits(newVal, 7,0)); 2657405SAli.Saidi@ARM.com return; 2667405SAli.Saidi@ARM.com case MISCREG_DTLBIMVA: 2677749SAli.Saidi@ARM.com tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12), 2687749SAli.Saidi@ARM.com bits(newVal, 7,0)); 2697749SAli.Saidi@ARM.com return; 2707749SAli.Saidi@ARM.com case MISCREG_ITLBIASID: 2717405SAli.Saidi@ARM.com tc->getITBPtr()->flushAsid(bits(newVal, 7,0)); 2727749SAli.Saidi@ARM.com return; 2737749SAli.Saidi@ARM.com case MISCREG_DTLBIASID: 2747749SAli.Saidi@ARM.com tc->getDTBPtr()->flushAsid(bits(newVal, 7,0)); 2757749SAli.Saidi@ARM.com return; 2767749SAli.Saidi@ARM.com } 2777614Sminkyu.jeong@arm.com setMiscRegNoEffect(misc_reg, newVal); 2787614Sminkyu.jeong@arm.com} 2797720Sgblack@eecs.umich.edu 2807720Sgblack@eecs.umich.edu} 2817720Sgblack@eecs.umich.edu