summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2018-06-05 16:17:48 +0100
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2018-06-22 10:53:40 +0000
commitb4a10d55e55752c3423a9d0f4b529f7f80432590 (patch)
tree34f6f36084709e9e2ea1568e3a5ff9051d9c5d57
parentfc278fffb78512ff3d62a906804d6b285edd00c7 (diff)
downloadgem5-b4a10d55e55752c3423a9d0f4b529f7f80432590.tar.xz
arch-arm: AArch32 execution triggering AArch64 SW Break
AArch32 Software Breakpoint (BKPT) can trigger an AArch64 fault when interprocessing if the trapping conditions are met. Change-Id: I485852ed19429f9cd928a6447a95eb6f471f189c Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/11197 Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
-rw-r--r--src/arch/arm/faults.cc2
-rw-r--r--src/arch/arm/insts/static_inst.cc17
-rw-r--r--src/arch/arm/insts/static_inst.hh8
-rw-r--r--src/arch/arm/isa/formats/breakpoint.isa44
-rw-r--r--src/arch/arm/isa/insts/misc.isa10
5 files changed, 35 insertions, 46 deletions
diff --git a/src/arch/arm/faults.cc b/src/arch/arm/faults.cc
index cf58960ec..ab0d0de0f 100644
--- a/src/arch/arm/faults.cc
+++ b/src/arch/arm/faults.cc
@@ -1533,8 +1533,6 @@ SoftwareBreakpoint::SoftwareBreakpoint(ExtMachInst _mach_inst, uint32_t _iss)
bool
SoftwareBreakpoint::routeToHyp(ThreadContext *tc) const
{
- assert(from64);
-
const bool have_el2 = ArmSystem::haveVirtualization(tc);
const HCR hcr = tc->readMiscRegNoEffect(MISCREG_HCR_EL2);
diff --git a/src/arch/arm/insts/static_inst.cc b/src/arch/arm/insts/static_inst.cc
index b7f235e98..bd6f11521 100644
--- a/src/arch/arm/insts/static_inst.cc
+++ b/src/arch/arm/insts/static_inst.cc
@@ -605,6 +605,23 @@ ArmStaticInst::generateDisassembly(Addr pc,
return ss.str();
}
+Fault
+ArmStaticInst::softwareBreakpoint32(ExecContext *xc, uint16_t imm) const
+{
+ const auto tc = xc->tcBase();
+ const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
+ const HDCR mdcr = tc->readMiscRegNoEffect(MISCREG_MDCR_EL2);
+ if ((ArmSystem::haveEL(tc, EL2) && !inSecureState(tc) &&
+ !ELIs32(tc, EL2) && (hcr.tge == 1 || mdcr.tde == 1)) ||
+ !ELIs32(tc, EL1)) {
+ // Route to AArch64 Software Breakpoint
+ return std::make_shared<SoftwareBreakpoint>(machInst, imm);
+ } else {
+ // Execute AArch32 Software Breakpoint
+ return std::make_shared<PrefetchAbort>(readPC(xc),
+ ArmFault::DebugEvent);
+ }
+}
Fault
ArmStaticInst::advSIMDFPAccessTrap64(ExceptionLevel el) const
diff --git a/src/arch/arm/insts/static_inst.hh b/src/arch/arm/insts/static_inst.hh
index 873dfff02..6216598dc 100644
--- a/src/arch/arm/insts/static_inst.hh
+++ b/src/arch/arm/insts/static_inst.hh
@@ -371,6 +371,14 @@ class ArmStaticInst : public StaticInst
ExceptionLevel targetEL, bool isWfe) const;
/**
+ * Trigger a Software Breakpoint.
+ *
+ * See aarch32/exceptions/debug/AArch32.SoftwareBreakpoint in the
+ * ARM ARM psueodcode library.
+ */
+ Fault softwareBreakpoint32(ExecContext *xc, uint16_t imm) const;
+
+ /**
* Trap an access to Advanced SIMD or FP registers due to access
* control bits.
*
diff --git a/src/arch/arm/isa/formats/breakpoint.isa b/src/arch/arm/isa/formats/breakpoint.isa
index 4f281e045..67360f1b5 100644
--- a/src/arch/arm/isa/formats/breakpoint.isa
+++ b/src/arch/arm/isa/formats/breakpoint.isa
@@ -45,53 +45,11 @@
// Breakpoint instructions
//
-output header {{
- /**
- * Static instruction class for Breakpoint (illegal) instructions.
- * These cause simulator termination if they are executed in a
- * non-speculative mode. This is a leaf class.
- */
- class Breakpoint : public ArmStaticInst
- {
- public:
- /// Constructor
- Breakpoint(ExtMachInst _machInst)
- : ArmStaticInst("Breakpoint", _machInst, No_OpClass)
- {
- // don't call execute() (which panics) if we're on a
- // speculative path
- flags[IsNonSpeculative] = true;
- }
-
- Fault execute(ExecContext *, Trace::InstRecord *) const override;
-
- std::string
- generateDisassembly(Addr pc, const SymbolTable *symtab) const override;
- };
-}};
-
-output decoder {{
- std::string
- Breakpoint::generateDisassembly(Addr pc, const SymbolTable *symtab) const
- {
- return csprintf("%-10s (inst 0x%x)", "Breakpoint", machInst);
- }
-}};
-
-output exec {{
- Fault
- Breakpoint::execute(ExecContext *xc, Trace::InstRecord *traceData) const
- {
- return std::make_shared<PrefetchAbort>(xc->pcState().pc(),
- ArmFault::DebugEvent);
- }
-}};
-
def format ArmBkptHlt() {{
decode_block = '''
{
if (bits(machInst, 21)) {
- return new Breakpoint(machInst);
+ return new BkptInst(machInst);
} else {
uint32_t imm16 = (bits(machInst, 19, 8) << 4) |
(bits(machInst, 3, 0) << 0);
diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa
index ef579bf5a..932deebbf 100644
--- a/src/arch/arm/isa/insts/misc.isa
+++ b/src/arch/arm/isa/insts/misc.isa
@@ -688,7 +688,15 @@ let {{
decoder_output += RegRegRegRegOpConstructor.subst(usada8Iop)
exec_output += PredOpExecute.subst(usada8Iop)
- bkptCode = 'return std::make_shared<PrefetchAbort>(PC, ArmFault::DebugEvent);\n'
+ bkptCode = '''
+ uint16_t imm16;
+ if (!machInst.thumb)
+ imm16 = ((bits(machInst, 19, 8) << 4) | bits(machInst, 3, 0));
+ else
+ imm16 = bits(machInst, 7, 0);
+
+ return softwareBreakpoint32(xc, imm16);
+ '''
bkptIop = InstObjParams("bkpt", "BkptInst", "PredOp", bkptCode)
header_output += BasicDeclare.subst(bkptIop)
decoder_output += BasicConstructor.subst(bkptIop)