diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2022-06-20 15:19:46 -0700 |
---|---|---|
committer | Richard Henderson <richard.henderson@linaro.org> | 2022-09-13 17:18:20 +0100 |
commit | 78c2c68ddac7b1a73615d89363fffd8c01561123 (patch) | |
tree | 64ef9b4833fe7a915072c5649df88e2555372c56 | |
parent | d1e23cbaa403b2d816e1cb2acd61105d00c38b9b (diff) | |
download | qemu-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>
-rw-r--r-- | target/nios2/nios2-semi.c | 33 |
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"); |