summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2016-01-20 01:09:53 +0000
committerjhb <jhb@FreeBSD.org>2016-01-20 01:09:53 +0000
commit77733541d454c3b987e985b85df345fc8c7f205d (patch)
tree06645c8b5fb21159a6ab7cfe6514945bca030b0f
parent2651e6b1c65c3a49c9390393bd44d1fc1d428f42 (diff)
downloadFreeBSD-src-77733541d454c3b987e985b85df345fc8c7f205d.zip
FreeBSD-src-77733541d454c3b987e985b85df345fc8c7f205d.tar.gz
MFC 289769,289822,290143,290144:
Rename remaining linux32 symbols from linux_* to linux32_*. 289769: Rename remaining linux32 symbols such as linux_sysent[] and linux_syscallnames[] from linux_* to linux32_* to avoid conflicts with linux64.ko. While here, add support for linux64 binaries to systrace. - Update NOPROTO entries in amd64/linux/syscalls.master to match the main table to fix systrace build. - Add a special case for union l_semun arguments to the systrace generation. - The systrace_linux32 module now only builds the systrace_linux32.ko. module on amd64. - Add a new systrace_linux module that builds on both i386 and amd64. For i386 it builds the existing systrace_linux.ko. For amd64 it builds a systrace_linux.ko for 64-bit binaries. 289822: Fix build for the KTR-enabled kernels. 290143: Fix build with DEBUG defined. 290144: Update for LINUX32 rename. The assembler didn't complain about undefined symbols but just used 0 after the rename.
-rw-r--r--sys/amd64/linux/syscalls.master6
-rw-r--r--sys/amd64/linux32/linux.h2
-rw-r--r--sys/amd64/linux32/linux32_locore.s4
-rw-r--r--sys/amd64/linux32/linux32_sysvec.c10
-rw-r--r--sys/amd64/linux32/syscalls.conf8
-rw-r--r--sys/amd64/linux32/syscalls.master2
-rw-r--r--sys/cddl/dev/systrace/systrace.c44
-rw-r--r--sys/compat/linux/linux_misc.c11
-rw-r--r--sys/kern/makesyscalls.sh4
-rw-r--r--sys/modules/dtrace/Makefile5
-rw-r--r--sys/modules/dtrace/systrace_linux/Makefile18
-rw-r--r--sys/modules/dtrace/systrace_linux32/Makefile6
12 files changed, 86 insertions, 34 deletions
diff --git a/sys/amd64/linux/syscalls.master b/sys/amd64/linux/syscalls.master
index d840f88..87c8000 100644
--- a/sys/amd64/linux/syscalls.master
+++ b/sys/amd64/linux/syscalls.master
@@ -49,8 +49,8 @@
struct l_newstat *buf); }
6 AUE_LSTAT STD { int linux_newlstat(char *path, \
struct l_newstat *buf); }
-7 AUE_POLL NOPROTO { int poll(struct pollfd*, \
- unsigned int nfds, int timeout); }
+7 AUE_POLL NOPROTO { int poll(struct pollfd *fds, u_int nfds, \
+ int timeout); }
8 AUE_LSEEK STD { int linux_lseek(l_uint fdes, l_off_t off, \
l_int whence); }
9 AUE_MMAP STD { int linux_mmap2(l_ulong addr, l_ulong len, \
@@ -316,7 +316,7 @@
161 AUE_CHROOT NOPROTO { int chroot(char *path); }
162 AUE_SYNC NOPROTO { int sync(void); }
163 AUE_ACCT NOPROTO { int acct(char *path); }
-164 AUE_SETTIMEOFDAY NOPROTO { int settimeofday(struct l_timeval *tp, struct timezone *tzp); }
+164 AUE_SETTIMEOFDAY NOPROTO { int settimeofday(struct l_timeval *tv, struct timezone *tzp); }
165 AUE_MOUNT STD { int linux_mount(char *specialfile, \
char *dir, char *filesystemtype, \
l_ulong rwflag, void *data); }
diff --git a/sys/amd64/linux32/linux.h b/sys/amd64/linux32/linux.h
index e3b9f11..02d12f5 100644
--- a/sys/amd64/linux32/linux.h
+++ b/sys/amd64/linux32/linux.h
@@ -40,7 +40,7 @@
* debugging support
*/
extern u_char linux_debug_map[];
-#define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
+#define ldebug(name) isclr(linux_debug_map, LINUX32_SYS_linux_ ## name)
#define ARGS(nm, fmt) "linux(%ld/%ld): "#nm"("fmt")\n", \
(long)td->td_proc->p_pid, (long)td->td_tid
#define LMSG(fmt) "linux(%ld/%ld): "fmt"\n", \
diff --git a/sys/amd64/linux32/linux32_locore.s b/sys/amd64/linux32/linux32_locore.s
index 4edbdf3..7bbd69a 100644
--- a/sys/amd64/linux32/linux32_locore.s
+++ b/sys/amd64/linux32/linux32_locore.s
@@ -28,7 +28,7 @@ NON_GPROF_ENTRY(linux32_sigcode)
jmp *LINUX_SIGF_HANDLER(%ebx)
.startsigcode:
popl %eax
- movl $LINUX_SYS_linux_sigreturn,%eax /* linux_sigreturn() */
+ movl $LINUX32_SYS_linux_sigreturn,%eax /* linux_sigreturn() */
int $0x80 /* enter kernel with args */
.endsigcode:
0: jmp 0b
@@ -44,7 +44,7 @@ NON_GPROF_ENTRY(linux32_rt_sigcode)
push %eax
jmp *LINUX_RT_SIGF_HANDLER(%edi)
.startrtsigcode:
- movl $LINUX_SYS_linux_rt_sigreturn,%eax /* linux_rt_sigreturn() */
+ movl $LINUX32_SYS_linux_rt_sigreturn,%eax /* linux_rt_sigreturn() */
int $0x80 /* enter kernel with args */
.endrtsigcode:
0: jmp 0b
diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c
index 8f722aa..73949d9 100644
--- a/sys/amd64/linux32/linux32_sysvec.c
+++ b/sys/amd64/linux32/linux32_sysvec.c
@@ -105,8 +105,8 @@ MODULE_VERSION(linux, 1);
* to syscall 0. This is slightly less bogus than using
* ldebug(sigreturn).
*/
-#define LINUX_SYS_linux_rt_sendsig 0
-#define LINUX_SYS_linux_sendsig 0
+#define LINUX32_SYS_linux_rt_sendsig 0
+#define LINUX32_SYS_linux_sendsig 0
const char *linux_kplatform;
static int linux_szsigcode;
@@ -115,7 +115,7 @@ static char *linux_shared_page_mapping;
extern char _binary_linux32_locore_o_start;
extern char _binary_linux32_locore_o_end;
-extern struct sysent linux_sysent[LINUX_SYS_MAXSYSCALL];
+extern struct sysent linux32_sysent[LINUX32_SYS_MAXSYSCALL];
SET_DECLARE(linux_ioctl_handler_set, struct linux_ioctl_handler);
@@ -1008,8 +1008,8 @@ linux32_fixlimit(struct rlimit *rl, int which)
}
struct sysentvec elf_linux_sysvec = {
- .sv_size = LINUX_SYS_MAXSYSCALL,
- .sv_table = linux_sysent,
+ .sv_size = LINUX32_SYS_MAXSYSCALL,
+ .sv_table = linux32_sysent,
.sv_mask = 0,
.sv_sigsize = 0,
.sv_sigtbl = NULL,
diff --git a/sys/amd64/linux32/syscalls.conf b/sys/amd64/linux32/syscalls.conf
index dc0ad82..7d096b5 100644
--- a/sys/amd64/linux32/syscalls.conf
+++ b/sys/amd64/linux32/syscalls.conf
@@ -1,11 +1,11 @@
# $FreeBSD$
sysnames="linux32_syscalls.c"
sysproto="linux32_proto.h"
-sysproto_h=_LINUX_SYSPROTO_H_
+sysproto_h=_LINUX32_SYSPROTO_H_
syshdr="linux32_syscall.h"
syssw="linux32_sysent.c"
sysmk="/dev/null"
-syscallprefix="LINUX_SYS_"
-switchname="linux_sysent"
-namesname="linux_syscallnames"
+syscallprefix="LINUX32_SYS_"
+switchname="linux32_sysent"
+namesname="linux32_syscallnames"
systrace="linux32_systrace_args.c"
diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master
index 6e09c5a..0396b30 100644
--- a/sys/amd64/linux32/syscalls.master
+++ b/sys/amd64/linux32/syscalls.master
@@ -2,7 +2,7 @@
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
; System call name/number master file (or rather, slave, from LINUX).
-; Processed to create linux_sysent.c, linux_proto.h and linux_syscall.h.
+; Processed to create linux32_sysent.c, linux32_proto.h and linux32_syscall.h.
; Columns: number audit type nargs name alt{name,tag,rtyp}/comments
; number system call number, must be in order
diff --git a/sys/cddl/dev/systrace/systrace.c b/sys/cddl/dev/systrace/systrace.c
index 921393c..1796091 100644
--- a/sys/cddl/dev/systrace/systrace.c
+++ b/sys/cddl/dev/systrace/systrace.c
@@ -60,24 +60,37 @@
#ifdef LINUX_SYSTRACE
#if defined(__amd64__)
-#include <amd64/linux32/linux.h>
-#include <amd64/linux32/linux32_proto.h>
-#include <amd64/linux32/linux32_syscalls.c>
-#include <amd64/linux32/linux32_systrace_args.c>
-#define MODNAME "linux32"
+#include <amd64/linux/linux.h>
+#include <amd64/linux/linux_proto.h>
+#include <amd64/linux/linux_syscalls.c>
+#include <amd64/linux/linux_systrace_args.c>
#elif defined(__i386__)
#include <i386/linux/linux.h>
#include <i386/linux/linux_proto.h>
#include <i386/linux/linux_syscalls.c>
#include <i386/linux/linux_systrace_args.c>
-#define MODNAME "linux"
#else
#error Only i386 and amd64 are supported.
#endif
+#define MODNAME "linux"
extern struct sysent linux_sysent[];
#define MAXSYSCALL LINUX_SYS_MAXSYSCALL
#define SYSCALLNAMES linux_syscallnames
#define SYSENT linux_sysent
+#elif defined(LINUX32_SYSTRACE)
+#if defined(__amd64__)
+#include <amd64/linux32/linux.h>
+#include <amd64/linux32/linux32_proto.h>
+#include <amd64/linux32/linux32_syscalls.c>
+#include <amd64/linux32/linux32_systrace_args.c>
+#else
+#error Only amd64 is supported.
+#endif
+#define MODNAME "linux32"
+extern struct sysent linux32_sysent[];
+#define MAXSYSCALL LINUX32_SYS_MAXSYSCALL
+#define SYSCALLNAMES linux32_syscallnames
+#define SYSENT linux32_sysent
#elif defined(FREEBSD32_SYSTRACE)
/*
* The syscall arguments are processed into a DTrace argument array
@@ -103,6 +116,7 @@ extern const char *freebsd32_syscallnames[];
#define MAXSYSCALL SYS_MAXSYSCALL
#define SYSCALLNAMES syscallnames
#define SYSENT sysent
+#define NATIVE_ABI
#endif
#define PROVNAME "syscall"
@@ -132,7 +146,7 @@ static void systrace_load(void *);
static struct cdevsw systrace_cdevsw = {
.d_version = D_VERSION,
.d_open = systrace_open,
-#ifdef LINUX_SYSTRACE
+#ifndef NATIVE_ABI
.d_name = "systrace_" MODNAME,
#else
.d_name = "systrace",
@@ -171,7 +185,7 @@ static dtrace_provider_id_t systrace_id;
typedef void (*systrace_dtrace_probe_t)(dtrace_id_t, uintptr_t, uintptr_t,
uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
-#if !defined(LINUX_SYSTRACE)
+#ifdef NATIVE_ABI
/*
* Probe callback function.
*
@@ -314,7 +328,7 @@ systrace_load(void *dummy)
NULL, &systrace_pops, NULL, &systrace_id) != 0)
return;
-#if !defined(LINUX_SYSTRACE)
+#ifdef NATIVE_ABI
systrace_probe_func = systrace_probe;
#endif
}
@@ -328,7 +342,7 @@ systrace_unload()
if ((error = dtrace_unregister(systrace_id)) != 0)
return (error);
-#if !defined(LINUX_SYSTRACE)
+#ifdef NATIVE_ABI
systrace_probe_func = NULL;
#endif
@@ -370,6 +384,16 @@ SYSINIT(systrace_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, systrace_load, NULL
SYSUNINIT(systrace_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY, systrace_unload, NULL);
#ifdef LINUX_SYSTRACE
+DEV_MODULE(systrace_linux, systrace_modevent, NULL);
+MODULE_VERSION(systrace_linux, 1);
+#ifdef __amd64__
+MODULE_DEPEND(systrace_linux, linux64, 1, 1, 1);
+#else
+MODULE_DEPEND(systrace_linux, linux, 1, 1, 1);
+#endif
+MODULE_DEPEND(systrace_linux, dtrace, 1, 1, 1);
+MODULE_DEPEND(systrace_linux, opensolaris, 1, 1, 1);
+#elif defined(LINUX32_SYSTRACE)
DEV_MODULE(systrace_linux32, systrace_modevent, NULL);
MODULE_VERSION(systrace_linux32, 1);
MODULE_DEPEND(systrace_linux32, linux, 1, 1, 1);
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index 8f2a687..538b9dc 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -2362,7 +2362,13 @@ linux_ppoll(struct thread *td, struct linux_ppoll_args *args)
#if defined(DEBUG) || defined(KTR)
/* XXX: can be removed when every ldebug(...) and KTR stuff are removed. */
-u_char linux_debug_map[howmany(LINUX_SYS_MAXSYSCALL, sizeof(u_char))];
+#ifdef COMPAT_LINUX32
+#define L_MAXSYSCALL LINUX32_SYS_MAXSYSCALL
+#else
+#define L_MAXSYSCALL LINUX_SYS_MAXSYSCALL
+#endif
+
+u_char linux_debug_map[howmany(L_MAXSYSCALL, sizeof(u_char))];
static int
linux_debug(int syscall, int toggle, int global)
@@ -2374,7 +2380,7 @@ linux_debug(int syscall, int toggle, int global)
memset(linux_debug_map, c, sizeof(linux_debug_map));
return (0);
}
- if (syscall < 0 || syscall >= LINUX_SYS_MAXSYSCALL)
+ if (syscall < 0 || syscall >= L_MAXSYSCALL)
return (EINVAL);
if (toggle)
clrbit(linux_debug_map, syscall);
@@ -2382,6 +2388,7 @@ linux_debug(int syscall, int toggle, int global)
setbit(linux_debug_map, syscall);
return (0);
}
+#undef L_MAXSYSCALL
/*
* Usage: sysctl linux.debug=<syscall_nr>.<0/1>
diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh
index 8be4896..1d3af65 100644
--- a/sys/kern/makesyscalls.sh
+++ b/sys/kern/makesyscalls.sh
@@ -410,6 +410,10 @@ s/\$//g
printf("\t\tuarg[%d] = (intptr_t) p->%s; /* %s */\n", \
i - 1, \
argname[i], arg) > systrace
+ else if (arg == "union l_semun")
+ printf("\t\tuarg[%d] = p->%s.buf; /* %s */\n", \
+ i - 1, \
+ argname[i], arg) > systrace
else if (substr(arg, 1, 1) == "u" || arg == "size_t")
printf("\t\tuarg[%d] = p->%s; /* %s */\n", \
i - 1, \
diff --git a/sys/modules/dtrace/Makefile b/sys/modules/dtrace/Makefile
index 1b12371..9f3c993 100644
--- a/sys/modules/dtrace/Makefile
+++ b/sys/modules/dtrace/Makefile
@@ -16,7 +16,10 @@ SUBDIR= dtmalloc \
systrace
.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
-SUBDIR+= fasttrap fbt systrace_linux32
+SUBDIR+= fasttrap fbt systrace_linux
+.endif
+.if ${MACHINE_CPUARCH} == "amd64"
+SUBDIR+= systrace_linux32
.endif
.if ${MACHINE_CPUARCH} == "powerpc"
SUBDIR+= fbt fasttrap
diff --git a/sys/modules/dtrace/systrace_linux/Makefile b/sys/modules/dtrace/systrace_linux/Makefile
new file mode 100644
index 0000000..1cf5e31
--- /dev/null
+++ b/sys/modules/dtrace/systrace_linux/Makefile
@@ -0,0 +1,18 @@
+# $FreeBSD$
+
+SYSDIR?= ${.CURDIR}/../../..
+
+.PATH: ${SYSDIR}/cddl/dev/systrace
+
+KMOD= systrace_linux
+
+SRCS= systrace.c
+SRCS+= vnode_if.h
+
+CFLAGS+= -I${SYSDIR}/cddl/compat/opensolaris \
+ -I${SYSDIR}/cddl/contrib/opensolaris/uts/common \
+ -I${SYSDIR} -DLINUX_SYSTRACE
+
+.include <bsd.kmod.mk>
+
+CFLAGS+= -include ${SYSDIR}/cddl/compat/opensolaris/sys/debug_compat.h
diff --git a/sys/modules/dtrace/systrace_linux32/Makefile b/sys/modules/dtrace/systrace_linux32/Makefile
index a2bfc81..3183482 100644
--- a/sys/modules/dtrace/systrace_linux32/Makefile
+++ b/sys/modules/dtrace/systrace_linux32/Makefile
@@ -2,18 +2,14 @@
.PATH: ${.CURDIR}/../../../cddl/dev/systrace
-.if ${MACHINE} == "amd64"
KMOD= systrace_linux32
-.else
-KMOD= systrace_linux
-.endif
SRCS= systrace.c
SRCS+= vnode_if.h
CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris \
-I${.CURDIR}/../../../cddl/contrib/opensolaris/uts/common \
- -I${.CURDIR}/../../.. -DLINUX_SYSTRACE
+ -I${.CURDIR}/../../.. -DLINUX32_SYSTRACE
.include <bsd.kmod.mk>
OpenPOWER on IntegriCloud