From 5608e326b2b4b7792b4984fc9a24303c1bd3153d Mon Sep 17 00:00:00 2001 From: cognet Date: Wed, 19 Jan 2005 00:37:03 +0000 Subject: 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(-) (limited to 'sys/arm') 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; -- cgit v1.1