svn commit: r261564 - head/sys/arm/arm
Andrew Turner
andrew at FreeBSD.org
Thu Feb 6 20:26:36 UTC 2014
Author: andrew
Date: Thu Feb 6 20:26:36 2014
New Revision: 261564
URL: http://svnweb.freebsd.org/changeset/base/261564
Log:
Fix __syscall on armeb EABI. As it returns a 64-bit value it needs to place
32-bit data in r1, not r0. 64-bit data is already packed correctly.
Modified:
head/sys/arm/arm/vm_machdep.c
Modified: head/sys/arm/arm/vm_machdep.c
==============================================================================
--- head/sys/arm/arm/vm_machdep.c Thu Feb 6 20:23:35 2014 (r261563)
+++ head/sys/arm/arm/vm_machdep.c Thu Feb 6 20:26:36 2014 (r261564)
@@ -298,15 +298,25 @@ cpu_set_syscall_retval(struct thread *td
struct trapframe *frame;
int fixup;
#ifdef __ARMEB__
- uint32_t insn;
+ u_int call;
#endif
frame = td->td_frame;
fixup = 0;
#ifdef __ARMEB__
- insn = *(u_int32_t *)(frame->tf_pc - INSN_SIZE);
- if ((insn & 0x000fffff) == SYS___syscall) {
+ /*
+ * __syscall returns an off_t while most other syscalls return an
+ * int. As an off_t is 64-bits and an int is 32-bits we need to
+ * place the returned data into r1. As the lseek and frerebsd6_lseek
+ * syscalls also return an off_t they do not need this fixup.
+ */
+#ifdef __ARM_EABI__
+ call = frame->tf_r7;
+#else
+ call = *(u_int32_t *)(frame->tf_pc - INSN_SIZE) & 0x000fffff;
+#endif
+ if (call == SYS___syscall) {
register_t *ap = &frame->tf_r0;
register_t code = ap[_QUAD_LOWWORD];
if (td->td_proc->p_sysent->sv_mask)
More information about the svn-src-all
mailing list