summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2008-09-17 22:04:29 +0000
committeraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2008-09-17 22:04:29 +0000
commitd74e3b124889c808c3b21516f9a646588b884f28 (patch)
tree4c29c89b3cfcef47a849cf06a06a4e33cee6d322
parent8109b9b6bf934a39e73c90fb804e2d5af02391d1 (diff)
[PATCH] alpha: fix linux syscall convention
According to linux kernel sources, register a3 is set in case of failure (and cleared in case of success) while register v0 contains the result (or -errno in case of error). The convention was not followed which results in weird behaviour. Signed-off-by: Tristan Gingold <gingold@adacore.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5243 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--hw/alpha_palcode.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/hw/alpha_palcode.c b/hw/alpha_palcode.c
index fe14c1082b..38466dbd8f 100644
--- a/hw/alpha_palcode.c
+++ b/hw/alpha_palcode.c
@@ -1071,11 +1071,12 @@ void call_pal (CPUState *env, int palcode)
ret = do_syscall(env, env->ir[IR_V0], env->ir[IR_A0], env->ir[IR_A1],
env->ir[IR_A2], env->ir[IR_A3], env->ir[IR_A4],
env->ir[IR_A5]);
- env->ir[IR_A3] = ret;
- if (ret > (target_ulong)(-515)) {
- env->ir[IR_V0] = 1;
+ if (ret >= 0) {
+ env->ir[IR_A3] = 0;
+ env->ir[IR_V0] = ret;
} else {
- env->ir[IR_V0] = 0;
+ env->ir[IR_A3] = 1;
+ env->ir[IR_V0] = -ret;
}
break;
case 0x9E: