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;
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;
auto err = call.call32(this, tc);
semiErrno = err.second;
DPRINTF(Semihosting, "\t ->: 0x%x, %i\n", err.first, err.second);
+
+ return true;
}
void
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;
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
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);