mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 08:43:55 -06:00
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>
This commit is contained in:
parent
d1e23cbaa4
commit
78c2c68dda
1 changed files with 31 additions and 2 deletions
|
@ -43,6 +43,35 @@
|
||||||
#define HOSTED_ISATTY 12
|
#define HOSTED_ISATTY 12
|
||||||
#define HOSTED_SYSTEM 13
|
#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)
|
static void nios2_semi_u32_cb(CPUState *cs, uint64_t ret, int err)
|
||||||
{
|
{
|
||||||
Nios2CPU *cpu = NIOS2_CPU(cs);
|
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];
|
target_ulong args = env->regs[R_ARG1];
|
||||||
|
|
||||||
if (put_user_u32(ret, args) ||
|
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
|
* 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.
|
* 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) ||
|
if (put_user_u32(ret >> 32, args) ||
|
||||||
put_user_u32(ret, args + 4) ||
|
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 */
|
/* No way to report this via nios2 semihosting ABI; just log it */
|
||||||
qemu_log_mask(LOG_GUEST_ERROR, "nios2-semihosting: return value "
|
qemu_log_mask(LOG_GUEST_ERROR, "nios2-semihosting: return value "
|
||||||
"discarded because argument block not writable\n");
|
"discarded because argument block not writable\n");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue