diff --git a/src/arch/arm/semihosting.cc b/src/arch/arm/semihosting.cc index 5ea894af34..b6db38af9d 100644 --- a/src/arch/arm/semihosting.cc +++ b/src/arch/arm/semihosting.cc @@ -154,9 +154,14 @@ ArmSemihosting::ArmSemihosting(const ArmSemihostingParams *p) } void -ArmSemihosting::call64(ThreadContext *tc) +ArmSemihosting::call64(ThreadContext *tc, bool gem5_ops) { RegVal op = tc->readIntReg(ArmISA::INTREG_X0 & mask(32)); + if (op > MaxStandardOp && !gem5_ops) { + unrecognizedCall( + tc, "Gem5 semihosting op (0x%x) disabled from here.", op); + return; + } auto it = calls.find(op); if (it == calls.end()) { @@ -173,9 +178,14 @@ ArmSemihosting::call64(ThreadContext *tc) } void -ArmSemihosting::call32(ThreadContext *tc) +ArmSemihosting::call32(ThreadContext *tc, bool gem5_ops) { RegVal op = tc->readIntReg(ArmISA::INTREG_R0); + if (op > MaxStandardOp && !gem5_ops) { + unrecognizedCall( + tc, "Gem5 semihosting op (0x%x) disabled from here.", op); + return; + } auto it = calls.find(op); if (it == calls.end()) { diff --git a/src/arch/arm/semihosting.hh b/src/arch/arm/semihosting.hh index 4a8aa2bd96..9aa5b41979 100644 --- a/src/arch/arm/semihosting.hh +++ b/src/arch/arm/semihosting.hh @@ -214,9 +214,9 @@ class ArmSemihosting : public SimObject ArmSemihosting(const ArmSemihostingParams *p); /** Perform an Arm Semihosting call from aarch64 code. */ - void call64(ThreadContext *tc); + void call64(ThreadContext *tc, bool gem5_ops); /** Perform an Arm Semihosting call from aarch32 code. */ - void call32(ThreadContext *tc); + void call32(ThreadContext *tc, bool gem5_ops); public: // SimObject and related interfaces void serialize(CheckpointOut &cp) const override; diff --git a/src/arch/arm/system.cc b/src/arch/arm/system.cc index 906cc9eda1..e61402a943 100644 --- a/src/arch/arm/system.cc +++ b/src/arch/arm/system.cc @@ -180,15 +180,15 @@ ArmSystem::haveSemihosting(ThreadContext *tc) } void -ArmSystem::callSemihosting64(ThreadContext *tc) +ArmSystem::callSemihosting64(ThreadContext *tc, bool gem5_ops) { - getArmSystem(tc)->semihosting->call64(tc); + getArmSystem(tc)->semihosting->call64(tc, gem5_ops); } void -ArmSystem::callSemihosting32(ThreadContext *tc) +ArmSystem::callSemihosting32(ThreadContext *tc, bool gem5_ops) { - getArmSystem(tc)->semihosting->call32(tc); + getArmSystem(tc)->semihosting->call32(tc, gem5_ops); } void diff --git a/src/arch/arm/system.hh b/src/arch/arm/system.hh index ae83da07d0..fc32d0fd3a 100644 --- a/src/arch/arm/system.hh +++ b/src/arch/arm/system.hh @@ -314,10 +314,10 @@ class ArmSystem : public System static bool haveSemihosting(ThreadContext *tc); /** Make a Semihosting call from aarch64 */ - static void callSemihosting64(ThreadContext *tc); + static void callSemihosting64(ThreadContext *tc, bool gem5_ops=false); /** Make a Semihosting call from aarch32 */ - static void callSemihosting32(ThreadContext *tc); + static void callSemihosting32(ThreadContext *tc, bool gem5_ops=false); /** Make a call to notify the power controller of STANDBYWFI assertion */ static void callSetStandByWfi(ThreadContext *tc);