isa.hh revision 9180
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_ARM_ISA_HH__
459157Sandreas.hansson@arm.com
469157Sandreas.hansson@arm.com#include "arch/arm/registers.hh"
479157Sandreas.hansson@arm.com#include "arch/arm/tlb.hh"
489157Sandreas.hansson@arm.com#include "arch/arm/types.hh"
499157Sandreas.hansson@arm.com#include "debug/Checkpoint.hh"
509157Sandreas.hansson@arm.com
519157Sandreas.hansson@arm.comclass ThreadContext;
5211524Sdavid.guillen@arm.comclass Checkpoint;
539157Sandreas.hansson@arm.comclass EventManager;
549418Sandreas.hansson@arm.com
5511524Sdavid.guillen@arm.comnamespace ArmISA
569157Sandreas.hansson@arm.com{
579356Snilay@cs.wisc.edu    class ISA
589793Sakash.bagdia@arm.com    {
599157Sandreas.hansson@arm.com      protected:
609157Sandreas.hansson@arm.com        MiscReg miscRegs[NumMiscRegs];
619157Sandreas.hansson@arm.com        const IntRegIndex *intRegMap;
6211009Sandreas.sandberg@arm.com
6311009Sandreas.sandberg@arm.com        void
6411009Sandreas.sandberg@arm.com        updateRegMap(CPSR cpsr)
659157Sandreas.hansson@arm.com        {
6611009Sandreas.sandberg@arm.com            switch (cpsr.mode) {
679157Sandreas.hansson@arm.com              case MODE_USER:
689157Sandreas.hansson@arm.com              case MODE_SYSTEM:
699157Sandreas.hansson@arm.com                intRegMap = IntRegUsrMap;
709179Sandreas.hansson@arm.com                break;
719179Sandreas.hansson@arm.com              case MODE_FIQ:
729179Sandreas.hansson@arm.com                intRegMap = IntRegFiqMap;
739179Sandreas.hansson@arm.com                break;
749179Sandreas.hansson@arm.com              case MODE_IRQ:
759179Sandreas.hansson@arm.com                intRegMap = IntRegIrqMap;
769180Sandreas.hansson@arm.com                break;
779179Sandreas.hansson@arm.com              case MODE_SVC:
789157Sandreas.hansson@arm.com                intRegMap = IntRegSvcMap;
7910236Sjthestness@gmail.com                break;
8010236Sjthestness@gmail.com              case MODE_MON:
819179Sandreas.hansson@arm.com                intRegMap = IntRegMonMap;
829179Sandreas.hansson@arm.com                break;
839179Sandreas.hansson@arm.com              case MODE_ABORT:
849179Sandreas.hansson@arm.com                intRegMap = IntRegAbtMap;
859179Sandreas.hansson@arm.com                break;
869179Sandreas.hansson@arm.com              case MODE_UNDEFINED:
879179Sandreas.hansson@arm.com                intRegMap = IntRegUndMap;
889179Sandreas.hansson@arm.com                break;
899179Sandreas.hansson@arm.com              default:
909179Sandreas.hansson@arm.com                panic("Unrecognized mode setting in CPSR.\n");
919179Sandreas.hansson@arm.com            }
929793Sakash.bagdia@arm.com        }
939179Sandreas.hansson@arm.com
949179Sandreas.hansson@arm.com      public:
959179Sandreas.hansson@arm.com        void clear();
969179Sandreas.hansson@arm.com
979179Sandreas.hansson@arm.com        MiscReg readMiscRegNoEffect(int misc_reg);
989179Sandreas.hansson@arm.com        MiscReg readMiscReg(int misc_reg, ThreadContext *tc);
999179Sandreas.hansson@arm.com        void setMiscRegNoEffect(int misc_reg, const MiscReg &val);
1009179Sandreas.hansson@arm.com        void setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc);
1019179Sandreas.hansson@arm.com
1029793Sakash.bagdia@arm.com        int
1039179Sandreas.hansson@arm.com        flattenIntIndex(int reg)
1049793Sakash.bagdia@arm.com        {
1059179Sandreas.hansson@arm.com            assert(reg >= 0);
1069179Sandreas.hansson@arm.com            if (reg < NUM_ARCH_INTREGS) {
1079793Sakash.bagdia@arm.com                return intRegMap[reg];
1089793Sakash.bagdia@arm.com            } else if (reg < NUM_INTREGS) {
1099793Sakash.bagdia@arm.com                return reg;
1109793Sakash.bagdia@arm.com            } else {
1119157Sandreas.hansson@arm.com                int mode = reg / intRegsPerMode;
1129545Sandreas.hansson@arm.com                reg = reg % intRegsPerMode;
1139545Sandreas.hansson@arm.com                switch (mode) {
1149157Sandreas.hansson@arm.com                  case MODE_USER:
1159793Sakash.bagdia@arm.com                  case MODE_SYSTEM:
1169157Sandreas.hansson@arm.com                    return INTREG_USR(reg);
1179157Sandreas.hansson@arm.com                  case MODE_FIQ:
11811009Sandreas.sandberg@arm.com                    return INTREG_FIQ(reg);
11911009Sandreas.sandberg@arm.com                  case MODE_IRQ:
1209418Sandreas.hansson@arm.com                    return INTREG_IRQ(reg);
12110000Sclt67@cornell.edu                  case MODE_SVC:
12210000Sclt67@cornell.edu                    return INTREG_SVC(reg);
12310000Sclt67@cornell.edu                  case MODE_MON:
1249418Sandreas.hansson@arm.com                    return INTREG_MON(reg);
1259157Sandreas.hansson@arm.com                  case MODE_ABORT:
12611009Sandreas.sandberg@arm.com                    return INTREG_ABT(reg);
12711009Sandreas.sandberg@arm.com                  case MODE_UNDEFINED:
12811009Sandreas.sandberg@arm.com                    return INTREG_UND(reg);
1299157Sandreas.hansson@arm.com                  default:
1309157Sandreas.hansson@arm.com                    panic("Flattening into an unknown mode.\n");
1319157Sandreas.hansson@arm.com                }
13211009Sandreas.sandberg@arm.com            }
1339157Sandreas.hansson@arm.com        }
1349296Snilay@cs.wisc.edu
1359296Snilay@cs.wisc.edu        int
1369296Snilay@cs.wisc.edu        flattenFloatIndex(int reg)
1379296Snilay@cs.wisc.edu        {
1389296Snilay@cs.wisc.edu            return reg;
1399296Snilay@cs.wisc.edu        }
1409296Snilay@cs.wisc.edu
1419793Sakash.bagdia@arm.com        int
1429296Snilay@cs.wisc.edu        flattenMiscIndex(int reg)
1439793Sakash.bagdia@arm.com        {
1449296Snilay@cs.wisc.edu            if (reg == MISCREG_SPSR) {
1459296Snilay@cs.wisc.edu                int spsr_idx = NUM_MISCREGS;
1469157Sandreas.hansson@arm.com                CPSR cpsr = miscRegs[MISCREG_CPSR];
1479157Sandreas.hansson@arm.com                switch (cpsr.mode) {
1489157Sandreas.hansson@arm.com                  case MODE_USER:
14910000Sclt67@cornell.edu                    warn("User mode does not have SPSR\n");
15010000Sclt67@cornell.edu                    spsr_idx = MISCREG_SPSR;
15110000Sclt67@cornell.edu                    break;
15210000Sclt67@cornell.edu                  case MODE_FIQ:
15310000Sclt67@cornell.edu                    spsr_idx = MISCREG_SPSR_FIQ;
15410000Sclt67@cornell.edu                    break;
15510000Sclt67@cornell.edu                  case MODE_IRQ:
15610000Sclt67@cornell.edu                    spsr_idx = MISCREG_SPSR_IRQ;
15710000Sclt67@cornell.edu                    break;
15810236Sjthestness@gmail.com                  case MODE_SVC:
15910236Sjthestness@gmail.com                    spsr_idx = MISCREG_SPSR_SVC;
16010236Sjthestness@gmail.com                    break;
16110236Sjthestness@gmail.com                  case MODE_MON:
16210236Sjthestness@gmail.com                    spsr_idx = MISCREG_SPSR_MON;
16310236Sjthestness@gmail.com                    break;
1649179Sandreas.hansson@arm.com                  case MODE_ABORT:
1659179Sandreas.hansson@arm.com                    spsr_idx = MISCREG_SPSR_ABT;
1669179Sandreas.hansson@arm.com                    break;
16710236Sjthestness@gmail.com                  case MODE_UNDEFINED:
16810236Sjthestness@gmail.com                    spsr_idx = MISCREG_SPSR_UND;
16910236Sjthestness@gmail.com                    break;
1709179Sandreas.hansson@arm.com                  default:
1719180Sandreas.hansson@arm.com                    warn("Trying to access SPSR in an invalid mode: %d\n",
1729179Sandreas.hansson@arm.com                         cpsr.mode);
1739179Sandreas.hansson@arm.com                    spsr_idx = MISCREG_SPSR;
1749179Sandreas.hansson@arm.com                    break;
1759179Sandreas.hansson@arm.com                }
1769179Sandreas.hansson@arm.com                return spsr_idx;
1779793Sakash.bagdia@arm.com            }
1789179Sandreas.hansson@arm.com            return reg;
1799179Sandreas.hansson@arm.com        }
1809179Sandreas.hansson@arm.com
1819179Sandreas.hansson@arm.com        void serialize(EventManager *em, std::ostream &os)
1829179Sandreas.hansson@arm.com        {
1839179Sandreas.hansson@arm.com            DPRINTF(Checkpoint, "Serializing Arm Misc Registers\n");
18410236Sjthestness@gmail.com            SERIALIZE_ARRAY(miscRegs, NumMiscRegs);
18510236Sjthestness@gmail.com        }
18610236Sjthestness@gmail.com        void unserialize(EventManager *em, Checkpoint *cp,
1879179Sandreas.hansson@arm.com                const std::string &section)
1889180Sandreas.hansson@arm.com        {
1899179Sandreas.hansson@arm.com            DPRINTF(Checkpoint, "Unserializing Arm Misc Registers\n");
1909179Sandreas.hansson@arm.com            UNSERIALIZE_ARRAY(miscRegs, NumMiscRegs);
1919179Sandreas.hansson@arm.com            CPSR tmp_cpsr = miscRegs[MISCREG_CPSR];
1929179Sandreas.hansson@arm.com            updateRegMap(tmp_cpsr);
1939179Sandreas.hansson@arm.com        }
1949179Sandreas.hansson@arm.com
1959179Sandreas.hansson@arm.com        ISA()
1969179Sandreas.hansson@arm.com        {
19710236Sjthestness@gmail.com            SCTLR sctlr;
19810236Sjthestness@gmail.com            sctlr = 0;
19910236Sjthestness@gmail.com            miscRegs[MISCREG_SCTLR_RST] = sctlr;
20010236Sjthestness@gmail.com
2019157Sandreas.hansson@arm.com            clear();
20210236Sjthestness@gmail.com        }
20310236Sjthestness@gmail.com    };
20410236Sjthestness@gmail.com}
2059157Sandreas.hansson@arm.com
2069157Sandreas.hansson@arm.com#endif
2079648Sdam.sunwoo@arm.com