xref: /illumos-gate/usr/src/uts/common/brand/solaris10/s10_brand.h (revision 4e567b4443d7a1680a7319275e5288eef2c92319)
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  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _S10_BRAND_H
27 #define	_S10_BRAND_H
28 
29 #ifdef	__cplusplus
30 extern "C" {
31 #endif
32 
33 #include <sys/types.h>
34 
35 #define	S10_BRANDNAME		"solaris10"
36 
37 #define	S10_VERSION_1		1
38 #define	S10_VERSION		S10_VERSION_1
39 
40 #define	S10_NATIVE_DIR		"/.SUNWnative/"
41 #define	S10_LIB_NAME		"s10_brand.so.1"
42 #define	S10_LINKER_NAME		"ld.so.1"
43 
44 #define	S10_LIB32		S10_NATIVE_DIR "usr/lib/" S10_LIB_NAME
45 #define	S10_LINKER32		"/lib/" S10_LINKER_NAME
46 #define	S10_NATIVE_LINKER32	S10_NATIVE_DIR "lib/" S10_LINKER_NAME
47 
48 #define	S10_LIB64		S10_NATIVE_DIR "usr/lib/64/" S10_LIB_NAME
49 #define	S10_LINKER64		"/lib/64/" S10_LINKER_NAME
50 #define	S10_NATIVE_LINKER64	S10_NATIVE_DIR "lib/64/" S10_LINKER_NAME
51 
52 #if defined(_LP64)
53 #define	S10_LIB		S10_LIB64
54 #define	S10_LINKER	S10_LINKER64
55 #else /* !_LP64 */
56 #define	S10_LIB		S10_LIB32
57 #define	S10_LINKER	S10_LINKER32
58 #endif /* !_LP64 */
59 
60 /*
61  * Solaris 10 value of _SIGRTMIN, _SIGRTMAX, MAXSIG, NSIG
62  */
63 #define	S10_SIGRTMIN	41
64 #define	S10_SIGRTMAX	48
65 #define	S10_MAXSIG	48
66 #define	S10_NSIG	49
67 
68 /*
69  * Brand system call subcodes.  0-127 are reserved for generic subcodes.
70  */
71 #define	B_S10_PIDINFO		128
72 #define	B_S10_TRUSS_POINT	129
73 #define	B_S10_NATIVE		130
74 #define	B_S10_FSREGCORRECTION	131
75 #define	B_S10_ISFDXATTRDIR	132
76 
77 /*
78  * Versioning flags
79  *
80  * The first enum value must be zero.  Place new enum values at the end of the
81  * list but before S10_NUM_EMUL_FEATURES, which must always come last.
82  * Enum values should start with "S10_FEATURE_" and be named after the
83  * fixes/backports that they represent.  For example, an enum value representing
84  * a backport that changes a MNTFS ioctl could be named
85  * "S10_FEATURE_ALTERED_MNTFS_IOCTL".
86  */
87 enum s10_emulated_features {
88 	S10_FEATURE_ALTERED_MNTFS_IOCTL,
89 	S10_FEATURE_U9_ZFS_IOCTL,	/* S10u9 ZFS ioctl changes */
90 	S10_NUM_EMUL_FEATURES		/* This must be the last entry! */
91 };
92 
93 /*
94  * This string constant represents the path of the Solaris 10 directory
95  * containing emulation feature files.
96  */
97 #define	S10_REQ_EMULATION_DIR	"/usr/lib/brand/solaris10"
98 
99 /*
100  * s10_brand_syscall_callback_common() needs to save 4 local registers so it
101  * can free them up for its own use.
102  */
103 #define	S10_CPU_REG_SAVE_SIZE	(sizeof (ulong_t) * 4)
104 
105 /*
106  * Aux vector containing lddata pointer of brand library linkmap.
107  * Used by s10_librtld_db.
108  */
109 #define	AT_SUN_BRAND_S10_LDDATA		AT_SUN_BRAND_AUX1
110 
111 /*
112  * S10 system call codes for S10 traps that have been removed or reassigned,
113  * or that are to be removed or reassigned after the dtrace syscall provider
114  * has been reengineered to deal properly with syscall::open (for example).
115  */
116 #define	S10_SYS_forkall		2
117 #define	S10_SYS_open		5
118 #define	S10_SYS_wait		7
119 #define	S10_SYS_creat		8
120 #define	S10_SYS_unlink		10
121 #define	S10_SYS_exec		11
122 #define	S10_SYS_chown		16
123 #define	S10_SYS_stat		18
124 #define	S10_SYS_umount		22
125 #define	S10_SYS_fstat		28
126 #define	S10_SYS_utime		30
127 #define	S10_SYS_access		33
128 #define	S10_SYS_dup		41
129 #define	S10_SYS_issetugid	75
130 #define	S10_SYS_fsat		76
131 #define	S10_SYS_rmdir		79
132 #define	S10_SYS_poll		87
133 #define	S10_SYS_lstat		88
134 #define	S10_SYS_fchown		94
135 #define	S10_SYS_xstat		123
136 #define	S10_SYS_lxstat		124
137 #define	S10_SYS_fxstat		125
138 #define	S10_SYS_xmknod		126
139 #define	S10_SYS_lchown		130
140 #define	S10_SYS_rename		134
141 #define	S10_SYS_fork1		143
142 #define	S10_SYS_lwp_sema_wait	147
143 #define	S10_SYS_utimes		154
144 #define	S10_SYS_lwp_mutex_lock	169
145 #define	S10_SYS_stat64		215
146 #define	S10_SYS_lstat64		216
147 #define	S10_SYS_fstat64		217
148 #define	S10_SYS_creat64		224
149 #define	S10_SYS_open64		225
150 
151 /*
152  * solaris10-brand-specific attributes
153  * These must start at ZONE_ATTR_BRAND_ATTRS.
154  */
155 #define	S10_EMUL_BITMAP		ZONE_ATTR_BRAND_ATTRS
156 
157 /*
158  * Information needed by the s10 library to launch an executable.
159  */
160 typedef struct s10_elf_data {
161 	ulong_t		sed_phdr;
162 	ulong_t		sed_phent;
163 	ulong_t		sed_phnum;
164 	ulong_t		sed_entry;
165 	ulong_t		sed_base;
166 	ulong_t		sed_ldentry;
167 	ulong_t		sed_lddata;
168 } s10_elf_data_t;
169 
170 /*
171  * Structure used to register a branded processes
172  */
173 typedef struct s10_brand_reg {
174 	uint_t		sbr_version;	/* version number */
175 	caddr_t		sbr_handler;	/* base address of handler */
176 } s10_brand_reg_t;
177 
178 /*
179  * s10_emul_bitmap represents an emulation feature bitmap.  Each constant
180  * in s10_emulated_features defines a bit index in this bitmap.  If a bit is
181  * set, then the feature associated with the s10_emulated_features constant
182  * whose value is the bit's index is present in the associated zone's hosted
183  * Solaris 10 environment.
184  *
185  * NOTE: There must be at least one byte in the bitmap.
186  *
187  * We don't use the bitmap macros provided by usr/src/uts/common/sys/bitmap.h
188  * because they operate on ulong_t arrays.  The size of a ulong_t depends on
189  * the data model in which the code that declares the ulong_t is compiled:
190  * four bytes on 32-bit architectures and eight bytes 64-bit architectures.
191  * If the kernel is 64-bit and a 32-bit process executes in a solaris10-
192  * branded zone, then if the process' emulation library, which is 32-bit,
193  * queries the kernel for the zone's emulation bitmap, then the kernel will
194  * refuse because the library will request a bitmap that's half as big
195  * as the bitmap the kernel provides.  The 32-bit emulation library would need
196  * its own macros to define and operate on bitmaps with 64-bit array elements.
197  * Thus using the sys/bitmap.h macros is probably more troublesome than
198  * defining and using our own constants and macros for bitmap manipulations.
199  */
200 typedef uint8_t s10_emul_bitmap_t[(S10_NUM_EMUL_FEATURES >> 3) + 1];
201 
202 #if defined(_KERNEL)
203 #if defined(_SYSCALL32)
204 typedef struct s10_elf_data32 {
205 	uint32_t	sed_phdr;
206 	uint32_t	sed_phent;
207 	uint32_t	sed_phnum;
208 	uint32_t	sed_entry;
209 	uint32_t	sed_base;
210 	uint32_t	sed_ldentry;
211 	uint32_t	sed_lddata;
212 } s10_elf_data32_t;
213 
214 typedef struct s10_brand_reg32 {
215 	uint32_t	sbr_version;	/* version number */
216 	caddr32_t	sbr_handler;	/* base address of handler */
217 } s10_brand_reg32_t;
218 #endif /* _SYSCALL32 */
219 
220 /*
221  * Information associated with all s10 branded processes
222  */
223 typedef struct s10_proc_data {
224 	caddr_t		spd_handler;	/* address of user-space handler */
225 	s10_elf_data_t	spd_elf_data;	/* ELF data for s10 application */
226 } s10_proc_data_t;
227 
228 /* brand specific data */
229 typedef struct s10_zone_data {
230 	/*
231 	 * emul_bitmap specifies the features that are present in the
232 	 * associated zone.
233 	 */
234 	s10_emul_bitmap_t	emul_bitmap;
235 } s10_zone_data_t;
236 
237 void s10_brand_syscall_callback(void);
238 void s10_brand_syscall32_callback(void);
239 
240 #if !defined(sparc)
241 void s10_brand_sysenter_callback(void);
242 #endif /* !sparc */
243 
244 #if defined(__amd64)
245 void s10_brand_int91_callback(void);
246 #endif /* __amd64 */
247 #endif /* _KERNEL */
248 
249 #ifdef	__cplusplus
250 }
251 #endif
252 
253 #endif	/* _S10_BRAND_H */
254