Browse Source

avr32: add varargs handling of prctl syscall

prctl is defined to use varargs in the header file, hence it needs varargs
specific handling in the source. This patch properly handles the variodic
argument before the syscall is passed to the kernel for the AVR32 architecture.

Signed-off-by: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
Hans-Christian Egtvedt 14 years ago
parent
commit
43151dd167
2 changed files with 37 additions and 1 deletions
  1. 1 1
      libc/sysdeps/linux/avr32/Makefile.arch
  2. 36 0
      libc/sysdeps/linux/avr32/prctl.c

+ 1 - 1
libc/sysdeps/linux/avr32/Makefile.arch

@@ -5,7 +5,7 @@
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 
-CSRC	:= brk.c clone.c mmap.c sigaction.c
+CSRC	:= brk.c clone.c mmap.c prctl.c sigaction.c
 
 SSRC	:= __longjmp.S setjmp.S bsd-setjmp.S bsd-_setjmp.S	\
 		sigrestorer.S syscall.S vfork.S

+ 36 - 0
libc/sysdeps/linux/avr32/prctl.c

@@ -0,0 +1,36 @@
+/*
+ * prctl syscall for AVR32 Linux.
+ *
+ * Copyright (C) 2010 Atmel Corporation
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser General
+ * Public License. See the file "COPYING.LIB" in the main directory of this
+ * archive for more details.
+ */
+#include <sys/syscall.h>
+#include <sys/prctl.h>
+#include <stdarg.h>
+
+#ifdef __NR_prctl
+#define __NR___syscall_prctl	__NR_prctl
+static inline _syscall5(int, __syscall_prctl, int, option, long, arg2,
+		long, arg3, long, arg4, long, arg5);
+
+int prctl(int __option, ...)
+{
+	long arg2;
+	long arg3;
+	long arg4;
+	long arg5;
+	va_list ap;
+
+	va_start(ap, __option);
+	arg2 = va_arg(ap, long);
+	arg3 = va_arg(ap, long);
+	arg4 = va_arg(ap, long);
+	arg5 = va_arg(ap, long);
+	va_end(ap);
+
+	return INLINE_SYSCALL(prctl, 5, __option, arg2, arg3, arg4, arg5);
+}
+#endif