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