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