From 20189987ef5855284c941883e00fda602bf84377 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 26 Feb 2020 04:59:25 -0800 Subject: [PATCH] arm: Optionally enable gem5 extended semihosting calls. ARM's semihosting interface defines call numbers up to 0xff to be for standardized use, and says that custom calls should go above this number. This new mechanism will let the caller decide whether it wants to enable these extended calls, or if they should be ignored and only standard calls should be recognized. Change-Id: I34b01a4439c8a88242971ac486e34d810b054baf Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/25947 Reviewed-by: Giacomo Travaglini Maintainer: Giacomo Travaglini Tested-by: kokoro --- src/arch/arm/semihosting.cc | 14 ++++++++++++-- src/arch/arm/semihosting.hh | 4 ++-- src/arch/arm/system.cc | 8 ++++---- src/arch/arm/system.hh | 4 ++-- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/arch/arm/semihosting.cc b/src/arch/arm/semihosting.cc index 5ea894af3..b6db38af9 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 4a8aa2bd9..9aa5b4197 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 906cc9eda..e61402a94 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 ae83da07d..fc32d0fd3 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); -- 2.30.2