summaryrefslogtreecommitdiffstats
path: root/gdbstub.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdbstub.c')
-rw-r--r--gdbstub.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/gdbstub.c b/gdbstub.c
index 88a34c8f52..cf869b10e3 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -1878,14 +1878,46 @@ static void handle_read_all_regs(GArray *params, void *user_ctx)
static void handle_file_io(GArray *params, void *user_ctx)
{
if (params->len >= 1 && gdbserver_state.current_syscall_cb) {
- target_ulong ret, err;
+ uint64_t ret;
+ int err;
- ret = (target_ulong)get_param(params, 0)->val_ull;
+ ret = get_param(params, 0)->val_ull;
if (params->len >= 2) {
- err = (target_ulong)get_param(params, 1)->val_ull;
+ err = get_param(params, 1)->val_ull;
} else {
err = 0;
}
+
+ /* Convert GDB error numbers back to host error numbers. */
+#define E(X) case GDB_E##X: err = E##X; break
+ switch (err) {
+ case 0:
+ break;
+ 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:
+ err = EINVAL;
+ break;
+ }
+#undef E
+
gdbserver_state.current_syscall_cb(gdbserver_state.c_cpu, ret, err);
gdbserver_state.current_syscall_cb = NULL;
}