Author: dchagin
Date: Sun May 24 15:30:52 2015
New Revision: 283410
URL: https://svnweb.freebsd.org/changeset/base/283410

Log:
  Put linux_platform into the vdso to avoid copying it onto the stack at
  every exec.
  
  Differential Revision:        https://reviews.freebsd.org/D1062
  Reviewed by:  trasz

Modified:
  head/sys/amd64/linux32/linux32_locore.s
  head/sys/amd64/linux32/linux32_sysvec.c
  head/sys/amd64/linux32/linux32_vdso.lds.s
  head/sys/compat/linux/linux_misc.c
  head/sys/compat/linux/linux_misc.h
  head/sys/i386/linux/linux_sysvec.c

Modified: head/sys/amd64/linux32/linux32_locore.s
==============================================================================
--- head/sys/amd64/linux32/linux32_locore.s     Sun May 24 15:29:56 2015        
(r283409)
+++ head/sys/amd64/linux32/linux32_locore.s     Sun May 24 15:30:52 2015        
(r283410)
@@ -5,6 +5,12 @@
 
 #include <amd64/linux32/linux32_syscall.h>     /* system call numbers */
 
+.data
+
+       .globl linux_platform
+linux_platform:
+       .asciz "i686"
+
 .text
 .code32
 

Modified: head/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- head/sys/amd64/linux32/linux32_sysvec.c     Sun May 24 15:29:56 2015        
(r283409)
+++ head/sys/amd64/linux32/linux32_sysvec.c     Sun May 24 15:30:52 2015        
(r283410)
@@ -110,8 +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_platform = "i686";
-static int linux_szplatform;
+const char *linux_kplatform;
 static int linux_szsigcode;
 static vm_object_t linux_shared_page_obj;
 static char *linux_shared_page_mapping;
@@ -229,6 +228,7 @@ struct linux32_ps_strings {
 LINUX_VDSO_SYM_INTPTR(linux32_sigcode);
 LINUX_VDSO_SYM_INTPTR(linux32_rt_sigcode);
 LINUX_VDSO_SYM_INTPTR(linux32_vsyscall);
+LINUX_VDSO_SYM_CHAR(linux_platform);
 
 /*
  * If FreeBSD & Linux have a difference of opinion about what a trap
@@ -257,11 +257,10 @@ elf_linux_fixup(register_t **stack_base,
 {
        Elf32_Auxargs *args;
        Elf32_Addr *base;
-       Elf32_Addr *pos, *uplatform;
+       Elf32_Addr *pos;
        struct linux32_ps_strings *arginfo;
 
        arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
-       uplatform = (Elf32_Addr *)((caddr_t)arginfo - linux_szplatform);
 
        KASSERT(curthread->td_proc == imgp->proc,
            ("unsafe elf_linux_fixup(), should be curproc"));
@@ -296,7 +295,7 @@ elf_linux_fixup(register_t **stack_base,
        AUXARGS_ENTRY_32(pos, AT_EUID, imgp->proc->p_ucred->cr_svuid);
        AUXARGS_ENTRY_32(pos, AT_GID, imgp->proc->p_ucred->cr_rgid);
        AUXARGS_ENTRY_32(pos, AT_EGID, imgp->proc->p_ucred->cr_svgid);
-       AUXARGS_ENTRY_32(pos, LINUX_AT_PLATFORM, PTROUT(uplatform));
+       AUXARGS_ENTRY_32(pos, LINUX_AT_PLATFORM, PTROUT(linux_platform));
        if (args->execfd != -1)
                AUXARGS_ENTRY_32(pos, AT_EXECFD, args->execfd);
        AUXARGS_ENTRY_32(pos, AT_NULL, 0);
@@ -883,15 +882,8 @@ linux_copyout_strings(struct image_param
         * Also deal with signal trampoline code for this exec type.
         */
        arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
-       destp = (caddr_t)arginfo - SPARE_USRSPACE - linux_szplatform -
-           roundup((ARG_MAX - imgp->args->stringspace),
-           sizeof(char *));
-
-       /*
-        * Install LINUX_PLATFORM
-        */
-       copyout(linux_platform, ((caddr_t)arginfo - linux_szplatform),
-           linux_szplatform);
+       destp = (caddr_t)arginfo - SPARE_USRSPACE -
+           roundup((ARG_MAX - imgp->args->stringspace), sizeof(char *));
 
        /*
         * If we have a valid auxargs ptr, prepare some room
@@ -1075,6 +1067,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);
@@ -1181,8 +1176,6 @@ linux_elf_modevent(module_t mod, int typ
                            linux_proc_exec, NULL, 1000);
                        linux_thread_dtor_tag = 
EVENTHANDLER_REGISTER(thread_dtor,
                            linux_thread_dtor, NULL, EVENTHANDLER_PRI_ANY);
-                       linux_szplatform = roundup(strlen(linux_platform) + 1,
-                           sizeof(char *));
                        linux_osd_jail_register();
                        stclohz = (stathz ? stathz : hz);
                        if (bootverbose)

Modified: head/sys/amd64/linux32/linux32_vdso.lds.s
==============================================================================
--- head/sys/amd64/linux32/linux32_vdso.lds.s   Sun May 24 15:29:56 2015        
(r283409)
+++ head/sys/amd64/linux32/linux32_vdso.lds.s   Sun May 24 15:30:52 2015        
(r283410)
@@ -60,6 +60,7 @@ VERSION
                linux32_vsyscall;
                linux32_sigcode;
                linux32_rt_sigcode;
+               linux_platform;
        local: *;
        };
 }

Modified: head/sys/compat/linux/linux_misc.c
==============================================================================
--- head/sys/compat/linux/linux_misc.c  Sun May 24 15:29:56 2015        
(r283409)
+++ head/sys/compat/linux/linux_misc.c  Sun May 24 15:30:52 2015        
(r283410)
@@ -731,7 +731,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: head/sys/compat/linux/linux_misc.h
==============================================================================
--- head/sys/compat/linux/linux_misc.h  Sun May 24 15:29:56 2015        
(r283409)
+++ head/sys/compat/linux/linux_misc.h  Sun May 24 15:30:52 2015        
(r283410)
@@ -57,7 +57,7 @@
 
 #define        LINUX_PATH_MAX          4096
 
-extern const char *linux_platform;
+extern const char *linux_kplatform;
 
 /*
  * Non-standard aux entry types used in Linux ELF binaries.

Modified: head/sys/i386/linux/linux_sysvec.c
==============================================================================
--- head/sys/i386/linux/linux_sysvec.c  Sun May 24 15:29:56 2015        
(r283409)
+++ head/sys/i386/linux/linux_sysvec.c  Sun May 24 15:30:52 2015        
(r283410)
@@ -118,7 +118,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_exit_tag;
 static eventhandler_tag linux_exec_tag;
@@ -330,7 +330,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);
 
        /*
@@ -1153,8 +1153,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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to