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 (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
24 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
25 */
26
27 #ifndef _S10_BRAND_H
28 #define _S10_BRAND_H
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #include <sys/brand.h>
35
36 #define S10_BRANDNAME "solaris10"
37
38 #define S10_VERSION_1 1
39 #define S10_VERSION S10_VERSION_1
40
41 #define S10_LIB_NAME "s10_brand.so.1"
42 #define S10_LINKER_NAME "ld.so.1"
43
44 #define S10_LIB32 BRAND_NATIVE_DIR "usr/lib/" S10_LIB_NAME
45 #define S10_LINKER32 "/lib/" S10_LINKER_NAME
46
47 #define S10_LIB64 BRAND_NATIVE_DIR "usr/lib/64/" S10_LIB_NAME
48 #define S10_LINKER64 "/lib/64/" S10_LINKER_NAME
49
50 #if defined(_LP64)
51 #define S10_LIB S10_LIB64
52 #define S10_LINKER S10_LINKER64
53 #else /* !_LP64 */
54 #define S10_LIB S10_LIB32
55 #define S10_LINKER S10_LINKER32
56 #endif /* !_LP64 */
57
58 /*
59 * Solaris 10 value of _SIGRTMIN, _SIGRTMAX, MAXSIG, NSIG
60 */
61 #define S10_SIGRTMIN 41
62 #define S10_SIGRTMAX 48
63 #define S10_MAXSIG 48
64 #define S10_NSIG 49
65
66 /*
67 * Brand system call subcodes. 0-127 are reserved for generic subcodes.
68 */
69 #define B_S10_PIDINFO 128
70 #define B_S10_NATIVE 130
71 #define B_S10_FSREGCORRECTION 131
72 #define B_S10_ISFDXATTRDIR 132
73
74 /*
75 * Versioning flags
76 *
77 * The first enum value must be zero. Place new enum values at the end of the
78 * list but before S10_NUM_EMUL_FEATURES, which must always come last.
79 * Enum values should start with "S10_FEATURE_" and be named after the
80 * fixes/backports that they represent. For example, an enum value representing
81 * a backport that changes a MNTFS ioctl could be named
82 * "S10_FEATURE_ALTERED_MNTFS_IOCTL".
83 */
84 enum s10_emulated_features {
85 S10_FEATURE_ALTERED_MNTFS_IOCTL,
86 S10_FEATURE_U9_ZFS_IOCTL, /* S10u9 ZFS ioctl changes */
87 S10_NUM_EMUL_FEATURES /* This must be the last entry! */
88 };
89
90 /*
91 * This string constant represents the path of the Solaris 10 directory
92 * containing emulation feature files.
93 */
94 #define S10_REQ_EMULATION_DIR "/usr/lib/brand/solaris10"
95
96 /*
97 * s10_brand_syscall_callback_common() needs to save 4 local registers so it
98 * can free them up for its own use.
99 */
100 #define S10_CPU_REG_SAVE_SIZE (sizeof (ulong_t) * 4)
101
102 /*
103 * S10 system call codes for S10 traps that have been removed or reassigned,
104 * or that are to be removed or reassigned after the dtrace syscall provider
105 * has been reengineered to deal properly with syscall::open (for example).
106 */
107 #define S10_SYS_forkall 2
108 #define S10_SYS_open 5
109 #define S10_SYS_wait 7
110 #define S10_SYS_creat 8
111 #define S10_SYS_link 9
112 #define S10_SYS_unlink 10
113 #define S10_SYS_exec 11
114 #define S10_SYS_mknod 14
115 #define S10_SYS_chmod 15
116 #define S10_SYS_chown 16
117 #define S10_SYS_stat 18
118 #define S10_SYS_umount 22
119 #define S10_SYS_fstat 28
120 #define S10_SYS_utime 30
121 #define S10_SYS_access 33
122 #define S10_SYS_dup 41
123 #define S10_SYS_pipe 42
124 #define S10_SYS_issetugid 75
125 #define S10_SYS_fsat 76
126 #define S10_SYS_rmdir 79
127 #define S10_SYS_mkdir 80
128 #define S10_SYS_poll 87
129 #define S10_SYS_lstat 88
130 #define S10_SYS_symlink 89
131 #define S10_SYS_readlink 90
132 #define S10_SYS_fchmod 93
133 #define S10_SYS_fchown 94
134 #define S10_SYS_xstat 123
135 #define S10_SYS_lxstat 124
136 #define S10_SYS_fxstat 125
137 #define S10_SYS_xmknod 126
138 #define S10_SYS_lchown 130
139 #define S10_SYS_rename 134
140 #define S10_SYS_fork1 143
141 #define S10_SYS_lwp_sema_wait 147
142 #define S10_SYS_utimes 154
143 #define S10_SYS_lwp_mutex_lock 169
144 #define S10_SYS_stat64 215
145 #define S10_SYS_lstat64 216
146 #define S10_SYS_fstat64 217
147 #define S10_SYS_creat64 224
148 #define S10_SYS_open64 225
149 #define S10_SYS_so_socket 230
150 #define S10_SYS_accept 234
151
152 /*
153 * solaris10-brand-specific attributes
154 * These must start at ZONE_ATTR_BRAND_ATTRS.
155 */
156 #define S10_EMUL_BITMAP ZONE_ATTR_BRAND_ATTRS
157
158 /*
159 * s10_emul_bitmap represents an emulation feature bitmap. Each constant
160 * in s10_emulated_features defines a bit index in this bitmap. If a bit is
161 * set, then the feature associated with the s10_emulated_features constant
162 * whose value is the bit's index is present in the associated zone's hosted
163 * Solaris 10 environment.
164 *
165 * NOTE: There must be at least one byte in the bitmap.
166 *
167 * We don't use the bitmap macros provided by usr/src/uts/common/sys/bitmap.h
168 * because they operate on ulong_t arrays. The size of a ulong_t depends on
169 * the data model in which the code that declares the ulong_t is compiled:
170 * four bytes on 32-bit architectures and eight bytes 64-bit architectures.
171 * If the kernel is 64-bit and a 32-bit process executes in a solaris10-
172 * branded zone, then if the process' emulation library, which is 32-bit,
173 * queries the kernel for the zone's emulation bitmap, then the kernel will
174 * refuse because the library will request a bitmap that's half as big
175 * as the bitmap the kernel provides. The 32-bit emulation library would need
176 * its own macros to define and operate on bitmaps with 64-bit array elements.
177 * Thus using the sys/bitmap.h macros is probably more troublesome than
178 * defining and using our own constants and macros for bitmap manipulations.
179 */
180 typedef uint8_t s10_emul_bitmap_t[(S10_NUM_EMUL_FEATURES >> 3) + 1];
181
182 #if defined(_KERNEL)
183
184 /* brand specific data */
185 typedef struct s10_zone_data {
186 /*
187 * emul_bitmap specifies the features that are present in the
188 * associated zone.
189 */
190 s10_emul_bitmap_t emul_bitmap;
191 } s10_zone_data_t;
192
193 void s10_brand_syscall_callback(void);
194 void s10_brand_syscall32_callback(void);
195
196 #if !defined(sparc)
197 void s10_brand_sysenter_callback(void);
198 #endif /* !sparc */
199
200 #if defined(__amd64)
201 void s10_brand_int91_callback(void);
202 #endif /* __amd64 */
203 #endif /* _KERNEL */
204
205 #ifdef __cplusplus
206 }
207 #endif
208
209 #endif /* _S10_BRAND_H */