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 https://opensource.org/licenses/CDDL-1.0. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 23 /* 24 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28 #ifndef _SYS_ISA_DEFS_H 29 #define _SYS_ISA_DEFS_H 30 #include <sys/endian.h> 31 32 /* 33 * This header file serves to group a set of well known defines and to 34 * set these for each instruction set architecture. These defines may 35 * be divided into two groups; characteristics of the processor and 36 * implementation choices for Solaris on a processor. 37 * 38 * Processor Characteristics: 39 * 40 * _LITTLE_ENDIAN / _BIG_ENDIAN: 41 * The natural byte order of the processor. A pointer to an int points 42 * to the least/most significant byte of that int. 43 * 44 * 45 * Implementation Choices: 46 * 47 * _ILP32 / _LP64: 48 * This specifies the compiler data type implementation as specified in 49 * the relevant ABI. The choice between these is strongly influenced 50 * by the underlying hardware, but is not absolutely tied to it. 51 * Currently only two data type models are supported: 52 * 53 * _ILP32: 54 * Int/Long/Pointer are 32 bits. This is the historical UNIX 55 * and Solaris implementation. Due to its historical standing, 56 * this is the default case. 57 * 58 * _LP64: 59 * Long/Pointer are 64 bits, Int is 32 bits. This is the chosen 60 * implementation for 64-bit ABIs such as SPARC V9. 61 * 62 * In all cases, Char is 8 bits and Short is 16 bits. 63 * 64 * _SUNOS_VTOC_8 / _SUNOS_VTOC_16 / _SVR4_VTOC_16: 65 * This specifies the form of the disk VTOC (or label): 66 * 67 * _SUNOS_VTOC_8: 68 * This is a VTOC form which is upwardly compatible with the 69 * SunOS 4.x disk label and allows 8 partitions per disk. 70 * 71 * _SUNOS_VTOC_16: 72 * In this format the incore vtoc image matches the ondisk 73 * version. It allows 16 slices per disk, and is not 74 * compatible with the SunOS 4.x disk label. 75 * 76 * Note that these are not the only two VTOC forms possible and 77 * additional forms may be added. One possible form would be the 78 * SVr4 VTOC form. The symbol for that is reserved now, although 79 * it is not implemented. 80 * 81 * _SVR4_VTOC_16: 82 * This VTOC form is compatible with the System V Release 4 83 * VTOC (as implemented on the SVr4 Intel and 3b ports) with 84 * 16 partitions per disk. 85 * 86 * 87 * __x86 88 * This is ONLY a synonym for defined(__i386) || defined(__amd64) 89 * which is useful only insofar as these two architectures share 90 * common attributes. Analogous to __sparc. 91 */ 92 93 #ifdef __cplusplus 94 extern "C" { 95 #endif 96 97 /* 98 * The following set of definitions characterize Solaris on AMD's 99 * 64-bit systems. 100 */ 101 #if defined(__x86_64) || defined(__amd64) 102 103 #if !defined(__amd64) 104 #define __amd64 /* preferred guard */ 105 #endif 106 107 #if !defined(__x86) 108 #define __x86 109 #endif 110 111 /* 112 * Define the appropriate "implementation choices". 113 */ 114 #if !defined(_LP64) 115 #error "_LP64 not defined" 116 #endif 117 #define _SUNOS_VTOC_16 118 119 /* 120 * The feature test macro __i386 is generic for all processors implementing 121 * the Intel 386 instruction set or a superset of it. Specifically, this 122 * includes all members of the 386, 486, and Pentium family of processors. 123 */ 124 #elif defined(__i386) || defined(__i386__) 125 126 #if !defined(__i386) 127 #define __i386 128 #endif 129 130 #if !defined(__x86) 131 #define __x86 132 #endif 133 134 /* 135 * Define the appropriate "implementation choices". 136 */ 137 #if !defined(_ILP32) 138 #define _ILP32 139 #endif 140 #define _SUNOS_VTOC_16 141 142 #elif defined(__aarch64__) 143 144 /* 145 * Define the appropriate "implementation choices" 146 */ 147 #if !defined(_LP64) 148 #error "_LP64 not defined" 149 #endif 150 #define _SUNOS_VTOC_16 151 152 #elif defined(__riscv) 153 154 /* 155 * Define the appropriate "implementation choices" 156 */ 157 #if !defined(_LP64) 158 #define _LP64 159 #endif 160 #define _SUNOS_VTOC_16 161 162 #elif defined(__arm__) 163 164 /* 165 * Define the appropriate "implementation choices". 166 */ 167 #if !defined(_ILP32) 168 #define _ILP32 169 #endif 170 #define _SUNOS_VTOC_16 171 172 #elif defined(__mips__) 173 174 #if defined(__mips_n64) 175 /* 176 * Define the appropriate "implementation choices". 177 */ 178 #if !defined(_LP64) 179 #error "_LP64 not defined" 180 #endif 181 #else 182 /* 183 * Define the appropriate "implementation choices". 184 */ 185 #if !defined(_ILP32) 186 #define _ILP32 187 #endif 188 #endif 189 #define _SUNOS_VTOC_16 190 191 #elif defined(__powerpc__) 192 193 #if !defined(__powerpc) 194 #define __powerpc 195 #endif 196 197 #define _SUNOS_VTOC_16 1 198 199 /* 200 * The following set of definitions characterize the Solaris on SPARC systems. 201 * 202 * The symbol __sparc indicates any of the SPARC family of processor 203 * architectures. This includes SPARC V7, SPARC V8 and SPARC V9. 204 * 205 * The symbol __sparcv8 indicates the 32-bit SPARC V8 architecture as defined 206 * by Version 8 of the SPARC Architecture Manual. (SPARC V7 is close enough 207 * to SPARC V8 for the former to be subsumed into the latter definition.) 208 * 209 * The symbol __sparcv9 indicates the 64-bit SPARC V9 architecture as defined 210 * by Version 9 of the SPARC Architecture Manual. 211 * 212 * The symbols __sparcv8 and __sparcv9 are mutually exclusive, and are only 213 * relevant when the symbol __sparc is defined. 214 */ 215 /* 216 * XXX Due to the existence of 5110166, "defined(__sparcv9)" needs to be added 217 * to support backwards builds. This workaround should be removed in s10_71. 218 */ 219 #elif defined(__sparc) || defined(__sparcv9) || defined(__sparc__) 220 #if !defined(__sparc) 221 #define __sparc 222 #endif 223 224 /* 225 * You can be 32-bit or 64-bit, but not both at the same time. 226 */ 227 #if defined(__sparcv8) && defined(__sparcv9) 228 #error "SPARC Versions 8 and 9 are mutually exclusive choices" 229 #endif 230 231 /* 232 * Existing compilers do not set __sparcv8. Years will transpire before 233 * the compilers can be depended on to set the feature test macro. In 234 * the interim, we'll set it here on the basis of historical behaviour; 235 * if you haven't asked for SPARC V9, then you must've meant SPARC V8. 236 */ 237 #if !defined(__sparcv9) && !defined(__sparcv8) 238 #define __sparcv8 239 #endif 240 241 /* 242 * Define the appropriate "implementation choices" shared between versions. 243 */ 244 #define _SUNOS_VTOC_8 245 246 /* 247 * The following set of definitions characterize the implementation of 248 * 32-bit Solaris on SPARC V8 systems. 249 */ 250 #if defined(__sparcv8) 251 252 /* 253 * Define the appropriate "implementation choices" 254 */ 255 #define _ILP32 256 257 /* 258 * The following set of definitions characterize the implementation of 259 * 64-bit Solaris on SPARC V9 systems. 260 */ 261 #elif defined(__sparcv9) 262 263 /* 264 * Define the appropriate "implementation choices" 265 */ 266 #if !defined(_LP64) 267 #error "_LP64 not defined" 268 #endif 269 270 #else 271 #error "unknown SPARC version" 272 #endif 273 274 /* 275 * #error is strictly ansi-C, but works as well as anything for K&R systems. 276 */ 277 #else 278 #error "ISA not supported" 279 #endif 280 281 #if defined(_ILP32) && defined(_LP64) 282 #error "Both _ILP32 and _LP64 are defined" 283 #endif 284 285 #if BYTE_ORDER == _BIG_ENDIAN 286 #define _ZFS_BIG_ENDIAN 287 #elif BYTE_ORDER == _LITTLE_ENDIAN 288 #define _ZFS_LITTLE_ENDIAN 289 #else 290 #error "unknown byte order" 291 #endif 292 293 #ifdef __cplusplus 294 } 295 #endif 296 297 #endif /* _SYS_ISA_DEFS_H */ 298