1139743Simp/*-
214331Speter * Copyright (c) 1994 Christos Zoulas
314331Speter * Copyright (c) 1995 Frank van der Linden
414331Speter * Copyright (c) 1995 Scott Bartram
514331Speter * All rights reserved.
614331Speter *
714331Speter * Redistribution and use in source and binary forms, with or without
814331Speter * modification, are permitted provided that the following conditions
914331Speter * are met:
1014331Speter * 1. Redistributions of source code must retain the above copyright
1114331Speter *    notice, this list of conditions and the following disclaimer.
1214331Speter * 2. Redistributions in binary form must reproduce the above copyright
1314331Speter *    notice, this list of conditions and the following disclaimer in the
1414331Speter *    documentation and/or other materials provided with the distribution.
1514331Speter * 3. The name of the author may not be used to endorse or promote products
1614331Speter *    derived from this software without specific prior written permission
1714331Speter *
1814331Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1914331Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2014331Speter * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2114331Speter * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2214331Speter * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2314331Speter * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2414331Speter * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2514331Speter * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2614331Speter * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2714331Speter * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2814331Speter *
2914331Speter * from: svr4_util.h,v 1.5 1994/11/18 02:54:31 christos Exp
3014331Speter * from: linux_util.h,v 1.2 1995/03/05 23:23:50 fvdl Exp
3150477Speter * $FreeBSD$
3214331Speter */
3314331Speter
3414331Speter#ifndef	_LINUX_UTIL_H_
3514331Speter#define	_LINUX_UTIL_H_
3614331Speter
3714331Speter#include <vm/vm.h>
3814331Speter#include <vm/vm_param.h>
3914331Speter#include <vm/pmap.h>
4014331Speter#include <machine/vmparam.h>
4114331Speter#include <sys/exec.h>
4214331Speter#include <sys/sysent.h>
43108541Salfred#include <sys/syslog.h>
4414331Speter#include <sys/cdefs.h>
45102803Siedowse#include <sys/uio.h>
4614331Speter
4754122Smarcelextern const char linux_emul_path[];
4854122Smarcel
49177997Skibint linux_emul_convpath(struct thread *, const char *, enum uio_seg, char **, int, int);
5014331Speter
51177997Skib#define LCONVPATH_AT(td, upath, pathp, i, dfd)				\
52102803Siedowse	do {								\
53102803Siedowse		int _error;						\
54102803Siedowse									\
55177997Skib		_error = linux_emul_convpath(td, upath, UIO_USERSPACE,	\
56177997Skib		    pathp, i, dfd);					\
57102803Siedowse		if (*(pathp) == NULL)					\
58102803Siedowse			return (_error);				\
59102803Siedowse	} while (0)
60102803Siedowse
61168014Sjulian#define LCONVPATH(td, upath, pathp, i) 	\
62177997Skib   LCONVPATH_AT(td, upath, pathp, i, AT_FDCWD)
63168014Sjulian
64102803Siedowse#define LCONVPATHEXIST(td, upath, pathp) LCONVPATH(td, upath, pathp, 0)
65177997Skib#define LCONVPATHEXIST_AT(td, upath, pathp, dfd) LCONVPATH_AT(td, upath, pathp, 0, dfd)
66102803Siedowse#define LCONVPATHCREAT(td, upath, pathp) LCONVPATH(td, upath, pathp, 1)
67177997Skib#define LCONVPATHCREAT_AT(td, upath, pathp, dfd) LCONVPATH_AT(td, upath, pathp, 1, dfd)
68102803Siedowse#define LFREEPATH(path)	free(path, M_TEMP)
69102803Siedowse
7068201Sobrien#define DUMMY(s)							\
71235063SnetchildLIN_SDT_PROBE_DEFINE0(dummy, s, entry);					\
72235063SnetchildLIN_SDT_PROBE_DEFINE0(dummy, s, not_implemented);			\
73235063SnetchildLIN_SDT_PROBE_DEFINE1(dummy, s, return, "int");				\
7468201Sobrienint									\
75136356Sdwmalonelinux_ ## s(struct thread *td, struct linux_ ## s ## _args *args)	\
7668201Sobrien{									\
77153236Sglebius	static pid_t pid;						\
78153236Sglebius									\
79235063Snetchild	LIN_SDT_PROBE0(dummy, s, entry);				\
80235063Snetchild									\
81153236Sglebius	if (pid != td->td_proc->p_pid) {				\
82153236Sglebius		linux_msg(td, "syscall %s not implemented", #s);	\
83235063Snetchild		LIN_SDT_PROBE0(dummy, s, not_implemented);		\
84153236Sglebius		pid = td->td_proc->p_pid;				\
85153236Sglebius	};								\
86235063Snetchild									\
87235063Snetchild	LIN_SDT_PROBE1(dummy, s, return, ENOSYS);			\
88153236Sglebius	return (ENOSYS);						\
8968201Sobrien}									\
9068201Sobrienstruct __hack
9168201Sobrien
92108541Salfredvoid linux_msg(const struct thread *td, const char *fmt, ...)
93108541Salfred	__printflike(2, 3);
94108541Salfred
95158311Sambriskostruct linux_device_handler {
96158311Sambrisko	char	*bsd_driver_name;
97158311Sambrisko	char	*linux_driver_name;
98158311Sambrisko	char	*bsd_device_name;
99158311Sambrisko	char	*linux_device_name;
100158311Sambrisko	int	linux_major;
101158311Sambrisko	int	linux_minor;
102158311Sambrisko	int	linux_char_device;
103158311Sambrisko};
104158311Sambrisko
105158311Sambriskoint	linux_device_register_handler(struct linux_device_handler *h);
106158311Sambriskoint	linux_device_unregister_handler(struct linux_device_handler *h);
107158311Sambriskochar	*linux_driver_get_name_dev(device_t dev);
108231378Sedint	linux_driver_get_major_minor(const char *node, int *major, int *minor);
109158311Sambriskochar	*linux_get_char_devices(void);
110158311Sambriskovoid	linux_free_get_char_devices(char *string);
111158311Sambrisko
112191877Sdchagin#if defined(KTR)
113191877Sdchagin
114191877Sdchagin#define	KTR_LINUX				KTR_SUBSYS
115191877Sdchagin#define	LINUX_CTRFMT(nm, fmt)	#nm"("fmt")"
116191877Sdchagin
117191877Sdchagin#define	LINUX_CTR6(f, m, p1, p2, p3, p4, p5, p6) do {			\
118191877Sdchagin	if (ldebug(f))							\
119191877Sdchagin		CTR6(KTR_LINUX, LINUX_CTRFMT(f, m),			\
120191877Sdchagin		    p1, p2, p3, p4, p5, p6);				\
121191877Sdchagin} while (0)
122191877Sdchagin
123191877Sdchagin#define	LINUX_CTR(f)			LINUX_CTR6(f, "", 0, 0, 0, 0, 0, 0)
124191877Sdchagin#define	LINUX_CTR0(f, m)		LINUX_CTR6(f, m, 0, 0, 0, 0, 0, 0)
125191877Sdchagin#define	LINUX_CTR1(f, m, p1)		LINUX_CTR6(f, m, p1, 0, 0, 0, 0, 0)
126191877Sdchagin#define	LINUX_CTR2(f, m, p1, p2)	LINUX_CTR6(f, m, p1, p2, 0, 0, 0, 0)
127191877Sdchagin#define	LINUX_CTR3(f, m, p1, p2, p3)	LINUX_CTR6(f, m, p1, p2, p3, 0, 0, 0)
128191877Sdchagin#define	LINUX_CTR4(f, m, p1, p2, p3, p4)	LINUX_CTR6(f, m, p1, p2, p3, p4, 0, 0)
129191877Sdchagin#define	LINUX_CTR5(f, m, p1, p2, p3, p4, p5)	LINUX_CTR6(f, m, p1, p2, p3, p4, p5, 0)
130191877Sdchagin#else
131191877Sdchagin#define	LINUX_CTR(f)
132191877Sdchagin#define	LINUX_CTR0(f, m)
133191877Sdchagin#define	LINUX_CTR1(f, m, p1)
134191877Sdchagin#define	LINUX_CTR2(f, m, p1, p2)
135191877Sdchagin#define	LINUX_CTR3(f, m, p1, p2, p3)
136191877Sdchagin#define	LINUX_CTR4(f, m, p1, p2, p3, p4)
137191877Sdchagin#define	LINUX_CTR5(f, m, p1, p2, p3, p4, p5)
138191877Sdchagin#define	LINUX_CTR6(f, m, p1, p2, p3, p4, p5, p6)
139191877Sdchagin#endif
140191877Sdchagin
14114331Speter#endif /* !_LINUX_UTIL_H_ */
142