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. Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D3954
This commit is contained in:
parent
2705fe5cc1
commit
9740ac3060
@ -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); }
|
||||
|
@ -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,
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -411,6 +411,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, \
|
||||
|
@ -13,7 +13,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
|
||||
|
18
sys/modules/dtrace/systrace_linux/Makefile
Normal file
18
sys/modules/dtrace/systrace_linux/Makefile
Normal file
@ -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
|
@ -4,18 +4,14 @@ SYSDIR?= ${.CURDIR}/../../..
|
||||
|
||||
.PATH: ${SYSDIR}/cddl/dev/systrace
|
||||
|
||||
.if ${MACHINE} == "amd64"
|
||||
KMOD= systrace_linux32
|
||||
.else
|
||||
KMOD= systrace_linux
|
||||
.endif
|
||||
|
||||
SRCS= systrace.c
|
||||
SRCS+= vnode_if.h
|
||||
|
||||
CFLAGS+= -I${SYSDIR}/cddl/compat/opensolaris \
|
||||
-I${SYSDIR}/cddl/contrib/opensolaris/uts/common \
|
||||
-I${SYSDIR} -DLINUX_SYSTRACE
|
||||
-I${SYSDIR} -DLINUX32_SYSTRACE
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user