priv.isa revision 2469
110996Sandreas.sandberg@arm.com////////////////////////////////////////////////////////////////////
210996Sandreas.sandberg@arm.com//
310996Sandreas.sandberg@arm.com// Privelege mode instructions
410996Sandreas.sandberg@arm.com//
510996Sandreas.sandberg@arm.com
610996Sandreas.sandberg@arm.comoutput header {{
710996Sandreas.sandberg@arm.com        /**
810996Sandreas.sandberg@arm.com         * Base class for privelege mode operations.
910996Sandreas.sandberg@arm.com         */
1010996Sandreas.sandberg@arm.com        class Priv : public SparcStaticInst
1110996Sandreas.sandberg@arm.com        {
1210996Sandreas.sandberg@arm.com          protected:
1310996Sandreas.sandberg@arm.com            // Constructor
1410996Sandreas.sandberg@arm.com            Priv(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
1510996Sandreas.sandberg@arm.com                SparcStaticInst(mnem, _machInst, __opClass)
1610996Sandreas.sandberg@arm.com            {
1710996Sandreas.sandberg@arm.com            }
1810996Sandreas.sandberg@arm.com
1910996Sandreas.sandberg@arm.com            std::string generateDisassembly(Addr pc,
2010996Sandreas.sandberg@arm.com                    const SymbolTable *symtab) const;
2110996Sandreas.sandberg@arm.com        };
2210996Sandreas.sandberg@arm.com
2310996Sandreas.sandberg@arm.com        /**
2410996Sandreas.sandberg@arm.com         * Base class for user mode "tick" access.
2510996Sandreas.sandberg@arm.com         */
2610996Sandreas.sandberg@arm.com        class PrivTick : public SparcStaticInst
2710996Sandreas.sandberg@arm.com        {
2810996Sandreas.sandberg@arm.com          protected:
2910996Sandreas.sandberg@arm.com            // Constructor
3010996Sandreas.sandberg@arm.com            PrivTick(const char *mnem, ExtMachInst _machInst,
3110996Sandreas.sandberg@arm.com                    OpClass __opClass) :
3210996Sandreas.sandberg@arm.com                SparcStaticInst(mnem, _machInst, __opClass)
3310996Sandreas.sandberg@arm.com            {
3410996Sandreas.sandberg@arm.com            }
3510996Sandreas.sandberg@arm.com
3610996Sandreas.sandberg@arm.com            std::string generateDisassembly(Addr pc,
3710996Sandreas.sandberg@arm.com                    const SymbolTable *symtab) const;
3810996Sandreas.sandberg@arm.com        };
3910996Sandreas.sandberg@arm.com
4011001Sandreas.sandberg@arm.com        /**
4111001Sandreas.sandberg@arm.com         * Base class for privelege mode operations with immediates.
4210996Sandreas.sandberg@arm.com         */
4310996Sandreas.sandberg@arm.com        class PrivImm : public Priv
4410996Sandreas.sandberg@arm.com        {
4510996Sandreas.sandberg@arm.com          protected:
4610996Sandreas.sandberg@arm.com            // Constructor
4710996Sandreas.sandberg@arm.com            PrivImm(const char *mnem, ExtMachInst _machInst,
4812191Sgabeblack@google.com                    OpClass __opClass) :
4910996Sandreas.sandberg@arm.com                Priv(mnem, _machInst, __opClass), imm(SIMM13)
5010996Sandreas.sandberg@arm.com            {
5110996Sandreas.sandberg@arm.com            }
5210996Sandreas.sandberg@arm.com
5310996Sandreas.sandberg@arm.com            uint32_t imm;
5410996Sandreas.sandberg@arm.com        };
5510996Sandreas.sandberg@arm.com
5611168Sandreas.hansson@arm.com        /**
5710996Sandreas.sandberg@arm.com         * Base class for user mode "tick" access with immediates.
5810996Sandreas.sandberg@arm.com         */
5910996Sandreas.sandberg@arm.com        class PrivTickImm : public PrivTick
6010996Sandreas.sandberg@arm.com        {
6110996Sandreas.sandberg@arm.com          protected:
6210996Sandreas.sandberg@arm.com            // Constructor
6310996Sandreas.sandberg@arm.com            PrivTickImm(const char *mnem, ExtMachInst _machInst,
6412191Sgabeblack@google.com                    OpClass __opClass) :
6512191Sgabeblack@google.com                PrivTick(mnem, _machInst, __opClass), imm(SIMM13)
6610996Sandreas.sandberg@arm.com            {
6710996Sandreas.sandberg@arm.com            }
6810996Sandreas.sandberg@arm.com
6910996Sandreas.sandberg@arm.com            uint32_t imm;
7011437Svictor.garcia@arm.com        };
7112191Sgabeblack@google.com}};
7212191Sgabeblack@google.com
7311437Svictor.garcia@arm.comoutput decoder {{
7411437Svictor.garcia@arm.com        std::string Priv::generateDisassembly(Addr pc,
7511437Svictor.garcia@arm.com                const SymbolTable *symtab) const
7611437Svictor.garcia@arm.com        {
7710996Sandreas.sandberg@arm.com                return "Privileged Instruction";
7810996Sandreas.sandberg@arm.com        }
7911001Sandreas.sandberg@arm.com
80        std::string PrivTick::generateDisassembly(Addr pc,
81                const SymbolTable *symtab) const
82        {
83                return "Regular access to Tick";
84        }
85}};
86
87def template PrivExecute {{
88    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
89            Trace::InstRecord *traceData) const
90    {
91        %(op_decl)s;
92        %(op_rd)s;
93
94        //If the processor isn't in privileged mode, fault out right away
95        if(!pstate_priv)
96            return new PrivilegedOpCode
97
98        %(code)s;
99        %(op_wb)s;
100    }
101}};
102
103def template PrivTickExecute {{
104    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
105            Trace::InstRecord *traceData) const
106    {
107        %(op_decl)s;
108        %(op_rd)s;
109
110        //If the processor isn't in privileged mode, fault out right away
111        if(!pstate_priv && tick_npt)
112            return new PrivilegedAction
113
114        %(code)s;
115        %(op_wb)s;
116    }
117}};
118
119def template Rb2OrImm13Decode {{
120    {
121        return (I ? (SparcStaticInst *)(new %(class_name)sImm(machInst))
122                  : (SparcStaticInst *)(new %(class_name)s(machInst)));
123    }
124}};
125
126// Primary format for integer operate instructions:
127def format Priv(code, *opt_flags) {{
128        uses_imm = (code.find('Rs2_or_imm13') != -1)
129        if uses_imm:
130            orig_code = code
131            code = re.sub(r'Rs2_or_imm', 'Rs2', orig_code)
132            imm_code = re.sub(r'Rs2_or_imm(\.\w+)?', 'imm', orig_code)
133        cblk = CodeBlock(code)
134        iop = InstObjParams(name, Name, 'Priv', cblk, opt_flags)
135        header_output = BasicDeclare.subst(iop)
136        decoder_output = BasicConstructor.subst(iop)
137        exec_output = PrivExecute.subst(iop)
138        if uses_imm:
139            imm_cblk = CodeBlock(imm_code)
140            imm_iop = InstObjParams(name, Name + 'Imm', 'PrivImm', imm_cblk,
141                                    opt_flags)
142            header_output += BasicDeclare.subst(imm_iop)
143            decoder_output += BasicConstructor.subst(imm_iop)
144            exec_output += PrivExecute.subst(imm_iop)
145            decode_block = Rb2OrImm13Decode.subst(iop)
146        else:
147            decode_block = BasicDecode.subst(iop)
148}};
149
150// Primary format for integer operate instructions:
151def format PrivTick(code, *opt_flags) {{
152        uses_imm = (code.find('Rs2_or_imm13') != -1)
153        if uses_imm:
154            orig_code = code
155            code = re.sub(r'Rs2_or_imm', 'Rs2', orig_code)
156            imm_code = re.sub(r'Rs2_or_imm(\.\w+)?', 'imm', orig_code)
157        cblk = CodeBlock(code)
158        iop = InstObjParams(name, Name, 'PrivTick', cblk, opt_flags)
159        header_output = BasicDeclare.subst(iop)
160        decoder_output = BasicConstructor.subst(iop)
161        exec_output = PrivTickExecute.subst(iop)
162        if uses_imm:
163            imm_cblk = CodeBlock(imm_code)
164            imm_iop = InstObjParams(name, Name + 'Imm', 'PrivTickImm', imm_cblk,
165                                    opt_flags)
166            header_output += BasicDeclare.subst(imm_iop)
167            decoder_output += BasicConstructor.subst(imm_iop)
168            exec_output += PrivTickExecute.subst(imm_iop)
169            decode_block = Rb2OrImm13Decode.subst(iop)
170        else:
171            decode_block = BasicDecode.subst(iop)
172}};
173