Module Name: src Committed By: rjs Date: Thu Apr 3 16:22:20 UTC 2014
Modified Files: src/sys/arch/arm/arm: linux_syscall.c Log Message: Add support for EABI syscalls. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/arch/arm/arm/linux_syscall.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/arm/linux_syscall.c diff -u src/sys/arch/arm/arm/linux_syscall.c:1.25 src/sys/arch/arm/arm/linux_syscall.c:1.26 --- src/sys/arch/arm/arm/linux_syscall.c:1.25 Sun Aug 18 07:01:45 2013 +++ src/sys/arch/arm/arm/linux_syscall.c Thu Apr 3 16:22:20 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_syscall.c,v 1.25 2013/08/18 07:01:45 matt Exp $ */ +/* $NetBSD: linux_syscall.c,v 1.26 2014/04/03 16:22:20 rjs Exp $ */ /*- * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc. @@ -69,7 +69,7 @@ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: linux_syscall.c,v 1.25 2013/08/18 07:01:45 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_syscall.c,v 1.26 2014/04/03 16:22:20 rjs Exp $"); #include <sys/device.h> #include <sys/errno.h> @@ -90,6 +90,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_syscal /* ARMLinux has some system calls of its very own. */ #define LINUX_ARM_NR_BASE 0x9f0000 +#define LINUX_EARM_NR_BASE 0x0f0000 #define LINUX_SYS_ARMBASE 0x000180 /* Must agree with syscalls.master */ void linux_syscall_intern(struct proc *); @@ -115,9 +116,15 @@ linux_syscall_plain(trapframe_t *frame, register_t *args, rval[2]; code = insn & 0x00ffffff; - /* Remap ARM-specific syscalls onto the end of the standard range. */ - if (code > LINUX_ARM_NR_BASE) - code = code - LINUX_ARM_NR_BASE + LINUX_SYS_ARMBASE; + if (code == 0) { /* EABI */ + code = frame->tf_r7; + if (code > LINUX_EARM_NR_BASE) + code = code - LINUX_EARM_NR_BASE + LINUX_SYS_ARMBASE; + } else { + /* Remap ARM-specific syscalls onto the end of the standard range. */ + if (code > LINUX_ARM_NR_BASE) + code = code - LINUX_ARM_NR_BASE + LINUX_SYS_ARMBASE; + } code &= LINUX_SYS_NSYSENT - 1; /* Linux passes all arguments in order in registers, which is nice. */ @@ -160,9 +167,15 @@ linux_syscall_fancy(trapframe_t *frame, register_t *args, rval[2]; code = insn & 0x00ffffff; - /* Remap ARM-specific syscalls onto the end of the standard range. */ - if (code > LINUX_ARM_NR_BASE) - code = code - LINUX_ARM_NR_BASE + LINUX_SYS_ARMBASE; + if (code == 0) { /* EABI */ + code = frame->tf_r7; + if (code > LINUX_EARM_NR_BASE) + code = code - LINUX_EARM_NR_BASE + LINUX_SYS_ARMBASE; + } else { + /* Remap ARM-specific syscalls onto the end of the standard range. */ + if (code > LINUX_ARM_NR_BASE) + code = code - LINUX_ARM_NR_BASE + LINUX_SYS_ARMBASE; + } code &= LINUX_SYS_NSYSENT - 1; /* Linux passes all arguments in order in registers, which is nice. */