Date: Fri, 10 May 2013 06:42:07 +0000 (UTC) From: Dmitry Chagin <dchagin@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r250437 - in user/dchagin/lemul/sys: amd64/linux32 compat/linux i386/linux Message-ID: <201305100642.r4A6g7Ro043432@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201305100642.r4A6g7Ro043432>