From 1f6c8bc54bab65034b9adaa133b16c6f886e3052 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Wed, 19 Jan 2005 00:37:03 +0000 Subject: [PATCH] MFpowerpc: Work around the problem of returning a 32 bits value from __syscall() on a 32 bits big-endian arch. Spotted out by: grehan --- sys/arm/arm/trap.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sys/arm/arm/trap.c b/sys/arm/arm/trap.c index 46595f106612..2b2a7687ceb7 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;