arm: Return whether a semihosting call was recognized/handled.
authorGabe Black <gabeblack@google.com>
Thu, 27 Feb 2020 00:14:50 +0000 (16:14 -0800)
committerGabe Black <gabeblack@google.com>
Thu, 26 Mar 2020 09:00:05 +0000 (09:00 +0000)
Otherwise there's no way to determine whether the return value was from
the semihosting mechanism itself, or from one of the calls. There would
also be no way to determine whether a call had actually happened.

Change-Id: Ie2da812172fe2f9c1e2b5be95561863bd12920b1
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/25949
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: Gem5 Cloud Project GCB service account <345032938727@cloudbuild.gserviceaccount.com>
src/arch/arm/semihosting.cc
src/arch/arm/semihosting.hh
src/arch/arm/system.cc
src/arch/arm/system.hh

index b6db38af9d1b8d9c3cc1370ca28c0195cd328e44..230ded1b2240ab60d524421fed485aac31346182 100644 (file)
@@ -153,21 +153,21 @@ ArmSemihosting::ArmSemihosting(const ArmSemihostingParams *p)
                tickShift);
 }
 
-void
+bool
 ArmSemihosting::call64(ThreadContext *tc, bool gem5_ops)
 {
     RegVal op = tc->readIntReg(ArmISA::INTREG_X0 & mask(32));
     if (op > MaxStandardOp && !gem5_ops) {
         unrecognizedCall<Abi64>(
                 tc, "Gem5 semihosting op (0x%x) disabled from here.", op);
-        return;
+        return false;
     }
 
     auto it = calls.find(op);
     if (it == calls.end()) {
         unrecognizedCall<Abi64>(
                 tc, "Unknown aarch64 semihosting call: op = 0x%x", op);
-        return;
+        return false;
     }
     const SemiCall &call = it->second;
 
@@ -175,23 +175,25 @@ ArmSemihosting::call64(ThreadContext *tc, bool gem5_ops)
     auto err = call.call64(this, tc);
     semiErrno = err.second;
     DPRINTF(Semihosting, "\t ->: 0x%x, %i\n", err.first, err.second);
+
+    return true;
 }
 
-void
+bool
 ArmSemihosting::call32(ThreadContext *tc, bool gem5_ops)
 {
     RegVal op = tc->readIntReg(ArmISA::INTREG_R0);
     if (op > MaxStandardOp && !gem5_ops) {
         unrecognizedCall<Abi32>(
                 tc, "Gem5 semihosting op (0x%x) disabled from here.", op);
-        return;
+        return false;
     }
 
     auto it = calls.find(op);
     if (it == calls.end()) {
         unrecognizedCall<Abi32>(
                 tc, "Unknown aarch32 semihosting call: op = 0x%x", op);
-        return;
+        return false;
     }
     const SemiCall &call = it->second;
 
@@ -199,6 +201,8 @@ ArmSemihosting::call32(ThreadContext *tc, bool gem5_ops)
     auto err = call.call32(this, tc);
     semiErrno = err.second;
     DPRINTF(Semihosting, "\t ->: 0x%x, %i\n", err.first, err.second);
+
+    return true;
 }
 
 void
index 9aa5b41979c3e46499ccaadce933387e8a3d3448..58843496c0fa976d334c2e2ee2da974cf5e2eec5 100644 (file)
@@ -214,9 +214,9 @@ class ArmSemihosting : public SimObject
     ArmSemihosting(const ArmSemihostingParams *p);
 
     /** Perform an Arm Semihosting call from aarch64 code. */
-    void call64(ThreadContext *tc, bool gem5_ops);
+    bool call64(ThreadContext *tc, bool gem5_ops);
     /** Perform an Arm Semihosting call from aarch32 code. */
-    void call32(ThreadContext *tc, bool gem5_ops);
+    bool call32(ThreadContext *tc, bool gem5_ops);
 
   public: // SimObject and related interfaces
     void serialize(CheckpointOut &cp) const override;
index e61402a943ee765b9a6ae4a7df1122d964540acf..5d8808cba1f08921088e1562c79ce7ea131a413a 100644 (file)
@@ -179,16 +179,16 @@ ArmSystem::haveSemihosting(ThreadContext *tc)
     return FullSystem && getArmSystem(tc)->haveSemihosting();
 }
 
-void
+bool
 ArmSystem::callSemihosting64(ThreadContext *tc, bool gem5_ops)
 {
-    getArmSystem(tc)->semihosting->call64(tc, gem5_ops);
+    return getArmSystem(tc)->semihosting->call64(tc, gem5_ops);
 }
 
-void
+bool
 ArmSystem::callSemihosting32(ThreadContext *tc, bool gem5_ops)
 {
-    getArmSystem(tc)->semihosting->call32(tc, gem5_ops);
+    return getArmSystem(tc)->semihosting->call32(tc, gem5_ops);
 }
 
 void
index fc32d0fd3afbd809fb91ab9ce69eb21c63c3fc4b..370a3df3370a7aace80671ef2233b7a44460c242 100644 (file)
@@ -314,10 +314,10 @@ class ArmSystem : public System
     static bool haveSemihosting(ThreadContext *tc);
 
     /** Make a Semihosting call from aarch64 */
-    static void callSemihosting64(ThreadContext *tc, bool gem5_ops=false);
+    static bool callSemihosting64(ThreadContext *tc, bool gem5_ops=false);
 
     /** Make a Semihosting call from aarch32 */
-    static void callSemihosting32(ThreadContext *tc, bool gem5_ops=false);
+    static bool callSemihosting32(ThreadContext *tc, bool gem5_ops=false);
 
     /** Make a call to notify the power controller of STANDBYWFI assertion */
     static void callSetStandByWfi(ThreadContext *tc);