isa.hh revision 7348
19157Sandreas.hansson@arm.com/*
211524Sdavid.guillen@arm.com * Copyright (c) 2010 ARM Limited
310000Sclt67@cornell.edu * All rights reserved
49157Sandreas.hansson@arm.com *
59157Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
69157Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
79157Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
89157Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
99157Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
109157Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
119157Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
129157Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
139157Sandreas.hansson@arm.com *
149157Sandreas.hansson@arm.com * Copyright (c) 2009 The Regents of The University of Michigan
159157Sandreas.hansson@arm.com * All rights reserved.
169157Sandreas.hansson@arm.com *
179157Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
189157Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
199157Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
209157Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
219157Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
229157Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
239157Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
249157Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
259157Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
269157Sandreas.hansson@arm.com * this software without specific prior written permission.
279157Sandreas.hansson@arm.com *
289157Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
299157Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
309157Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
319157Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
329157Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
339157Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
349157Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
359157Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
369157Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
379157Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
389157Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3910000Sclt67@cornell.edu *
4011524Sdavid.guillen@arm.com * Authors: Gabe Black
4111524Sdavid.guillen@arm.com */
429157Sandreas.hansson@arm.com
439157Sandreas.hansson@arm.com#ifndef __ARCH_ARM_ISA_HH__
449157Sandreas.hansson@arm.com#define __ARCH_MRM_ISA_HH__
459157Sandreas.hansson@arm.com
469157Sandreas.hansson@arm.com#include "arch/arm/registers.hh"
479157Sandreas.hansson@arm.com#include "arch/arm/types.hh"
489157Sandreas.hansson@arm.com
499157Sandreas.hansson@arm.comclass ThreadContext;
509157Sandreas.hansson@arm.comclass Checkpoint;
519157Sandreas.hansson@arm.comclass EventManager;
5211524Sdavid.guillen@arm.com
539157Sandreas.hansson@arm.comnamespace ArmISA
549418Sandreas.hansson@arm.com{
5511524Sdavid.guillen@arm.com    class ISA
569157Sandreas.hansson@arm.com    {
579356Snilay@cs.wisc.edu      protected:
589793Sakash.bagdia@arm.com        MiscReg miscRegs[NumMiscRegs];
599157Sandreas.hansson@arm.com        const IntRegIndex *intRegMap;
609157Sandreas.hansson@arm.com
619157Sandreas.hansson@arm.com        void
6211009Sandreas.sandberg@arm.com        updateRegMap(CPSR cpsr)
6311009Sandreas.sandberg@arm.com        {
6411009Sandreas.sandberg@arm.com            switch (cpsr.mode) {
659157Sandreas.hansson@arm.com              case MODE_USER:
6611009Sandreas.sandberg@arm.com              case MODE_SYSTEM:
679157Sandreas.hansson@arm.com                intRegMap = IntRegUsrMap;
689157Sandreas.hansson@arm.com                break;
699157Sandreas.hansson@arm.com              case MODE_FIQ:
709179Sandreas.hansson@arm.com                intRegMap = IntRegFiqMap;
719179Sandreas.hansson@arm.com                break;
729179Sandreas.hansson@arm.com              case MODE_IRQ:
739179Sandreas.hansson@arm.com                intRegMap = IntRegIrqMap;
749179Sandreas.hansson@arm.com                break;
759179Sandreas.hansson@arm.com              case MODE_SVC:
769180Sandreas.hansson@arm.com                intRegMap = IntRegSvcMap;
779179Sandreas.hansson@arm.com                break;
789157Sandreas.hansson@arm.com              case MODE_MON:
7910236Sjthestness@gmail.com                intRegMap = IntRegMonMap;
8010236Sjthestness@gmail.com                break;
819179Sandreas.hansson@arm.com              case MODE_ABORT:
829179Sandreas.hansson@arm.com                intRegMap = IntRegAbtMap;
839179Sandreas.hansson@arm.com                break;
849179Sandreas.hansson@arm.com              case MODE_UNDEFINED:
859179Sandreas.hansson@arm.com                intRegMap = IntRegUndMap;
869179Sandreas.hansson@arm.com                break;
879179Sandreas.hansson@arm.com              default:
889179Sandreas.hansson@arm.com                panic("Unrecognized mode setting in CPSR.\n");
899179Sandreas.hansson@arm.com            }
909179Sandreas.hansson@arm.com        }
919179Sandreas.hansson@arm.com
929793Sakash.bagdia@arm.com      public:
939179Sandreas.hansson@arm.com        void clear()
949179Sandreas.hansson@arm.com        {
959179Sandreas.hansson@arm.com            memset(miscRegs, 0, sizeof(miscRegs));
969179Sandreas.hansson@arm.com            CPSR cpsr = 0;
979179Sandreas.hansson@arm.com            cpsr.mode = MODE_USER;
989179Sandreas.hansson@arm.com            miscRegs[MISCREG_CPSR] = cpsr;
999179Sandreas.hansson@arm.com            updateRegMap(cpsr);
1009179Sandreas.hansson@arm.com
1019179Sandreas.hansson@arm.com            SCTLR sctlr = 0;
1029793Sakash.bagdia@arm.com            sctlr.nmfi = 1;
1039179Sandreas.hansson@arm.com            sctlr.rao1 = 1;
1049793Sakash.bagdia@arm.com            sctlr.rao2 = 1;
1059179Sandreas.hansson@arm.com            sctlr.rao3 = 1;
1069179Sandreas.hansson@arm.com            sctlr.rao4 = 1;
1079793Sakash.bagdia@arm.com            miscRegs[MISCREG_SCTLR] = sctlr;
1089793Sakash.bagdia@arm.com
1099793Sakash.bagdia@arm.com            /*
1109793Sakash.bagdia@arm.com             * Technically this should be 0, but we don't support those
1119157Sandreas.hansson@arm.com             * settings.
1129545Sandreas.hansson@arm.com             */
1139545Sandreas.hansson@arm.com            CPACR cpacr = 0;
1149157Sandreas.hansson@arm.com            // Enable CP 10, 11
1159793Sakash.bagdia@arm.com            cpacr.cp10 = 0x3;
1169157Sandreas.hansson@arm.com            cpacr.cp11 = 0x3;
1179157Sandreas.hansson@arm.com            miscRegs[MISCREG_CPACR] = cpacr;
11811009Sandreas.sandberg@arm.com
11911009Sandreas.sandberg@arm.com            /* One region, unified map. */
1209418Sandreas.hansson@arm.com            miscRegs[MISCREG_MPUIR] = 0x100;
12110000Sclt67@cornell.edu
12210000Sclt67@cornell.edu            /*
12310000Sclt67@cornell.edu             * Implemented = '5' from "M5",
1249418Sandreas.hansson@arm.com             * Variant = 0,
1259157Sandreas.hansson@arm.com             */
12611009Sandreas.sandberg@arm.com            miscRegs[MISCREG_MIDR] =
12711009Sandreas.sandberg@arm.com                (0x35 << 24) | //Implementor is '5' from "M5"
12811009Sandreas.sandberg@arm.com                (0 << 20)    | //Variant
1299157Sandreas.hansson@arm.com                (0xf << 16)  | //Architecture from CPUID scheme
1309157Sandreas.hansson@arm.com                (0 << 4)     | //Primary part number
1319157Sandreas.hansson@arm.com                (0 << 0)     | //Revision
13211009Sandreas.sandberg@arm.com                0;
1339157Sandreas.hansson@arm.com
1349296Snilay@cs.wisc.edu            //XXX We need to initialize the rest of the state.
1359296Snilay@cs.wisc.edu        }
1369296Snilay@cs.wisc.edu
1379296Snilay@cs.wisc.edu        MiscReg
1389296Snilay@cs.wisc.edu        readMiscRegNoEffect(int misc_reg)
1399296Snilay@cs.wisc.edu        {
1409296Snilay@cs.wisc.edu            assert(misc_reg < NumMiscRegs);
1419793Sakash.bagdia@arm.com            if (misc_reg == MISCREG_SPSR) {
1429296Snilay@cs.wisc.edu                CPSR cpsr = miscRegs[MISCREG_CPSR];
1439793Sakash.bagdia@arm.com                switch (cpsr.mode) {
1449296Snilay@cs.wisc.edu                  case MODE_USER:
1459296Snilay@cs.wisc.edu                    return miscRegs[MISCREG_SPSR];
1469157Sandreas.hansson@arm.com                  case MODE_FIQ:
1479157Sandreas.hansson@arm.com                    return miscRegs[MISCREG_SPSR_FIQ];
1489157Sandreas.hansson@arm.com                  case MODE_IRQ:
14910000Sclt67@cornell.edu                    return miscRegs[MISCREG_SPSR_IRQ];
15010000Sclt67@cornell.edu                  case MODE_SVC:
15110000Sclt67@cornell.edu                    return miscRegs[MISCREG_SPSR_SVC];
15210000Sclt67@cornell.edu                  case MODE_MON:
15310000Sclt67@cornell.edu                    return miscRegs[MISCREG_SPSR_MON];
15410000Sclt67@cornell.edu                  case MODE_ABORT:
15510000Sclt67@cornell.edu                    return miscRegs[MISCREG_SPSR_ABT];
15610000Sclt67@cornell.edu                  case MODE_UNDEFINED:
15710000Sclt67@cornell.edu                    return miscRegs[MISCREG_SPSR_UND];
15810236Sjthestness@gmail.com                  default:
15910236Sjthestness@gmail.com                    return miscRegs[MISCREG_SPSR];
16010236Sjthestness@gmail.com                }
16110236Sjthestness@gmail.com            }
16210236Sjthestness@gmail.com            return miscRegs[misc_reg];
16310236Sjthestness@gmail.com        }
1649179Sandreas.hansson@arm.com
1659179Sandreas.hansson@arm.com        MiscReg
1669179Sandreas.hansson@arm.com        readMiscReg(int misc_reg, ThreadContext *tc)
16710236Sjthestness@gmail.com        {
16810236Sjthestness@gmail.com            if (misc_reg == MISCREG_CPSR) {
16910236Sjthestness@gmail.com                CPSR cpsr = miscRegs[misc_reg];
1709179Sandreas.hansson@arm.com                Addr pc = tc->readPC();
1719180Sandreas.hansson@arm.com                if (pc & (ULL(1) << PcJBitShift))
1729179Sandreas.hansson@arm.com                    cpsr.j = 1;
1739179Sandreas.hansson@arm.com                else
1749179Sandreas.hansson@arm.com                    cpsr.j = 0;
1759179Sandreas.hansson@arm.com                if (pc & (ULL(1) << PcTBitShift))
1769179Sandreas.hansson@arm.com                    cpsr.t = 1;
1779793Sakash.bagdia@arm.com                else
1789179Sandreas.hansson@arm.com                    cpsr.t = 0;
1799179Sandreas.hansson@arm.com                return cpsr;
1809179Sandreas.hansson@arm.com            }
1819179Sandreas.hansson@arm.com            if (misc_reg >= MISCREG_CP15_UNIMP_START &&
1829179Sandreas.hansson@arm.com                misc_reg < MISCREG_CP15_END) {
1839179Sandreas.hansson@arm.com                panic("Unimplemented CP15 register %s read.\n",
18410236Sjthestness@gmail.com                      miscRegName[misc_reg]);
18510236Sjthestness@gmail.com            }
18610236Sjthestness@gmail.com            switch (misc_reg) {
1879179Sandreas.hansson@arm.com              case MISCREG_CLIDR:
1889180Sandreas.hansson@arm.com                warn("The clidr register always reports 0 caches.\n");
1899179Sandreas.hansson@arm.com                break;
1909179Sandreas.hansson@arm.com              case MISCREG_CCSIDR:
1919179Sandreas.hansson@arm.com                warn("The ccsidr register isn't implemented and "
1929179Sandreas.hansson@arm.com                        "always reads as 0.\n");
1939179Sandreas.hansson@arm.com                break;
1949179Sandreas.hansson@arm.com            }
1959179Sandreas.hansson@arm.com            return readMiscRegNoEffect(misc_reg);
1969179Sandreas.hansson@arm.com        }
19710236Sjthestness@gmail.com
19810236Sjthestness@gmail.com        void
19910236Sjthestness@gmail.com        setMiscRegNoEffect(int misc_reg, const MiscReg &val)
20010236Sjthestness@gmail.com        {
2019157Sandreas.hansson@arm.com            assert(misc_reg < NumMiscRegs);
20210236Sjthestness@gmail.com            if (misc_reg == MISCREG_SPSR) {
20310236Sjthestness@gmail.com                CPSR cpsr = miscRegs[MISCREG_CPSR];
20410236Sjthestness@gmail.com                switch (cpsr.mode) {
2059157Sandreas.hansson@arm.com                  case MODE_USER:
2069157Sandreas.hansson@arm.com                    miscRegs[MISCREG_SPSR] = val;
2079648Sdam.sunwoo@arm.com                    return;
2089157Sandreas.hansson@arm.com                  case MODE_FIQ:
2099793Sakash.bagdia@arm.com                    miscRegs[MISCREG_SPSR_FIQ] = val;
2109793Sakash.bagdia@arm.com                    return;
2119793Sakash.bagdia@arm.com                  case MODE_IRQ:
2129793Sakash.bagdia@arm.com                    miscRegs[MISCREG_SPSR_IRQ] = val;
2139157Sandreas.hansson@arm.com                    return;
2149793Sakash.bagdia@arm.com                  case MODE_SVC:
2159793Sakash.bagdia@arm.com                    miscRegs[MISCREG_SPSR_SVC] = val;
2169793Sakash.bagdia@arm.com                    return;
2179793Sakash.bagdia@arm.com                  case MODE_MON:
2189157Sandreas.hansson@arm.com                    miscRegs[MISCREG_SPSR_MON] = val;
21911366Sdavid.guillen@arm.com                    return;
22011366Sdavid.guillen@arm.com                  case MODE_ABORT:
22111366Sdavid.guillen@arm.com                    miscRegs[MISCREG_SPSR_ABT] = val;
22211366Sdavid.guillen@arm.com                    return;
22311366Sdavid.guillen@arm.com                  case MODE_UNDEFINED:
2249550Sandreas.hansson@arm.com                    miscRegs[MISCREG_SPSR_UND] = val;
2259987Snilay@cs.wisc.edu                    return;
2269157Sandreas.hansson@arm.com                  default:
22711018Snilay@cs.wisc.edu                    miscRegs[MISCREG_SPSR] = val;
22811018Snilay@cs.wisc.edu                    return;
2299157Sandreas.hansson@arm.com                }
2309157Sandreas.hansson@arm.com            }
23111009Sandreas.sandberg@arm.com            miscRegs[misc_reg] = val;
23211009Sandreas.sandberg@arm.com        }
23311009Sandreas.sandberg@arm.com
23411009Sandreas.sandberg@arm.com        void
23511009Sandreas.sandberg@arm.com        setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
23611009Sandreas.sandberg@arm.com        {
23711009Sandreas.sandberg@arm.com            MiscReg newVal = val;
23811009Sandreas.sandberg@arm.com            if (misc_reg == MISCREG_CPSR) {
23911527Sdavid.guillen@arm.com                updateRegMap(val);
24011524Sdavid.guillen@arm.com                CPSR cpsr = val;
24111524Sdavid.guillen@arm.com                DPRINTF(Arm, "Updating CPSR to %#x f:%d i:%d a:%d mode:%#x\n",
24211524Sdavid.guillen@arm.com                        cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode);
24311524Sdavid.guillen@arm.com                Addr npc = tc->readNextPC() & ~PcModeMask;
24411524Sdavid.guillen@arm.com                if (cpsr.j)
24511524Sdavid.guillen@arm.com                    npc = npc | (ULL(1) << PcJBitShift);
24611524Sdavid.guillen@arm.com                if (cpsr.t)
24711524Sdavid.guillen@arm.com                    npc = npc | (ULL(1) << PcTBitShift);
24811524Sdavid.guillen@arm.com
24911524Sdavid.guillen@arm.com                tc->setNextPC(npc);
25011524Sdavid.guillen@arm.com            }
25111524Sdavid.guillen@arm.com            if (misc_reg >= MISCREG_CP15_UNIMP_START &&
25211524Sdavid.guillen@arm.com                misc_reg < MISCREG_CP15_END) {
25311524Sdavid.guillen@arm.com                panic("Unimplemented CP15 register %s wrote with %#x.\n",
25411524Sdavid.guillen@arm.com                      miscRegName[misc_reg], val);
25511524Sdavid.guillen@arm.com            }
25611524Sdavid.guillen@arm.com            switch (misc_reg) {
25711524Sdavid.guillen@arm.com              case MISCREG_CPACR:
25811524Sdavid.guillen@arm.com                {
25911524Sdavid.guillen@arm.com                    CPACR newCpacr = 0;
26011524Sdavid.guillen@arm.com                    CPACR valCpacr = val;
26111524Sdavid.guillen@arm.com                    newCpacr.cp10 = valCpacr.cp10;
26211524Sdavid.guillen@arm.com                    newCpacr.cp11 = valCpacr.cp11;
26311524Sdavid.guillen@arm.com                    if (newCpacr.cp10 != 0x3 || newCpacr.cp11 != 3) {
26411524Sdavid.guillen@arm.com                        panic("Disabling coprocessors isn't implemented.\n");
26511524Sdavid.guillen@arm.com                    }
26611524Sdavid.guillen@arm.com                    newVal = newCpacr;
26711524Sdavid.guillen@arm.com                }
26811524Sdavid.guillen@arm.com                break;
26911524Sdavid.guillen@arm.com              case MISCREG_CSSELR:
27011524Sdavid.guillen@arm.com                warn("The csselr register isn't implemented.\n");
27111524Sdavid.guillen@arm.com                break;
27211524Sdavid.guillen@arm.com            }
27311524Sdavid.guillen@arm.com            return setMiscRegNoEffect(misc_reg, newVal);
27411524Sdavid.guillen@arm.com        }
27511524Sdavid.guillen@arm.com
27611524Sdavid.guillen@arm.com        int
27711524Sdavid.guillen@arm.com        flattenIntIndex(int reg)
27811524Sdavid.guillen@arm.com        {
27911524Sdavid.guillen@arm.com            assert(reg >= 0);
28011524Sdavid.guillen@arm.com            if (reg < NUM_ARCH_INTREGS) {
28111524Sdavid.guillen@arm.com                return intRegMap[reg];
28211524Sdavid.guillen@arm.com            } else if (reg < NUM_INTREGS) {
28311524Sdavid.guillen@arm.com                return reg;
28411524Sdavid.guillen@arm.com            } else {
28511524Sdavid.guillen@arm.com                int mode = reg / intRegsPerMode;
28611524Sdavid.guillen@arm.com                reg = reg % intRegsPerMode;
28711524Sdavid.guillen@arm.com                switch (mode) {
28811009Sandreas.sandberg@arm.com                  case MODE_USER:
28911009Sandreas.sandberg@arm.com                  case MODE_SYSTEM:
2909157Sandreas.hansson@arm.com                    return INTREG_USR(reg);
291                  case MODE_FIQ:
292                    return INTREG_FIQ(reg);
293                  case MODE_IRQ:
294                    return INTREG_IRQ(reg);
295                  case MODE_SVC:
296                    return INTREG_SVC(reg);
297                  case MODE_MON:
298                    return INTREG_MON(reg);
299                  case MODE_ABORT:
300                    return INTREG_ABT(reg);
301                  case MODE_UNDEFINED:
302                    return INTREG_UND(reg);
303                  default:
304                    panic("Flattening into an unknown mode.\n");
305                }
306            }
307        }
308
309        int
310        flattenFloatIndex(int reg)
311        {
312            return reg;
313        }
314
315        void serialize(EventManager *em, std::ostream &os)
316        {}
317        void unserialize(EventManager *em, Checkpoint *cp,
318                const std::string &section)
319        {}
320
321        ISA()
322        {
323            clear();
324        }
325    };
326}
327
328#endif
329