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 */