2 * Copyright (c) 2010, 2012-2013, 2017-2018 ARM Limited
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 #ifndef __ARCH_ARM_INSTS_MISC_HH__
41 #define __ARCH_ARM_INSTS_MISC_HH__
43 #include "arch/arm/insts/pred_inst.hh"
45 class MrsOp : public PredOp
50 MrsOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
52 PredOp(mnem, _machInst, __opClass), dest(_dest)
55 std::string generateDisassembly(
56 Addr pc, const SymbolTable *symtab) const override;
59 class MsrBase : public PredOp
64 MsrBase(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
66 PredOp(mnem, _machInst, __opClass), byteMask(_byteMask)
69 void printMsrBase(std::ostream &os) const;
72 class MsrImmOp : public MsrBase
77 MsrImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
78 uint32_t _imm, uint8_t _byteMask) :
79 MsrBase(mnem, _machInst, __opClass, _byteMask), imm(_imm)
82 std::string generateDisassembly(
83 Addr pc, const SymbolTable *symtab) const override;
86 class MsrRegOp : public MsrBase
91 MsrRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
92 IntRegIndex _op1, uint8_t _byteMask) :
93 MsrBase(mnem, _machInst, __opClass, _byteMask), op1(_op1)
96 std::string generateDisassembly(
97 Addr pc, const SymbolTable *symtab) const override;
100 class MrrcOp : public PredOp
108 MrrcOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
109 MiscRegIndex _op1, IntRegIndex _dest, IntRegIndex _dest2,
111 PredOp(mnem, _machInst, __opClass), op1(_op1), dest(_dest),
112 dest2(_dest2), imm(_imm)
115 std::string generateDisassembly(
116 Addr pc, const SymbolTable *symtab) const override;
119 class McrrOp : public PredOp
127 McrrOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
128 IntRegIndex _op1, IntRegIndex _op2, MiscRegIndex _dest,
130 PredOp(mnem, _machInst, __opClass), op1(_op1), op2(_op2),
131 dest(_dest), imm(_imm)
134 std::string generateDisassembly(
135 Addr pc, const SymbolTable *symtab) const override;
138 class ImmOp : public PredOp
143 ImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
145 PredOp(mnem, _machInst, __opClass), imm(_imm)
148 std::string generateDisassembly(
149 Addr pc, const SymbolTable *symtab) const override;
152 class RegImmOp : public PredOp
158 RegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
159 IntRegIndex _dest, uint64_t _imm) :
160 PredOp(mnem, _machInst, __opClass), dest(_dest), imm(_imm)
163 std::string generateDisassembly(
164 Addr pc, const SymbolTable *symtab) const override;
167 class RegRegOp : public PredOp
173 RegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
174 IntRegIndex _dest, IntRegIndex _op1) :
175 PredOp(mnem, _machInst, __opClass), dest(_dest), op1(_op1)
178 std::string generateDisassembly(
179 Addr pc, const SymbolTable *symtab) const override;
182 class RegOp : public PredOp
187 RegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
189 PredOp(mnem, _machInst, __opClass), dest(_dest)
192 std::string generateDisassembly(
193 Addr pc, const SymbolTable *symtab) const override;
196 class RegImmRegOp : public PredOp
203 RegImmRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
204 IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1) :
205 PredOp(mnem, _machInst, __opClass),
206 dest(_dest), imm(_imm), op1(_op1)
209 std::string generateDisassembly(
210 Addr pc, const SymbolTable *symtab) const override;
213 class RegRegRegImmOp : public PredOp
221 RegRegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
222 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
224 PredOp(mnem, _machInst, __opClass),
225 dest(_dest), op1(_op1), op2(_op2), imm(_imm)
228 std::string generateDisassembly(
229 Addr pc, const SymbolTable *symtab) const override;
232 class RegRegRegRegOp : public PredOp
240 RegRegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
241 IntRegIndex _dest, IntRegIndex _op1,
242 IntRegIndex _op2, IntRegIndex _op3) :
243 PredOp(mnem, _machInst, __opClass),
244 dest(_dest), op1(_op1), op2(_op2), op3(_op3)
247 std::string generateDisassembly(
248 Addr pc, const SymbolTable *symtab) const override;
251 class RegRegRegOp : public PredOp
258 RegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
259 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2) :
260 PredOp(mnem, _machInst, __opClass),
261 dest(_dest), op1(_op1), op2(_op2)
264 std::string generateDisassembly(
265 Addr pc, const SymbolTable *symtab) const override;
268 class RegRegImmOp : public PredOp
275 RegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
276 IntRegIndex _dest, IntRegIndex _op1,
278 PredOp(mnem, _machInst, __opClass),
279 dest(_dest), op1(_op1), imm(_imm)
282 std::string generateDisassembly(
283 Addr pc, const SymbolTable *symtab) const override;
286 class MiscRegRegImmOp : public PredOp
293 MiscRegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
294 MiscRegIndex _dest, IntRegIndex _op1,
296 PredOp(mnem, _machInst, __opClass),
297 dest(_dest), op1(_op1), imm(_imm)
300 std::string generateDisassembly(
301 Addr pc, const SymbolTable *symtab) const override;
304 class RegMiscRegImmOp : public PredOp
311 RegMiscRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
312 IntRegIndex _dest, MiscRegIndex _op1,
314 PredOp(mnem, _machInst, __opClass),
315 dest(_dest), op1(_op1), imm(_imm)
318 std::string generateDisassembly(
319 Addr pc, const SymbolTable *symtab) const override;
322 class RegImmImmOp : public PredOp
329 RegImmImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
330 IntRegIndex _dest, uint64_t _imm1, uint64_t _imm2) :
331 PredOp(mnem, _machInst, __opClass),
332 dest(_dest), imm1(_imm1), imm2(_imm2)
335 std::string generateDisassembly(
336 Addr pc, const SymbolTable *symtab) const override;
339 class RegRegImmImmOp : public PredOp
347 RegRegImmImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
348 IntRegIndex _dest, IntRegIndex _op1,
349 uint64_t _imm1, uint64_t _imm2) :
350 PredOp(mnem, _machInst, __opClass),
351 dest(_dest), op1(_op1), imm1(_imm1), imm2(_imm2)
354 std::string generateDisassembly(
355 Addr pc, const SymbolTable *symtab) const override;
358 class RegImmRegShiftOp : public PredOp
365 ArmShiftType shiftType;
367 RegImmRegShiftOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
368 IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1,
369 int32_t _shiftAmt, ArmShiftType _shiftType) :
370 PredOp(mnem, _machInst, __opClass),
371 dest(_dest), imm(_imm), op1(_op1),
372 shiftAmt(_shiftAmt), shiftType(_shiftType)
375 std::string generateDisassembly(
376 Addr pc, const SymbolTable *symtab) const override;
379 class UnknownOp : public PredOp
383 UnknownOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
384 PredOp(mnem, _machInst, __opClass)
387 std::string generateDisassembly(
388 Addr pc, const SymbolTable *symtab) const override;
392 * Certain mrc/mcr instructions act as nops or flush the pipe based on what
393 * register the instruction is trying to access. This inst/class exists so that
394 * we can still check for hyp traps, as the normal nop instruction
397 class McrMrcMiscInst : public ArmStaticInst
401 MiscRegIndex miscReg;
404 McrMrcMiscInst(const char *_mnemonic, ExtMachInst _machInst,
405 uint64_t _iss, MiscRegIndex _miscReg);
407 Fault execute(ExecContext *xc,
408 Trace::InstRecord *traceData) const override;
410 std::string generateDisassembly(
411 Addr pc, const SymbolTable *symtab) const override;
416 * This class is also used for IMPLEMENTATION DEFINED registers, whose mcr/mrc
417 * behaviour is trappable even for unimplemented registers.
419 class McrMrcImplDefined : public McrMrcMiscInst
422 McrMrcImplDefined(const char *_mnemonic, ExtMachInst _machInst,
423 uint64_t _iss, MiscRegIndex _miscReg);
425 Fault execute(ExecContext *xc,
426 Trace::InstRecord *traceData) const override;
428 std::string generateDisassembly(
429 Addr pc, const SymbolTable *symtab) const override;