aboutsummaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2022-06-20 15:19:46 -0700
committerRichard Henderson <richard.henderson@linaro.org>2022-09-13 17:18:20 +0100
commit78c2c68ddac7b1a73615d89363fffd8c01561123 (patch)
tree64ef9b4833fe7a915072c5649df88e2555372c56 /target
parentd1e23cbaa403b2d816e1cb2acd61105d00c38b9b (diff)
downloadqemu-78c2c68ddac7b1a73615d89363fffd8c01561123.zip
qemu-78c2c68ddac7b1a73615d89363fffd8c01561123.tar.gz
qemu-78c2c68ddac7b1a73615d89363fffd8c01561123.tar.bz2
target/nios2: Convert semihosting errno to gdb remote errno
The semihosting abi used by nios2 uses the gdb remote protocol filesys errnos. Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'target')
-rw-r--r--target/nios2/nios2-semi.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/target/nios2/nios2-semi.c b/target/nios2/nios2-semi.c
index 614fd76..f76e858 100644
--- a/target/nios2/nios2-semi.c
+++ b/target/nios2/nios2-semi.c
@@ -43,6 +43,35 @@
#define HOSTED_ISATTY 12
#define HOSTED_SYSTEM 13
+static int host_to_gdb_errno(int err)
+{
+#define E(X) case E##X: return GDB_E##X
+ switch (err) {
+ E(PERM);
+ E(NOENT);
+ E(INTR);
+ E(BADF);
+ E(ACCES);
+ E(FAULT);
+ E(BUSY);
+ E(EXIST);
+ E(NODEV);
+ E(NOTDIR);
+ E(ISDIR);
+ E(INVAL);
+ E(NFILE);
+ E(MFILE);
+ E(FBIG);
+ E(NOSPC);
+ E(SPIPE);
+ E(ROFS);
+ E(NAMETOOLONG);
+ default:
+ return GDB_EUNKNOWN;
+ }
+#undef E
+}
+
static void nios2_semi_u32_cb(CPUState *cs, uint64_t ret, int err)
{
Nios2CPU *cpu = NIOS2_CPU(cs);
@@ -50,7 +79,7 @@ static void nios2_semi_u32_cb(CPUState *cs, uint64_t ret, int err)
target_ulong args = env->regs[R_ARG1];
if (put_user_u32(ret, args) ||
- put_user_u32(err, args + 4)) {
+ put_user_u32(host_to_gdb_errno(err), args + 4)) {
/*
* The nios2 semihosting ABI does not provide any way to report this
* error to the guest, so the best we can do is log it in qemu.
@@ -69,7 +98,7 @@ static void nios2_semi_u64_cb(CPUState *cs, uint64_t ret, int err)
if (put_user_u32(ret >> 32, args) ||
put_user_u32(ret, args + 4) ||
- put_user_u32(err, args + 8)) {
+ put_user_u32(host_to_gdb_errno(err), args + 8)) {
/* No way to report this via nios2 semihosting ABI; just log it */
qemu_log_mask(LOG_GUEST_ERROR, "nios2-semihosting: return value "
"discarded because argument block not writable\n");