svn commit: r250437 - in user/dchagin/lemul/sys: amd64/linux32 compat/linux i386/linux

Dmitry Chagin dchagin at FreeBSD.org
Fri May 10 06:42:07 UTC 2013


Author: dchagin
Date: Fri May 10 06:42:06 2013
New Revision: 250437
URL: http://svnweb.freebsd.org/changeset/base/250437

Log:
  Fix a bug introduced in r249442. Copying in linux_newuname() vdso symbol
  linux_platform to the user space leads linuxulator to panic because
  linux_platform already is mapped into the process address space.
  To avoid panic add the linux_kplatform pointer which is referenced to a
  kernel mapped vdso symbol.

Modified:
  user/dchagin/lemul/sys/amd64/linux32/linux32_sysvec.c
  user/dchagin/lemul/sys/compat/linux/linux_misc.c
  user/dchagin/lemul/sys/compat/linux/linux_misc.h
  user/dchagin/lemul/sys/i386/linux/linux_sysvec.c

Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- user/dchagin/lemul/sys/amd64/linux32/linux32_sysvec.c	Fri May 10 06:28:01 2013	(r250436)
+++ user/dchagin/lemul/sys/amd64/linux32/linux32_sysvec.c	Fri May 10 06:42:06 2013	(r250437)
@@ -110,6 +110,7 @@ MALLOC_DEFINE(M_LINUX, "linux", "Linux m
 #define	LINUX_SYS_linux_rt_sendsig	0
 #define	LINUX_SYS_linux_sendsig		0
 
+const char *linux_kplatform;
 static int linux_szsigcode;
 static vm_object_t linux_shared_page_obj;
 static char *linux_shared_page_mapping;
@@ -1084,6 +1085,9 @@ linux_vdso_install(void *param)
 	bcopy(elf_linux_sysvec.sv_sigcode, linux_shared_page_mapping,
 	    linux_szsigcode);
 	elf_linux_sysvec.sv_shared_page_obj = linux_shared_page_obj;
+
+	linux_kplatform = linux_shared_page_mapping +
+	    (linux_platform - (caddr_t)LINUX32_SHAREDPAGE);
 }
 SYSINIT(elf_linux_vdso_init, SI_SUB_EXEC, SI_ORDER_ANY,
     (sysinit_cfunc_t)linux_vdso_install, NULL);

Modified: user/dchagin/lemul/sys/compat/linux/linux_misc.c
==============================================================================
--- user/dchagin/lemul/sys/compat/linux/linux_misc.c	Fri May 10 06:28:01 2013	(r250436)
+++ user/dchagin/lemul/sys/compat/linux/linux_misc.c	Fri May 10 06:42:06 2013	(r250437)
@@ -730,7 +730,7 @@ linux_newuname(struct thread *td, struct
 			*p = '\0';
 			break;
 		}
-	strlcpy(utsname.machine, linux_platform, LINUX_MAX_UTSNAME);
+	strlcpy(utsname.machine, linux_kplatform, LINUX_MAX_UTSNAME);
 
 	return (copyout(&utsname, args->buf, sizeof(utsname)));
 }

Modified: user/dchagin/lemul/sys/compat/linux/linux_misc.h
==============================================================================
--- user/dchagin/lemul/sys/compat/linux/linux_misc.h	Fri May 10 06:28:01 2013	(r250436)
+++ user/dchagin/lemul/sys/compat/linux/linux_misc.h	Fri May 10 06:42:06 2013	(r250437)
@@ -55,7 +55,7 @@
 #define	LINUX_MREMAP_MAYMOVE	1
 #define	LINUX_MREMAP_FIXED	2
 
-extern const char *linux_platform;
+extern const char *linux_kplatform;
 
 /*
  * Non-standard aux entry types used in Linux ELF binaries.

Modified: user/dchagin/lemul/sys/i386/linux/linux_sysvec.c
==============================================================================
--- user/dchagin/lemul/sys/i386/linux/linux_sysvec.c	Fri May 10 06:28:01 2013	(r250436)
+++ user/dchagin/lemul/sys/i386/linux/linux_sysvec.c	Fri May 10 06:42:06 2013	(r250437)
@@ -117,7 +117,7 @@ static void	linux_vdso_install(void *par
 static void	linux_vdso_deinstall(void *param);
 
 static int linux_szplatform;
-const char *linux_platform;
+const char *linux_kplatform;
 
 static eventhandler_tag linux_exec_tag;
 static eventhandler_tag linux_thread_dtor_tag;
@@ -327,7 +327,7 @@ linux_copyout_strings(struct image_param
 	/*
 	 * install LINUX_PLATFORM
 	 */
-	copyout(linux_platform, ((caddr_t)arginfo - linux_szplatform),
+	copyout(linux_kplatform, ((caddr_t)arginfo - linux_szplatform),
 	    linux_szplatform);
 
 	/*
@@ -1172,8 +1172,8 @@ linux_elf_modevent(module_t mod, int typ
 			      NULL, 1000);
 			linux_thread_dtor_tag = EVENTHANDLER_REGISTER(thread_dtor,
 			    linux_thread_dtor, NULL, EVENTHANDLER_PRI_ANY);
-			linux_get_machine(&linux_platform);
-			linux_szplatform = roundup(strlen(linux_platform) + 1,
+			linux_get_machine(&linux_kplatform);
+			linux_szplatform = roundup(strlen(linux_kplatform) + 1,
 			    sizeof(char *));
 			linux_osd_jail_register();
 			stclohz = (stathz ? stathz : hz);


More information about the svn-src-user mailing list