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
Dmitry Chagin
dchagin at FreeBSD.org
Thu May 1 20:49:07 UTC 2014
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
More information about the svn-src-user
mailing list