Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 May 2014 20:49:03 +0000 (UTC)
From:      Dmitry Chagin <dchagin@FreeBSD.org>
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
Message-ID:  <201405012049.s41Kn3Tx040880@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405012049.s41Kn3Tx040880>