1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /*
28 * Copyright 2015 Joyent, Inc. All rights reserved.
29 */
30
31 #ifndef _SYS_LX_H
32 #define _SYS_LX_H
33
34 #include <stdio.h>
35 #include <alloca.h>
36 #include <dirent.h>
37 #include <sys/types.h>
38 #include <sys/param.h>
39 #include <sys/lwp.h>
40
41 #include <sys/lx_brand.h>
42 #include <sys/lx_thread.h>
43
44 #include <lx_errno.h>
45
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
49
50 extern char lx_release[LX_VERS_MAX];
51 extern char lx_cmd_name[MAXNAMLEN];
52 extern pid_t zoneinit_pid;
53
54 /*
55 * Values Linux expects for init
56 */
57 #define LX_INIT_PGID 1
58 #define LX_INIT_SID 1
59 #define LX_INIT_PID 1
60
61 /*
62 * Codes to reboot(2).
63 */
64 #define LINUX_REBOOT_MAGIC1 0xfee1dead
65 #define LINUX_REBOOT_MAGIC2 672274793
66 #define LINUX_REBOOT_MAGIC2A 85072278
67 #define LINUX_REBOOT_MAGIC2B 369367448
68 #define LINUX_REBOOT_MAGIC2C 537993216
69
70 /*
71 * This was observed as coming from Red Hat's init process, but it's not in
72 * their reboot(2) man page.
73 */
74 #define LINUX_REBOOT_MAGIC2D 0x28121969
75
76 #define LINUX_REBOOT_CMD_RESTART 0x1234567
77 #define LINUX_REBOOT_CMD_HALT 0xcdef0123
78 #define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc
79 #define LINUX_REBOOT_CMD_RESTART2 0xa1b2c3d4
80 #define LINUX_REBOOT_CMD_CAD_ON 0x89abcdef
81 #define LINUX_REBOOT_CMD_CAD_OFF 0
82
83 /*
84 * the maximum length of messages to be output with lx_msg(), lx_err(),
85 * lx_debug(), or lx_unsupported().
86 */
87 #define LX_MSG_MAXLEN (128 + MAXPATHLEN)
88
89 /*
90 * Linux scheduler priority ranges.
91 */
92 #define LX_SCHED_PRIORITY_MIN_OTHER 0
93 #define LX_SCHED_PRIORITY_MAX_OTHER 0
94 #define LX_SCHED_PRIORITY_MIN_RRFIFO 1
95 #define LX_SCHED_PRIORITY_MAX_RRFIFO 99
96
97 /*
98 * Constants to indicate who getrusage() should return information about.
99 */
100 #define LX_RUSAGE_SELF 0
101 #define LX_RUSAGE_CHILDREN (-1)
102 #define LX_RUSAGE_BOTH (-2)
103 #define LX_RUSAGE_THREAD 1
104
105 /*
106 * Based on code from brand_misc.h, but use of that is incompatible with the
107 * lx brand.
108 *
109 * These macros invoke a brandsys subcommand, B_TRUSS_POINT, which makes it
110 * easy to debug with DTrace.
111 */
112 #define B_TRUSS_POINT 6
113
114 #define B_TRACE_POINT_5(a0, a1, a2, a3, a4) \
115 (void) syscall(SYS_brand, B_TRUSS_POINT, (a0), (a1), (a2), (a3), (a4))
116
117 #define B_TRACE_POINT_4(a0, a1, a2, a3) \
118 B_TRACE_POINT_5((a0), (a1), (a2), (a3), 0)
119
120 #define B_TRACE_POINT_3(a0, a1, a2) \
121 B_TRACE_POINT_5((a0), (a1), (a2), 0, 0)
122
123 #define B_TRACE_POINT_2(a0, a1) \
124 B_TRACE_POINT_5((a0), (a1), 0, 0, 0)
125
126 #define B_TRACE_POINT_1(a0) \
127 B_TRACE_POINT_5((a0), 0, 0, 0, 0)
128
129 #define B_TRACE_POINT_0() \
130 B_TRACE_POINT_5(0, 0, 0, 0, 0)
131
132 /*
133 * Macros to access register state within a ucontext_t:
134 */
135 #define LX_REG(ucp, r) ((ucp)->uc_mcontext.gregs[(r)])
136
137 /*
138 * normally we never want to write to stderr or stdout because it's unsafe
139 * to make assumptions about the underlying file descriptors. to protect
140 * against writes to these file descriptors we go ahead and close them
141 * our brand process initalization code. but there are still occasions
142 * where we are willing to make assumptions about our file descriptors
143 * and write to them. at thes times we should use one lx_msg() or
144 * lx_msg_error()
145 */
146 extern void lx_msg(char *, ...);
147 extern void lx_err(char *, ...);
148 extern void lx_err_fatal(char *, ...);
149 extern void lx_unsupported(char *, ...);
150
151 struct ucontext;
152
153 extern ucontext_t *lx_syscall_regs(void);
154 extern uintptr_t lx_find_brand_sp(void);
155 extern const ucontext_t *lx_find_brand_uc(void);
156
157 extern char *lx_fd_to_path(int fd, char *buf, int buf_size);
158 extern int lx_lpid_to_spair(pid_t, pid_t *, lwpid_t *);
159 extern int lx_lpid_to_spid(pid_t, pid_t *);
160
161 extern void lx_ptrace_init();
162 extern int lx_ptrace_wait(siginfo_t *);
163 extern void lx_ptrace_fork(void);
164 extern void lx_ptrace_stop_if_option(int, boolean_t, ulong_t msg, ucontext_t *);
165 extern void lx_ptrace_clone_begin(int, boolean_t);
166
167 extern int lx_check_alloca(size_t);
168 #define SAFE_ALLOCA(sz) (lx_check_alloca(sz) ? alloca(sz) : NULL)
169
170 extern int ltos_at_flag(int lflag, int allow, boolean_t enforce);
171
172 extern void lx_init_tsd(lx_tsd_t *);
173 extern int lx_alloc_stack(void **, size_t *);
174 extern void lx_install_stack(void *, size_t, lx_tsd_t *);
175 extern void lx_free_stack(void);
176 extern void lx_free_other_stacks(void);
177 extern void lx_stack_prefork(void);
178 extern void lx_stack_postfork(void);
179
180 /*
181 * NO_UUCOPY disables calls to the uucopy* system calls to help with
182 * debugging brand library accesses to linux application memory.
183 */
184 #ifdef NO_UUCOPY
185
186 int uucopy_unsafe(const void *src, void *dst, size_t n);
187 int uucopystr_unsafe(const void *src, void *dst, size_t n);
188
189 #define uucopy(src, dst, n) uucopy_unsafe((src), (dst), (n))
190 #define uucopystr(src, dst, n) uucopystr_unsafe((src), (dst), (n))
191
192 #endif /* NO_UUCOPY */
193
194 /*
195 * We use these Private libc interfaces to defer signals during critical
196 * sections.
197 */
198 extern void _sigon(void);
199 extern void _sigoff(void);
200
201 #ifdef __cplusplus
202 }
203 #endif
204
205 #endif /* _SYS_LX_H */