Tue Nov 2 18:18:07 2010 UTC ()
personality() now interprets its parameter as having
the base personality type in the low byte and
various flags in the upper bytes.  for now just mask off
the flags to make sure the base type is one we accept.
store the current personality in the emuldata so that
we can return the expected value for PER_QUERY.


(chs)
diff -r1.17 -r1.18 src/sys/compat/linux/common/linux_emuldata.h
diff -r1.217 -r1.218 src/sys/compat/linux/common/linux_misc.c
diff -r1.19 -r1.20 src/sys/compat/linux/common/linux_misc.h
diff -r1.20 -r1.21 src/sys/compat/linux32/common/linux32_misc.c

cvs diff -r1.17 -r1.18 src/sys/compat/linux/common/linux_emuldata.h (expand / switch to context diff)
--- src/sys/compat/linux/common/linux_emuldata.h 2010/07/07 01:30:35 1.17
+++ src/sys/compat/linux/common/linux_emuldata.h 2010/11/02 18:18:07 1.18
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_emuldata.h,v 1.17 2010/07/07 01:30:35 chs Exp $	*/
+/*	$NetBSD: linux_emuldata.h,v 1.18 2010/11/02 18:18:07 chs Exp $	*/
 
 /*-
  * Copyright (c) 1998,2002 The NetBSD Foundation, Inc.
@@ -48,6 +48,7 @@
 	void	*led_child_tidptr;	/* Used during clone() */
 	void	*led_clear_tid;		/* Own TID to clear on exit */
 	struct linux_robust_list_head *led_robust_head;
+	long	led_personality;
 };
 
 #endif /* !_COMMON_LINUX_EMULDATA_H */

cvs diff -r1.217 -r1.218 src/sys/compat/linux/common/linux_misc.c (expand / switch to context diff)
--- src/sys/compat/linux/common/linux_misc.c 2010/09/11 20:53:04 1.217
+++ src/sys/compat/linux/common/linux_misc.c 2010/11/02 18:18:07 1.218
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_misc.c,v 1.217 2010/09/11 20:53:04 chs Exp $	*/
+/*	$NetBSD: linux_misc.c,v 1.218 2010/11/02 18:18:07 chs Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.217 2010/09/11 20:53:04 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.218 2010/11/02 18:18:07 chs Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -929,16 +929,27 @@
 	/* {
 		syscallarg(unsigned long) per;
 	} */
+	struct linux_emuldata *led;
+	int per;
 
-	switch (SCARG(uap, per)) {
+	per = SCARG(uap, per);
+	led = l->l_emuldata;
+	if (per == LINUX_PER_QUERY) {
+		retval[0] = led->led_personality;
+		return 0;
+	}
+	 
+	switch (per & LINUX_PER_MASK) {
 	case LINUX_PER_LINUX:
-	case LINUX_PER_QUERY:
+	case LINUX_PER_LINUX32:
+		led->led_personality = per;
 		break;
+
 	default:
 		return EINVAL;
 	}
 
-	retval[0] = LINUX_PER_LINUX;
+	retval[0] = per;
 	return 0;
 }
 

cvs diff -r1.19 -r1.20 src/sys/compat/linux/common/linux_misc.h (expand / switch to context diff)
--- src/sys/compat/linux/common/linux_misc.h 2009/01/19 13:31:40 1.19
+++ src/sys/compat/linux/common/linux_misc.h 2010/11/02 18:18:07 1.20
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_misc.h,v 1.19 2009/01/19 13:31:40 njoly Exp $	*/
+/*	$NetBSD: linux_misc.h,v 1.20 2010/11/02 18:18:07 chs Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -123,9 +123,13 @@
 extern const int linux_fstypes_cnt;
 
 /* Personality types. */
-#define LINUX_PER_LINUX		0x00000000
-#define LINUX_PER_LINUX32	0x00000008
 #define LINUX_PER_QUERY		0xffffffff
+#define LINUX_PER_LINUX		0x00
+#define LINUX_PER_LINUX32	0x08
+#define LINUX_PER_MASK		0xff
+
+/* Personality flags. */
+#define LINUX_PER_ADDR_NO_RANDOMIZE	0x00040000
 
 #ifdef _KERNEL
 __BEGIN_DECLS

cvs diff -r1.20 -r1.21 src/sys/compat/linux32/common/linux32_misc.c (expand / switch to context diff)
--- src/sys/compat/linux32/common/linux32_misc.c 2010/11/02 18:14:06 1.20
+++ src/sys/compat/linux32/common/linux32_misc.c 2010/11/02 18:18:07 1.21
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux32_misc.c,v 1.20 2010/11/02 18:14:06 chs Exp $	*/
+/*	$NetBSD: linux32_misc.c,v 1.21 2010/11/02 18:18:07 chs Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.20 2010/11/02 18:14:06 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.21 2010/11/02 18:18:07 chs Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -223,18 +223,10 @@
 	/* {
 		syscallarg(netbsd32_u_long) per;
 	} */
+	struct linux_sys_personality_args ua;
 
-	switch (SCARG(uap, per)) {
-	case LINUX_PER_LINUX:
-	case LINUX_PER_LINUX32:
-	case LINUX_PER_QUERY:
-		break;
-	default:
-		return EINVAL;
-	}
-
-	retval[0] = LINUX_PER_LINUX;
-	return 0;
+	NETBSD32TOX_UAP(per, long);
+	return linux_sys_personality(l, &ua, retval);
 }
 
 int