target/m68k: Convert semihosting errno to gdb remote errno
The semihosting abi used by m68k uses the gdb remote protocol filesys errnos. Acked-by: Laurent Vivier <laurent@vivier.eu> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
950272506d
commit
7327e60237
@ -41,6 +41,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 m68k_semi_u32_cb(CPUState *cs, uint64_t ret, int err)
|
||||
{
|
||||
M68kCPU *cpu = M68K_CPU(cs);
|
||||
@ -48,7 +77,7 @@ static void m68k_semi_u32_cb(CPUState *cs, uint64_t ret, int err)
|
||||
|
||||
target_ulong args = env->dregs[1];
|
||||
if (put_user_u32(ret, args) ||
|
||||
put_user_u32(err, args + 4)) {
|
||||
put_user_u32(host_to_gdb_errno(err), args + 4)) {
|
||||
/*
|
||||
* The m68k 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.
|
||||
@ -67,7 +96,7 @@ static void m68k_semi_u64_cb(CPUState *cs, uint64_t ret, int err)
|
||||
target_ulong args = env->dregs[1];
|
||||
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 m68k semihosting ABI; just log it */
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "m68k-semihosting: return value "
|
||||
"discarded because argument block not writable\n");
|
||||
|
Loading…
Reference in New Issue
Block a user