提交 d74e3b12 编写于 作者: A aurel32

[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: NTristan Gingold <gingold@adacore.com>
Signed-off-by: NAurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5243 c046a42c-6fe2-441c-8c8c-71466251a162
上级 8109b9b6
......@@ -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:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册