diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2015-09-07 10:39:28 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2015-09-07 10:39:28 +0100 |
commit | 7446d35e1dd69e1da8241277eae09e293741b362 (patch) | |
tree | d9b2896949207580f3bf0ed71621ac2155827552 /target-arm | |
parent | e9ebfbfcf31c11fb3bd2fc436fa17ce45a4e7086 (diff) |
target-arm/arm-semi.c: SYS_EXIT on A64 takes a parameter block
The A64 semihosting API changes the interface for SYS_EXIT so
that instead of taking a single exception type in a register,
it takes a parameter block containing the exception type and
a sub-code. Implement this.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Tested-by: Christopher Covington <cov@codeaurora.org>
Message-id: 1439483745-28752-9-git-send-email-peter.maydell@linaro.org
Diffstat (limited to 'target-arm')
-rw-r--r-- | target-arm/arm-semi.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/target-arm/arm-semi.c b/target-arm/arm-semi.c index 1d0d7aa32b..d7cff3db23 100644 --- a/target-arm/arm-semi.c +++ b/target-arm/arm-semi.c @@ -619,9 +619,24 @@ target_ulong do_arm_semihosting(CPUARMState *env) return 0; } case TARGET_SYS_EXIT: - /* ARM specifies only Stopped_ApplicationExit as normal - * exit, everything else is considered an error */ - ret = (args == ADP_Stopped_ApplicationExit) ? 0 : 1; + if (is_a64(env)) { + /* The A64 version of this call takes a parameter block, + * so the application-exit type can return a subcode which + * is the exit status code from the application. + */ + GET_ARG(0); + GET_ARG(1); + + if (arg0 == ADP_Stopped_ApplicationExit) { + ret = arg1; + } else { + ret = 1; + } + } else { + /* ARM specifies only Stopped_ApplicationExit as normal + * exit, everything else is considered an error */ + ret = (args == ADP_Stopped_ApplicationExit) ? 0 : 1; + } gdb_exit(env, ret); exit(ret); case TARGET_SYS_SYNCCACHE: |