From owner-svn-src-user@FreeBSD.ORG Thu May 1 20:49:06 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id E279A18E; Thu, 1 May 2014 20:49:06 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C3CF91A65; Thu, 1 May 2014 20:49:06 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s41Kn6NZ040904; Thu, 1 May 2014 20:49:06 GMT (envelope-from dchagin@svn.freebsd.org) Received: (from dchagin@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s41Kn3Tx040880; Thu, 1 May 2014 20:49:03 GMT (envelope-from dchagin@svn.freebsd.org) Message-Id: <201405012049.s41Kn3Tx040880@svn.freebsd.org> From: Dmitry Chagin Date: Thu, 1 May 2014 20:49:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r265198 - in user/dchagin/lemul/sys: amd64/amd64 amd64/linux amd64/linux32 arm/arm compat/ia32 compat/svr4 i386/i386 i386/ibcs2 ia64/ia64 kern mips/mips powerpc/powerpc sparc64/sparc64 sys X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 May 2014 20:49:07 -0000 Author: dchagin Date: Thu May 1 20:49:02 2014 New Revision: 265198 URL: http://svnweb.freebsd.org/changeset/base/265198 Log: Commit vsyscall hack. Looks like prior to 2.13 glibc vsyscall technique used instead of proper vdso symbols. Modified: user/dchagin/lemul/sys/amd64/amd64/elf_machdep.c user/dchagin/lemul/sys/amd64/amd64/trap.c user/dchagin/lemul/sys/amd64/linux/linux_sysvec.c user/dchagin/lemul/sys/amd64/linux32/linux32_sysvec.c user/dchagin/lemul/sys/arm/arm/elf_machdep.c user/dchagin/lemul/sys/compat/ia32/ia32_sysvec.c user/dchagin/lemul/sys/compat/svr4/svr4_sysvec.c user/dchagin/lemul/sys/i386/i386/elf_machdep.c user/dchagin/lemul/sys/i386/ibcs2/ibcs2_sysvec.c user/dchagin/lemul/sys/ia64/ia64/elf_machdep.c user/dchagin/lemul/sys/kern/imgact_aout.c user/dchagin/lemul/sys/kern/init_main.c user/dchagin/lemul/sys/mips/mips/elf_machdep.c user/dchagin/lemul/sys/mips/mips/freebsd32_machdep.c user/dchagin/lemul/sys/powerpc/powerpc/elf32_machdep.c user/dchagin/lemul/sys/powerpc/powerpc/elf64_machdep.c user/dchagin/lemul/sys/sparc64/sparc64/elf_machdep.c user/dchagin/lemul/sys/sys/sysent.h Modified: user/dchagin/lemul/sys/amd64/amd64/elf_machdep.c ============================================================================== --- user/dchagin/lemul/sys/amd64/amd64/elf_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/amd64/amd64/elf_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -81,6 +81,7 @@ struct sysentvec elf64_freebsd_sysvec = .sv_shared_page_base = SHAREDPAGE, .sv_shared_page_len = PAGE_SIZE, .sv_schedtail = NULL, + .sv_trap = NULL, }; INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec); Modified: user/dchagin/lemul/sys/amd64/amd64/trap.c ============================================================================== --- user/dchagin/lemul/sys/amd64/amd64/trap.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/amd64/amd64/trap.c Thu May 1 20:49:02 2014 (r265198) @@ -295,6 +295,10 @@ trap(struct trapframe *frame) if (td->td_ucred != p->p_ucred) cred_update_thread(td); + if (*p->p_sysent->sv_trap) + if ((*p->p_sysent->sv_trap)(td, frame) == 0) + goto userout; + switch (type) { case T_PRIVINFLT: /* privileged instruction fault */ i = SIGILL; Modified: user/dchagin/lemul/sys/amd64/linux/linux_sysvec.c ============================================================================== --- user/dchagin/lemul/sys/amd64/linux/linux_sysvec.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/amd64/linux/linux_sysvec.c Thu May 1 20:49:02 2014 (r265198) @@ -124,6 +124,7 @@ static void linux_set_syscall_retval(str static int linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa); static void linux_exec_setregs(struct thread *td, struct image_params *imgp, u_long stack); +static int linux_vsyscall(struct thread *td, struct trapframe *tf); static eventhandler_tag linux_exec_tag; static eventhandler_tag linux_thread_dtor_tag; @@ -744,6 +745,58 @@ exec_linux_imgact_try(struct image_param return(error); } +/* + * vsyscall area, temporary hack. XXX + * + * getcpu missied.... + */ +#define LINUX_VSYSCALL_START (-10UL << 20) +#define LINUX_VSYSCALL_SIZE 1024 +#define LINUX_VSYSCALL_NR 3 + +const unsigned long linux_vsyscall_vector[] = { + LINUX_SYS_gettimeofday, + LINUX_SYS_linux_time, + -1, + -1 +}; + +static int +linux_vsyscall(struct thread *td, struct trapframe *tf) +{ + int code, error, traced; + uint64_t retqaddr, trapaddr; + + error = -1; + trapaddr = tf->tf_rip; + + /* check up %rip for LINUX_VSYSCALL AREA */ + if (__predict_true(trapaddr < LINUX_VSYSCALL_START)) + return (error); + if ((tf->tf_rip & (LINUX_VSYSCALL_SIZE - 1)) != 0) + return (error); + code = (tf->tf_rip - LINUX_VSYSCALL_START) / LINUX_VSYSCALL_SIZE; + if (code > LINUX_VSYSCALL_NR) + return (error); + /* + * vsyscall called as callq *(%rax), so we must + * use return address from %rsp and also fixup %rsp + */ + error = copyin((void *)tf->tf_rsp, &retqaddr, sizeof(retqaddr)); + if (error) + return (error); + + tf->tf_rip = retqaddr; + tf->tf_rax = linux_vsyscall_vector[code]; + tf->tf_rsp += 8; + + traced = (tf->tf_flags & PSL_T); + + amd64_syscall(td, traced); + + return (0); +} + struct sysentvec elf_linux_sysvec = { .sv_size = LINUX_SYS_MAXSYSCALL, .sv_table = linux_sysent, @@ -779,7 +832,8 @@ struct sysentvec elf_linux_sysvec = { .sv_shared_page_base = SHAREDPAGE, .sv_shared_page_len = PAGE_SIZE, .sv_schedtail = linux_schedtail, - .sv_thread_detach = linux_thread_detach + .sv_thread_detach = linux_thread_detach, + .sv_trap = linux_vsyscall }; static void Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_sysvec.c ============================================================================== --- user/dchagin/lemul/sys/amd64/linux32/linux32_sysvec.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/amd64/linux32/linux32_sysvec.c Thu May 1 20:49:02 2014 (r265198) @@ -1042,7 +1042,8 @@ struct sysentvec elf_linux_sysvec = { .sv_shared_page_base = LINUX32_SHAREDPAGE, .sv_shared_page_len = PAGE_SIZE, .sv_schedtail = linux_schedtail, - .sv_thread_detach = linux_thread_detach + .sv_thread_detach = linux_thread_detach, + .sv_trap = NULL, }; static void Modified: user/dchagin/lemul/sys/arm/arm/elf_machdep.c ============================================================================== --- user/dchagin/lemul/sys/arm/arm/elf_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/arm/arm/elf_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -79,6 +79,7 @@ struct sysentvec elf32_freebsd_sysvec = .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, .sv_schedtail = NULL, + .sv_trap = NULL, }; static Elf32_Brandinfo freebsd_brand_info = { Modified: user/dchagin/lemul/sys/compat/ia32/ia32_sysvec.c ============================================================================== --- user/dchagin/lemul/sys/compat/ia32/ia32_sysvec.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/compat/ia32/ia32_sysvec.c Thu May 1 20:49:02 2014 (r265198) @@ -139,6 +139,7 @@ struct sysentvec ia32_freebsd_sysvec = { .sv_shared_page_base = FREEBSD32_SHAREDPAGE, .sv_shared_page_len = PAGE_SIZE, .sv_schedtail = NULL, + .sv_trap = NULL, }; INIT_SYSENTVEC(elf_ia32_sysvec, &ia32_freebsd_sysvec); Modified: user/dchagin/lemul/sys/compat/svr4/svr4_sysvec.c ============================================================================== --- user/dchagin/lemul/sys/compat/svr4/svr4_sysvec.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/compat/svr4/svr4_sysvec.c Thu May 1 20:49:02 2014 (r265198) @@ -196,6 +196,7 @@ struct sysentvec svr4_sysvec = { .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = NULL, .sv_schedtail = NULL, + .sv_trap = NULL, }; const char svr4_emul_path[] = "/compat/svr4"; Modified: user/dchagin/lemul/sys/i386/i386/elf_machdep.c ============================================================================== --- user/dchagin/lemul/sys/i386/i386/elf_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/i386/i386/elf_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -81,6 +81,7 @@ struct sysentvec elf32_freebsd_sysvec = .sv_shared_page_base = SHAREDPAGE, .sv_shared_page_len = PAGE_SIZE, .sv_schedtail = NULL, + .sv_trap = NULL, }; INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec); Modified: user/dchagin/lemul/sys/i386/ibcs2/ibcs2_sysvec.c ============================================================================== --- user/dchagin/lemul/sys/i386/ibcs2/ibcs2_sysvec.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/i386/ibcs2/ibcs2_sysvec.c Thu May 1 20:49:02 2014 (r265198) @@ -89,6 +89,7 @@ struct sysentvec ibcs2_svr3_sysvec = { .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = NULL, .sv_schedtail = NULL, + .sv_trap = NULL, }; static int Modified: user/dchagin/lemul/sys/ia64/ia64/elf_machdep.c ============================================================================== --- user/dchagin/lemul/sys/ia64/ia64/elf_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/ia64/ia64/elf_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -86,6 +86,7 @@ struct sysentvec elf64_freebsd_sysvec = .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, .sv_schedtail = NULL, + .sv_trap = NULL, }; static Elf64_Brandinfo freebsd_brand_info = { Modified: user/dchagin/lemul/sys/kern/imgact_aout.c ============================================================================== --- user/dchagin/lemul/sys/kern/imgact_aout.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/kern/imgact_aout.c Thu May 1 20:49:02 2014 (r265198) @@ -99,6 +99,7 @@ struct sysentvec aout_sysvec = { .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, .sv_schedtail = NULL, + .sv_trap = NULL, }; #elif defined(__amd64__) Modified: user/dchagin/lemul/sys/kern/init_main.c ============================================================================== --- user/dchagin/lemul/sys/kern/init_main.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/kern/init_main.c Thu May 1 20:49:02 2014 (r265198) @@ -410,6 +410,7 @@ struct sysentvec null_sysvec = { .sv_fetch_syscall_args = null_fetch_syscall_args, .sv_syscallnames = NULL, .sv_schedtail = NULL, + .sv_trap = NULL, }; /* Modified: user/dchagin/lemul/sys/mips/mips/elf_machdep.c ============================================================================== --- user/dchagin/lemul/sys/mips/mips/elf_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/mips/mips/elf_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -83,6 +83,7 @@ struct sysentvec elf64_freebsd_sysvec = .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, .sv_schedtail = NULL, + .sv_trap = NULL, }; static Elf64_Brandinfo freebsd_brand_info = { @@ -139,6 +140,7 @@ struct sysentvec elf32_freebsd_sysvec = .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, .sv_schedtail = NULL, + .sv_trap = NULL, }; static Elf32_Brandinfo freebsd_brand_info = { Modified: user/dchagin/lemul/sys/mips/mips/freebsd32_machdep.c ============================================================================== --- user/dchagin/lemul/sys/mips/mips/freebsd32_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/mips/mips/freebsd32_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -106,6 +106,7 @@ struct sysentvec elf32_freebsd_sysvec = .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = freebsd32_syscallnames, .sv_schedtail = NULL, + .sv_trap = NULL, }; INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec); Modified: user/dchagin/lemul/sys/powerpc/powerpc/elf32_machdep.c ============================================================================== --- user/dchagin/lemul/sys/powerpc/powerpc/elf32_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/powerpc/powerpc/elf32_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -107,6 +107,7 @@ struct sysentvec elf32_freebsd_sysvec = .sv_shared_page_base = FREEBSD32_SHAREDPAGE, .sv_shared_page_len = PAGE_SIZE, .sv_schedtail = NULL, + .sv_trap = NULL, }; INIT_SYSENTVEC(elf32_sysvec, &elf32_freebsd_sysvec); Modified: user/dchagin/lemul/sys/powerpc/powerpc/elf64_machdep.c ============================================================================== --- user/dchagin/lemul/sys/powerpc/powerpc/elf64_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/powerpc/powerpc/elf64_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -83,6 +83,7 @@ struct sysentvec elf64_freebsd_sysvec = .sv_shared_page_base = SHAREDPAGE, .sv_shared_page_len = PAGE_SIZE, .sv_schedtail = NULL, + .sv_trap = NULL, }; INIT_SYSENTVEC(elf64_sysvec, &elf64_freebsd_sysvec); Modified: user/dchagin/lemul/sys/sparc64/sparc64/elf_machdep.c ============================================================================== --- user/dchagin/lemul/sys/sparc64/sparc64/elf_machdep.c Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/sparc64/sparc64/elf_machdep.c Thu May 1 20:49:02 2014 (r265198) @@ -87,6 +87,7 @@ static struct sysentvec elf64_freebsd_sy .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, .sv_schedtail = NULL, + .sv_trap = NULL, }; static Elf64_Brandinfo freebsd_brand_info = { Modified: user/dchagin/lemul/sys/sys/sysent.h ============================================================================== --- user/dchagin/lemul/sys/sys/sysent.h Thu May 1 15:23:20 2014 (r265197) +++ user/dchagin/lemul/sys/sys/sysent.h Thu May 1 20:49:02 2014 (r265198) @@ -131,6 +131,7 @@ struct sysentvec { void *sv_shared_page_obj; void (*sv_schedtail)(struct thread *); void (*sv_thread_detach)(struct thread *); + int (*sv_trap)(struct thread *, struct trapframe *); }; #define SV_ILP32 0x000100