isa.hh revision 7733:08d6a773d1b6
16019SN/A/*
26019SN/A * Copyright (c) 2010 ARM Limited
37134Sgblack@eecs.umich.edu * All rights reserved
47134Sgblack@eecs.umich.edu *
57134Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67134Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77134Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87134Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97134Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107134Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117134Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127134Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137134Sgblack@eecs.umich.edu *
147134Sgblack@eecs.umich.edu * Copyright (c) 2009 The Regents of The University of Michigan
156019SN/A * All rights reserved.
166019SN/A *
176019SN/A * Redistribution and use in source and binary forms, with or without
186019SN/A * modification, are permitted provided that the following conditions are
196019SN/A * met: redistributions of source code must retain the above copyright
206019SN/A * notice, this list of conditions and the following disclaimer;
216019SN/A * redistributions in binary form must reproduce the above copyright
226019SN/A * notice, this list of conditions and the following disclaimer in the
236019SN/A * documentation and/or other materials provided with the distribution;
246019SN/A * neither the name of the copyright holders nor the names of its
256019SN/A * contributors may be used to endorse or promote products derived from
266019SN/A * this software without specific prior written permission.
276019SN/A *
286019SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
296019SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
306019SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
316019SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
326019SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
336019SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
346019SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
356019SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
366019SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
376019SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
386019SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
396019SN/A *
406019SN/A * Authors: Gabe Black
416019SN/A */
426308SN/A
436308SN/A#ifndef __ARCH_ARM_ISA_HH__
446309SN/A#define __ARCH_ARM_ISA_HH__
456309SN/A
466309SN/A#include "arch/arm/registers.hh"
476309SN/A#include "arch/arm/tlb.hh"
486309SN/A#include "arch/arm/types.hh"
497134Sgblack@eecs.umich.edu
507296Sgblack@eecs.umich.educlass ThreadContext;
516309SN/Aclass Checkpoint;
526309SN/Aclass EventManager;
537296Sgblack@eecs.umich.edu
547134Sgblack@eecs.umich.edunamespace ArmISA
556309SN/A{
566309SN/A    class ISA
576309SN/A    {
587342Sgblack@eecs.umich.edu      protected:
597174Sgblack@eecs.umich.edu        MiscReg miscRegs[NumMiscRegs];
607639Sgblack@eecs.umich.edu        const IntRegIndex *intRegMap;
617639Sgblack@eecs.umich.edu
627644Sali.saidi@arm.com        void
637639Sgblack@eecs.umich.edu        updateRegMap(CPSR cpsr)
647639Sgblack@eecs.umich.edu        {
657639Sgblack@eecs.umich.edu            switch (cpsr.mode) {
667639Sgblack@eecs.umich.edu              case MODE_USER:
677639Sgblack@eecs.umich.edu              case MODE_SYSTEM:
687639Sgblack@eecs.umich.edu                intRegMap = IntRegUsrMap;
697639Sgblack@eecs.umich.edu                break;
707639Sgblack@eecs.umich.edu              case MODE_FIQ:
717644Sali.saidi@arm.com                intRegMap = IntRegFiqMap;
727639Sgblack@eecs.umich.edu                break;
737639Sgblack@eecs.umich.edu              case MODE_IRQ:
747639Sgblack@eecs.umich.edu                intRegMap = IntRegIrqMap;
757639Sgblack@eecs.umich.edu                break;
767639Sgblack@eecs.umich.edu              case MODE_SVC:
777639Sgblack@eecs.umich.edu                intRegMap = IntRegSvcMap;
787639Sgblack@eecs.umich.edu                break;
797639Sgblack@eecs.umich.edu              case MODE_MON:
807639Sgblack@eecs.umich.edu                intRegMap = IntRegMonMap;
817639Sgblack@eecs.umich.edu                break;
827644Sali.saidi@arm.com              case MODE_ABORT:
837639Sgblack@eecs.umich.edu                intRegMap = IntRegAbtMap;
847639Sgblack@eecs.umich.edu                break;
857639Sgblack@eecs.umich.edu              case MODE_UNDEFINED:
867639Sgblack@eecs.umich.edu                intRegMap = IntRegUndMap;
877639Sgblack@eecs.umich.edu                break;
887174Sgblack@eecs.umich.edu              default:
896754SN/A                panic("Unrecognized mode setting in CPSR.\n");
907296Sgblack@eecs.umich.edu            }
917400SAli.Saidi@ARM.com        }
927134Sgblack@eecs.umich.edu
937400SAli.Saidi@ARM.com      public:
947134Sgblack@eecs.umich.edu        void clear();
957134Sgblack@eecs.umich.edu
967296Sgblack@eecs.umich.edu        MiscReg readMiscRegNoEffect(int misc_reg);
976754SN/A        MiscReg readMiscReg(int misc_reg, ThreadContext *tc);
986754SN/A        void setMiscRegNoEffect(int misc_reg, const MiscReg &val);
996754SN/A        void setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc);
1006754SN/A
1016754SN/A        int
1027134Sgblack@eecs.umich.edu        flattenIntIndex(int reg)
1037422Sgblack@eecs.umich.edu        {
1046754SN/A            assert(reg >= 0);
1056754SN/A            if (reg < NUM_ARCH_INTREGS) {
1067296Sgblack@eecs.umich.edu                return intRegMap[reg];
1076309SN/A            } else if (reg < NUM_INTREGS) {
1086309SN/A                return reg;
1097296Sgblack@eecs.umich.edu            } else {
1107303Sgblack@eecs.umich.edu                int mode = reg / intRegsPerMode;
1117134Sgblack@eecs.umich.edu                reg = reg % intRegsPerMode;
1126309SN/A                switch (mode) {
1136309SN/A                  case MODE_USER:
1146309SN/A                  case MODE_SYSTEM:
1157296Sgblack@eecs.umich.edu                    return INTREG_USR(reg);
1167174Sgblack@eecs.umich.edu                  case MODE_FIQ:
1177174Sgblack@eecs.umich.edu                    return INTREG_FIQ(reg);
1187296Sgblack@eecs.umich.edu                  case MODE_IRQ:
1197303Sgblack@eecs.umich.edu                    return INTREG_IRQ(reg);
1207644Sali.saidi@arm.com                  case MODE_SVC:
1217644Sali.saidi@arm.com                    return INTREG_SVC(reg);
1227174Sgblack@eecs.umich.edu                  case MODE_MON:
1237174Sgblack@eecs.umich.edu                    return INTREG_MON(reg);
1247174Sgblack@eecs.umich.edu                  case MODE_ABORT:
1257639Sgblack@eecs.umich.edu                    return INTREG_ABT(reg);
1267639Sgblack@eecs.umich.edu                  case MODE_UNDEFINED:
1277639Sgblack@eecs.umich.edu                    return INTREG_UND(reg);
1287639Sgblack@eecs.umich.edu                  default:
1297639Sgblack@eecs.umich.edu                    panic("Flattening into an unknown mode.\n");
1307644Sali.saidi@arm.com                }
1317639Sgblack@eecs.umich.edu            }
1327639Sgblack@eecs.umich.edu        }
1337639Sgblack@eecs.umich.edu
1347639Sgblack@eecs.umich.edu        int
1357639Sgblack@eecs.umich.edu        flattenFloatIndex(int reg)
1367639Sgblack@eecs.umich.edu        {
1377639Sgblack@eecs.umich.edu            return reg;
1387639Sgblack@eecs.umich.edu        }
1397639Sgblack@eecs.umich.edu
1407639Sgblack@eecs.umich.edu        int
1417639Sgblack@eecs.umich.edu        flattenMiscIndex(int reg)
1427644Sali.saidi@arm.com        {
1437639Sgblack@eecs.umich.edu            if (reg == MISCREG_SPSR) {
1447639Sgblack@eecs.umich.edu                int spsr_idx = NUM_MISCREGS;
1457639Sgblack@eecs.umich.edu                CPSR cpsr = miscRegs[MISCREG_CPSR];
1467639Sgblack@eecs.umich.edu                switch (cpsr.mode) {
1477639Sgblack@eecs.umich.edu                  case MODE_USER:
1487639Sgblack@eecs.umich.edu                    warn("User mode does not have SPSR\n");
1497174Sgblack@eecs.umich.edu                    spsr_idx = MISCREG_SPSR;
1507174Sgblack@eecs.umich.edu                    break;
1517639Sgblack@eecs.umich.edu                  case MODE_FIQ:
1527639Sgblack@eecs.umich.edu                    spsr_idx = MISCREG_SPSR_FIQ;
1537639Sgblack@eecs.umich.edu                    break;
1547639Sgblack@eecs.umich.edu                  case MODE_IRQ:
1557174Sgblack@eecs.umich.edu                    spsr_idx = MISCREG_SPSR_IRQ;
1567174Sgblack@eecs.umich.edu                    break;
1577174Sgblack@eecs.umich.edu                  case MODE_SVC:
1587174Sgblack@eecs.umich.edu                    spsr_idx = MISCREG_SPSR_SVC;
1597174Sgblack@eecs.umich.edu                    break;
1607174Sgblack@eecs.umich.edu                  case MODE_MON:
1617174Sgblack@eecs.umich.edu                    spsr_idx = MISCREG_SPSR_MON;
1627174Sgblack@eecs.umich.edu                    break;
1637174Sgblack@eecs.umich.edu                  case MODE_ABORT:
1647174Sgblack@eecs.umich.edu                    spsr_idx = MISCREG_SPSR_ABT;
1657174Sgblack@eecs.umich.edu                    break;
1666309SN/A                  case MODE_UNDEFINED:
1676308SN/A                    spsr_idx = MISCREG_SPSR_UND;
1687639Sgblack@eecs.umich.edu                    break;
1697639Sgblack@eecs.umich.edu                  default:
1707639Sgblack@eecs.umich.edu                    warn("Trying to access SPSR in an invalid mode: %d\n",
1717639Sgblack@eecs.umich.edu                         cpsr.mode);
1727639Sgblack@eecs.umich.edu                    spsr_idx = MISCREG_SPSR;
1737639Sgblack@eecs.umich.edu                    break;
1747639Sgblack@eecs.umich.edu                }
1757639Sgblack@eecs.umich.edu                return spsr_idx;
1767639Sgblack@eecs.umich.edu            }
1777639Sgblack@eecs.umich.edu            return reg;
1787639Sgblack@eecs.umich.edu        }
1797639Sgblack@eecs.umich.edu
1807639Sgblack@eecs.umich.edu        void serialize(EventManager *em, std::ostream &os)
1817639Sgblack@eecs.umich.edu        {
1827639Sgblack@eecs.umich.edu            DPRINTF(Checkpoint, "Serializing Arm Misc Registers\n");
1837639Sgblack@eecs.umich.edu            SERIALIZE_ARRAY(miscRegs, NumMiscRegs);
1847639Sgblack@eecs.umich.edu        }
1857639Sgblack@eecs.umich.edu        void unserialize(EventManager *em, Checkpoint *cp,
1867639Sgblack@eecs.umich.edu                const std::string &section)
1877639Sgblack@eecs.umich.edu        {
1887639Sgblack@eecs.umich.edu            DPRINTF(Checkpoint, "Unserializing Arm Misc Registers\n");
1897639Sgblack@eecs.umich.edu            UNSERIALIZE_ARRAY(miscRegs, NumMiscRegs);
1907639Sgblack@eecs.umich.edu            CPSR tmp_cpsr = miscRegs[MISCREG_CPSR];
1917639Sgblack@eecs.umich.edu            updateRegMap(tmp_cpsr);
1927639Sgblack@eecs.umich.edu        }
1937639Sgblack@eecs.umich.edu
1947639Sgblack@eecs.umich.edu        ISA()
1957639Sgblack@eecs.umich.edu        {
1967639Sgblack@eecs.umich.edu            SCTLR sctlr;
1977639Sgblack@eecs.umich.edu            sctlr = 0;
1987639Sgblack@eecs.umich.edu            miscRegs[MISCREG_SCTLR_RST] = sctlr;
1997639Sgblack@eecs.umich.edu
2007639Sgblack@eecs.umich.edu            clear();
2017639Sgblack@eecs.umich.edu        }
2027639Sgblack@eecs.umich.edu    };
2037639Sgblack@eecs.umich.edu}
2047639Sgblack@eecs.umich.edu
2057639Sgblack@eecs.umich.edu#endif
2067639Sgblack@eecs.umich.edu