changeset 98101a5f7ee4 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=98101a5f7ee4
description:
        ARM: Begin implementing CP15

diffstat:

6 files changed, 69 insertions(+), 4 deletions(-)
src/arch/arm/insts/static_inst.cc |    1 
src/arch/arm/isa/bitfields.isa    |    1 
src/arch/arm/isa/decoder.isa      |   51 ++++++++++++++++++++++++++++++++++---
src/arch/arm/types.hh             |    1 
src/arch/arm/utility.cc           |   16 +++++++++++
src/arch/arm/utility.hh           |    3 ++

diffs (131 lines):

diff -r 06d26015e4f1 -r 98101a5f7ee4 src/arch/arm/insts/static_inst.cc
--- a/src/arch/arm/insts/static_inst.cc Tue Nov 17 18:02:08 2009 -0600
+++ b/src/arch/arm/insts/static_inst.cc Tue Nov 17 18:02:09 2009 -0600
@@ -27,6 +27,7 @@
  * Authors: Stephen Hines
  */
 
+#include "arch/arm/faults.hh"
 #include "arch/arm/insts/static_inst.hh"
 #include "base/condcodes.hh"
 #include "base/cprintf.hh"
diff -r 06d26015e4f1 -r 98101a5f7ee4 src/arch/arm/isa/bitfields.isa
--- a/src/arch/arm/isa/bitfields.isa    Tue Nov 17 18:02:08 2009 -0600
+++ b/src/arch/arm/isa/bitfields.isa    Tue Nov 17 18:02:09 2009 -0600
@@ -49,6 +49,7 @@
 def bitfield OPCODE_15_12  opcode15_12;
 def bitfield OPCODE_15    opcode15;
 def bitfield MISC_OPCODE   miscOpcode;
+def bitfield OPC2          opc2; 
 def bitfield OPCODE_7      opcode7;
 def bitfield OPCODE_4      opcode4;
 
diff -r 06d26015e4f1 -r 98101a5f7ee4 src/arch/arm/isa/decoder.isa
--- a/src/arch/arm/isa/decoder.isa      Tue Nov 17 18:02:08 2009 -0600
+++ b/src/arch/arm/isa/decoder.isa      Tue Nov 17 18:02:09 2009 -0600
@@ -493,10 +493,53 @@
                         }
                     } // MEDIA_OPCODE (MISC_OPCODE 0x1)
                 } // MISC_OPCODE (CPNUM 0xA)
-                0xf: decode OPCODE_20 {
-                    0: WarnUnimpl::mcr_cp15();
-                    1: WarnUnimpl::mrc_cp15();
-                }   
+                0xf: decode RN {
+                    // Barrriers, Cache Maintence, NOPS
+                    7: decode OPCODE_23_21 {
+                        0: decode RM {
+                            0: decode OPC2 {
+                                4: decode OPCODE_20 {
+                                    0: PredOp::mcr_cp15_nop1({{ }}); // was wfi
+                                }
+                            }
+                            1: WarnUnimpl::cp15_cache_maint();
+                            4: WarnUnimpl::cp15_par();
+                            5: decode OPC2 {
+                                0,1: WarnUnimpl::cp15_cache_maint2();
+                                4: PredOp::cp15_isb({{ ; }}, IsMemBarrier, 
IsSerializeBefore);
+                                6,7: WarnUnimpl::cp15_bp_maint();
+                            }
+                            6: WarnUnimpl::cp15_cache_maint3();
+                            8: WarnUnimpl::cp15_va_to_pa();
+                            10: decode OPC2 {
+                                1,2: WarnUnimpl::cp15_cache_maint3();
+                                4: PredOp::cp15_dsb({{ ; }}, IsMemBarrier, 
IsSerializeBefore);
+                                5: PredOp::cp15_dmb({{ ; }}, IsMemBarrier, 
IsSerializeBefore);
+                            }
+                            11: WarnUnimpl::cp15_cache_maint4();
+                            13: decode OPC2 {
+                                1: decode OPCODE_20 {
+                                    0: PredOp::mcr_cp15_nop2({{ }}); // was 
prefetch
+                                }
+                            }
+                            14: WarnUnimpl::cp15_cache_maint5();
+                        } // RM
+                    } // OPCODE_23_21 CR
+                            
+                    // Thread ID and context ID registers
+                    // Thread ID register needs cheaper access than miscreg
+                    13: WarnUnimpl::mcr_mrc_cp15_c7(); 
+
+                    // All the rest
+                    default: decode OPCODE_20 {
+                        0: PredOp::mcr_cp15({{ 
+                               fault = setCp15Register(Rd, RN, OPCODE_23_21, 
RM, OPC2); 
+                        }});
+                        1: PredOp::mrc_cp15({{ 
+                               fault = readCp15Register(Rd, RN, OPCODE_23_21, 
RM, OPC2); 
+                        }});
+                    }
+                }  // RN 
             } // CPNUM  (OP4 == 1)
         } //OPCODE_4
 
diff -r 06d26015e4f1 -r 98101a5f7ee4 src/arch/arm/types.hh
--- a/src/arch/arm/types.hh     Tue Nov 17 18:02:08 2009 -0600
+++ b/src/arch/arm/types.hh     Tue Nov 17 18:02:09 2009 -0600
@@ -58,6 +58,7 @@
         Bitfield<15, 12> opcode15_12;
         Bitfield<15>     opcode15;
         Bitfield<7,  4>  miscOpcode;
+        Bitfield<7,5>    opc2;
         Bitfield<7>      opcode7;
         Bitfield<4>      opcode4;
 
diff -r 06d26015e4f1 -r 98101a5f7ee4 src/arch/arm/utility.cc
--- a/src/arch/arm/utility.cc   Tue Nov 17 18:02:08 2009 -0600
+++ b/src/arch/arm/utility.cc   Tue Nov 17 18:02:09 2009 -0600
@@ -57,4 +57,20 @@
 #endif
 }
 
+Fault 
+setCp15Register(uint32_t &Rd, int CRn, int opc1, int CRm, int opc2)
+{
+   return new UnimpFault(csprintf("MCR CP15: CRn: %d opc1: %d CRm: %d opc1: 
%d\n", 
+               CRn, opc1, CRm, opc2));     
 }
+
+Fault 
+readCp15Register(uint32_t &Rd, int CRn, int opc1, int CRm, int opc2)
+{
+   return new UnimpFault(csprintf("MRC CP15: CRn: %d opc1: %d CRm: %d opc1: 
%d\n", 
+           CRn, opc1, CRm, opc2));
+
+}
+
+
+}
diff -r 06d26015e4f1 -r 98101a5f7ee4 src/arch/arm/utility.hh
--- a/src/arch/arm/utility.hh   Tue Nov 17 18:02:08 2009 -0600
+++ b/src/arch/arm/utility.hh   Tue Nov 17 18:02:09 2009 -0600
@@ -135,6 +135,9 @@
     }
 
 uint64_t getArgument(ThreadContext *tc, int number, bool fp);
+    
+Fault setCp15Register(uint32_t &Rd, int CRn, int opc1, int CRm, int opc2);
+Fault readCp15Register(uint32_t &Rd, int CRn, int opc1, int CRm, int opc2);
 
 };
 
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to