diff options
author | cognet <cognet@FreeBSD.org> | 2005-01-19 00:37:03 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2005-01-19 00:37:03 +0000 |
commit | 5608e326b2b4b7792b4984fc9a24303c1bd3153d (patch) | |
tree | c8d9618cb36287ca30462b51ce1fcb01bbfaf999 /sys/arm | |
parent | e4129c1fb1819650cba21307d63bbef11305b1b9 (diff) | |
download | FreeBSD-src-5608e326b2b4b7792b4984fc9a24303c1bd3153d.zip FreeBSD-src-5608e326b2b4b7792b4984fc9a24303c1bd3153d.tar.gz |
MFpowerpc: Work around the problem of returning a 32 bits value from
__syscall() on a 32 bits big-endian arch.
Spotted out by: grehan
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/arm/trap.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/arm/arm/trap.c b/sys/arm/arm/trap.c index 46595f1..2b2a7687 100644 --- a/sys/arm/arm/trap.c +++ b/sys/arm/arm/trap.c @@ -927,9 +927,22 @@ syscall(struct thread *td, trapframe_t *frame, u_int32_t insn) } switch (error) { case 0: +#ifdef __ARMEB__ + if ((frame->fixreg[0] == SYS___syscall) && + (code != SYS_lseek)) { + /* + * 64-bit return, 32-bit syscall. Fixup byte order + */ + tf->tf_r0 = 0; + tf->rf_r1 = td->td_retval[0]; + } else { + tf->tf_r0 = td->td_retval[0]; + tf->tf_r1 = td->td_retval[1]; + } +#else frame->tf_r0 = td->td_retval[0]; frame->tf_r1 = td->td_retval[1]; - +#endif frame->tf_spsr &= ~PSR_C_bit; /* carry bit */ break; |