ARM: Fix VFP enabled checks for mem instructions
authorAli Saidi <ali.saidi@arm.com>
Thu, 26 Aug 2010 00:10:42 +0000 (19:10 -0500)
committerAli Saidi <ali.saidi@arm.com>
Thu, 26 Aug 2010 00:10:42 +0000 (19:10 -0500)
src/arch/arm/isa.cc
src/arch/arm/isa/insts/fp.isa
src/arch/arm/isa/insts/ldr.isa
src/arch/arm/isa/insts/macromem.isa
src/arch/arm/isa/insts/neon.isa
src/arch/arm/isa/insts/str.isa
src/arch/arm/isa/templates/neon.isa
src/arch/arm/isa/templates/vfp.isa
src/arch/arm/utility.hh

index 7991dbfb7dc96ce8a308140bcbcc31465569ca3a..f5bbc36109c3961359b780b104240870e435d4a6 100644 (file)
@@ -139,6 +139,8 @@ ISA::clear()
         (0 << 2)  | // 3:2
         0;          // 1:0
 
+    miscRegs[MISCREG_CPACR] = 0;
+    miscRegs[MISCREG_FPSID] = 0x410430A0;
     //XXX We need to initialize the rest of the state.
 }
 
index 849ce1299fae39c65a938b83fbe431cd6552fe10..6ba4ac3bf0c5dafccd29806269f87e2dac2349c3 100644 (file)
@@ -192,14 +192,14 @@ let {{
     exec_output = ""
 
     vmsrIop = InstObjParams("vmsr", "Vmsr", "FpRegRegOp",
-                            { "code": vmsrrsEnabledCheckCode + \
+                            { "code": vmsrEnabledCheckCode + \
                                       "MiscDest = Op1;",
                               "predicate_test": predicateTest }, [])
     header_output += FpRegRegOpDeclare.subst(vmsrIop);
     decoder_output += FpRegRegOpConstructor.subst(vmsrIop);
     exec_output += PredOpExecute.subst(vmsrIop);
 
-    vmsrFpscrCode = vmsrrsEnabledCheckCode + '''
+    vmsrFpscrCode = vmsrEnabledCheckCode + '''
     Fpscr = Op1 & ~FpCondCodesMask;
     FpCondCodes = Op1 & FpCondCodesMask;
     '''
@@ -211,7 +211,7 @@ let {{
     exec_output += PredOpExecute.subst(vmsrFpscrIop);
 
     vmrsIop = InstObjParams("vmrs", "Vmrs", "FpRegRegOp",
-                            { "code": vmsrrsEnabledCheckCode + \
+                            { "code": vmrsEnabledCheckCode + \
                                       "Dest = MiscOp1;",
                               "predicate_test": predicateTest }, [])
     header_output += FpRegRegOpDeclare.subst(vmrsIop);
@@ -219,14 +219,14 @@ let {{
     exec_output += PredOpExecute.subst(vmrsIop);
 
     vmrsFpscrIop = InstObjParams("vmrs", "VmrsFpscr", "FpRegRegOp",
-                                 { "code": vmsrrsEnabledCheckCode + \
+                                 { "code": vmrsEnabledCheckCode + \
                                            "Dest = Fpscr | FpCondCodes;",
                                    "predicate_test": predicateTest }, [])
     header_output += FpRegRegOpDeclare.subst(vmrsFpscrIop);
     decoder_output += FpRegRegOpConstructor.subst(vmrsFpscrIop);
     exec_output += PredOpExecute.subst(vmrsFpscrIop);
 
-    vmrsApsrCode = vmsrrsEnabledCheckCode + '''
+    vmrsApsrCode = vmrsEnabledCheckCode + '''
         Dest = (MiscOp1 & imm) | (Dest & ~imm);
     '''
     vmrsApsrIop = InstObjParams("vmrs", "VmrsApsr", "FpRegRegImmOp",
@@ -236,7 +236,7 @@ let {{
     decoder_output += FpRegRegImmOpConstructor.subst(vmrsApsrIop);
     exec_output += PredOpExecute.subst(vmrsApsrIop);
 
-    vmrsApsrFpscrCode = vmsrrsEnabledCheckCode + '''
+    vmrsApsrFpscrCode = vmrsEnabledCheckCode + '''
     assert((imm & ~FpCondCodesMask) == 0);
     Dest = (FpCondCodes & imm) | (Dest & ~imm);
     '''
index 6919bbca4deb15da1d554b75f3ddaaf303f4e3d9..a936ffaaf08e04461d0cf1392ae01003bb7f42c8 100644 (file)
@@ -160,6 +160,10 @@ let {{
             if not self.post:
                 eaCode += self.offset
             eaCode += ";"
+
+            if self.flavor == "fp":
+                eaCode += vfpEnabledCheckCode
+
             self.codeBlobs["ea_code"] = eaCode
 
             # Code that actually handles the access
@@ -220,6 +224,10 @@ let {{
             if not self.post:
                 eaCode += self.offset
             eaCode += ";"
+
+            if self.flavor == "fp":
+                eaCode += vfpEnabledCheckCode
+
             self.codeBlobs["ea_code"] = eaCode
 
             # Code that actually handles the access
index 652a929f132e086bca59b744cc3e1e858d0f4ca1..bcb1e26b86192df08a724ec951f6fa568eb8fc2f 100644 (file)
@@ -59,7 +59,7 @@ let {{
     microLdrFpUopIop = InstObjParams('ldrfp_uop', 'MicroLdrFpUop',
                                       'MicroMemOp',
                                       {'memacc_code': microLdrFpUopCode,
-                                       'ea_code':
+                                       'ea_code': vfpEnabledCheckCode +
                                            'EA = Rb + (up ? imm : -imm);',
                                        'predicate_test': predicateTest},
                                       ['IsMicroop'])
@@ -68,7 +68,7 @@ let {{
     microLdrDBFpUopIop = InstObjParams('ldrfp_uop', 'MicroLdrDBFpUop',
                                       'MicroMemOp',
                                       {'memacc_code': microLdrFpUopCode,
-                                       'ea_code': '''
+                                       'ea_code': vfpEnabledCheckCode + '''
                                         EA = Rb + (up ? imm : -imm) +
                                              (((CPSR)Cpsr).e ? 4 : 0);
                                         ''',
@@ -79,7 +79,7 @@ let {{
     microLdrDTFpUopIop = InstObjParams('ldrfp_uop', 'MicroLdrDTFpUop',
                                       'MicroMemOp',
                                       {'memacc_code': microLdrFpUopCode,
-                                       'ea_code': '''
+                                       'ea_code': vfpEnabledCheckCode + '''
                                         EA = Rb + (up ? imm : -imm) -
                                              (((CPSR)Cpsr).e ? 4 : 0);
                                         ''',
@@ -117,7 +117,8 @@ let {{
                                      'MicroMemOp',
                                      {'memacc_code': microStrFpUopCode,
                                       'postacc_code': "",
-                                      'ea_code': 'EA = Rb + (up ? imm : -imm);',
+                                      'ea_code': vfpEnabledCheckCode +
+                                           'EA = Rb + (up ? imm : -imm);',
                                       'predicate_test': predicateTest},
                                      ['IsMicroop'])
 
@@ -126,7 +127,7 @@ let {{
                                        'MicroMemOp',
                                        {'memacc_code': microStrFpUopCode,
                                         'postacc_code': "",
-                                        'ea_code': '''
+                                        'ea_code': vfpEnabledCheckCode + '''
                                          EA = Rb + (up ? imm : -imm) +
                                               (((CPSR)Cpsr).e ? 4 : 0);
                                          ''',
@@ -138,7 +139,7 @@ let {{
                                        'MicroMemOp',
                                        {'memacc_code': microStrFpUopCode,
                                         'postacc_code': "",
-                                        'ea_code': '''
+                                        'ea_code': vfpEnabledCheckCode + '''
                                          EA = Rb + (up ? imm : -imm) -
                                               (((CPSR)Cpsr).e ? 4 : 0);
                                          ''',
@@ -222,7 +223,7 @@ let {{
                                 { 'mem_decl' : memDecl,
                                   'size' : size,
                                   'memacc_code' : loadMemAccCode,
-                                  'ea_code' : eaCode,
+                                  'ea_code' : simdEnabledCheckCode + eaCode,
                                   'predicate_test' : predicateTest },
                                 [ 'IsMicroop', 'IsMemRef', 'IsLoad' ])
         storeIop = InstObjParams('strneon%(size)d_uop' % subst,
@@ -231,7 +232,7 @@ let {{
                                  { 'mem_decl' : memDecl,
                                    'size' : size,
                                    'memacc_code' : storeMemAccCode,
-                                   'ea_code' : eaCode,
+                                   'ea_code' : simdEnabledCheckCode + eaCode,
                                    'predicate_test' : predicateTest },
                                  [ 'IsMicroop', 'IsMemRef', 'IsStore' ])
 
index 790c9c3a10efa10b951c4ceee9b1c05d4d2c7ded..0a32854909c4d26279b4ab87275601342798702c 100644 (file)
@@ -619,13 +619,6 @@ output exec {{
     }
 }};
 
-let {{
-    simdEnabledCheckCode = '''
-        if (!neonEnabled(Cpacr, Cpsr, Fpexc))
-            return disabledFault();
-    '''
-}};
-
 let {{
 
     header_output = ""
@@ -3235,7 +3228,7 @@ let {{
         RegVect srcReg1, srcReg2, destReg;
         '''
         for reg in range(rCount):
-            eWalkCode += '''
+            eWalkCode += simdEnabledCheckCode + '''
                 srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d.uw);
                 srcReg2.regs[%(reg)d] = htog(FpOp2P%(reg)d.uw);
             ''' % { "reg" : reg }
index 5b0e5b13231c56533db6a6a9a7bb27c47e19b2ee..66a486ecf3b68c68f0443f07d67ac4bb72ccc4dd 100644 (file)
@@ -171,6 +171,10 @@ let {{
             if not self.post:
                 eaCode += self.offset
             eaCode += ";"
+
+            if self.flavor == "fp":
+                eaCode += vfpEnabledCheckCode
+
             self.codeBlobs["ea_code"] = eaCode
 
             # Code that actually handles the access
@@ -241,6 +245,10 @@ let {{
             if not self.post:
                 eaCode += self.offset
             eaCode += ";"
+
+            if self.flavor == "fp":
+                eaCode += vfpEnabledCheckCode
+
             self.codeBlobs["ea_code"] = eaCode
 
             # Code that actually handles the access
index 20c1d26b836aacf131047037ee0b3046dd64e6f0..0e592c6e42d35b01ecd58a80d5f1aa8000f800a3 100644 (file)
 //
 // Authors: Gabe Black
 
+let {{
+    simdEnabledCheckCode = '''
+        if (!neonEnabled(Cpacr, Cpsr, Fpexc))
+            return disabledFault();
+    '''
+}};
+
+
 def template NeonRegRegRegOpDeclare {{
 template <class _Element>
 class %(class_name)s : public %(base_class)s
index 5de52738ca8def35df42d11f25a6954d2d64bbd3..8ccfedd0df4b1dff24b8a2b3db80b263752dd151 100644 (file)
@@ -43,9 +43,24 @@ let {{
             return disabledFault();
     '''
 
-    vmsrrsEnabledCheckCode = '''
+    vmsrEnabledCheckCode = '''
         if (!vfpEnabled(Cpacr, Cpsr))
-            return disabledFault();
+            if (dest != (int)MISCREG_FPEXC && dest != (int)MISCREG_FPSID)
+                return disabledFault();
+        if (!inPrivilegedMode(Cpsr))
+            if (dest != (int)MISCREG_FPSCR)
+                return disabledFault();
+
+    '''
+
+    vmrsEnabledCheckCode = '''
+        if (!vfpEnabled(Cpacr, Cpsr))
+            if (op1 != (int)MISCREG_FPEXC && op1 != (int)MISCREG_FPSID &&
+                op1 != (int)MISCREG_MVFR0 && op1 != (int)MISCREG_MVFR1)
+                return disabledFault();
+        if (!inPrivilegedMode(Cpsr))
+            if (op1 != (int)MISCREG_FPSCR)
+                return disabledFault();
     '''
 }};
 
index 4256aa047c5cdbeb63dea5385179fdeefbb5d820..c2daff99f27b0630de517a17d0b32cf76dc84f88 100644 (file)
@@ -150,7 +150,7 @@ namespace ArmISA {
     vfpEnabled(CPACR cpacr, CPSR cpsr)
     {
         return cpacr.cp10 == 0x3 ||
-            (cpacr.cp10 == 0x2 && inPrivilegedMode(cpsr));
+            (cpacr.cp10 == 0x1 && inPrivilegedMode(cpsr));
     }
 
     static inline bool