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 * 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 * Copyright 2016 Joyent, Inc. 27 */ 28 29 #ifndef _SYS_ISA_DEFS_H 30 #define _SYS_ISA_DEFS_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 * _STACK_GROWS_UPWARD / _STACK_GROWS_DOWNWARD: 45 * The processor specific direction of stack growth. A push onto the 46 * stack increases/decreases the stack pointer, so it stores data at 47 * successively higher/lower addresses. (Stackless machines ignored 48 * without regrets). 49 * 50 * _LONG_LONG_HTOL / _LONG_LONG_LTOH: 51 * A pointer to a long long points to the most/least significant long 52 * within that long long. 53 * 54 * _BIT_FIELDS_HTOL / _BIT_FIELDS_LTOH: 55 * The C compiler assigns bit fields from the high/low to the low/high end 56 * of an int (most to least significant vs. least to most significant). 57 * 58 * _IEEE_754: 59 * The processor (or supported implementations of the processor) 60 * supports the ieee-754 floating point standard. No other floating 61 * point standards are supported (or significant). Any other supported 62 * floating point formats are expected to be cased on the ISA processor 63 * symbol. 64 * 65 * _CHAR_IS_UNSIGNED / _CHAR_IS_SIGNED: 66 * The C Compiler implements objects of type `char' as `unsigned' or 67 * `signed' respectively. This is really an implementation choice of 68 * the compiler writer, but it is specified in the ABI and tends to 69 * be uniform across compilers for an instruction set architecture. 70 * Hence, it has the properties of a processor characteristic. 71 * 72 * _CHAR_ALIGNMENT / _SHORT_ALIGNMENT / _INT_ALIGNMENT / _LONG_ALIGNMENT / 73 * _LONG_LONG_ALIGNMENT / _DOUBLE_ALIGNMENT / _LONG_DOUBLE_ALIGNMENT / 74 * _POINTER_ALIGNMENT / _FLOAT_ALIGNMENT: 75 * The ABI defines alignment requirements of each of the primitive 76 * object types. Some, if not all, may be hardware requirements as 77 * well. The values are expressed in "byte-alignment" units. 78 * 79 * _MAX_ALIGNMENT: 80 * The most stringent alignment requirement as specified by the ABI. 81 * Equal to the maximum of all the above _XXX_ALIGNMENT values. 82 * 83 * _MAX_ALIGNMENT_TYPE: 84 * The name of the C type that has the value descried in _MAX_ALIGNMENT. 85 * 86 * _ALIGNMENT_REQUIRED: 87 * True or false (1 or 0) whether or not the hardware requires the ABI 88 * alignment. 89 * 90 * _LONG_LONG_ALIGNMENT_32 91 * The 32-bit ABI supported by a 64-bit kernel may have different 92 * alignment requirements for primitive object types. The value of this 93 * identifier is expressed in "byte-alignment" units. 94 * 95 * _HAVE_CPUID_INSN 96 * This indicates that the architecture supports the 'cpuid' 97 * instruction as defined by Intel. (Intel allows other vendors 98 * to extend the instruction for their own purposes.) 99 * 100 * _CACHE_LINE_SHIFT 101 * _CACHE_LINE_SIZE 102 * Compile time maximum cache line size for an architecture. 103 * 104 * Implementation Choices: 105 * 106 * _ILP32 / _LP64: 107 * This specifies the compiler data type implementation as specified in 108 * the relevant ABI. The choice between these is strongly influenced 109 * by the underlying hardware, but is not absolutely tied to it. 110 * Currently only two data type models are supported: 111 * 112 * _ILP32: 113 * Int/Long/Pointer are 32 bits. This is the historical UNIX 114 * and Solaris implementation. Due to its historical standing, 115 * this is the default case. 116 * 117 * _LP64: 118 * Long/Pointer are 64 bits, Int is 32 bits. This is the chosen 119 * implementation for 64-bit ABIs such as SPARC V9. 120 * 121 * NOTE: This header used to define _I32LPx, which expressed a compilation 122 * environment where 'int' is 32-bit, and 'long' and pointers are the same 123 * size (although that size is not specified). This was true for all 124 * compilation targets, making it of little value. Additionally, it was 125 * erroneously interpreted as implying that long/pointer were 64-bit. 126 * 127 * In all cases, Char is 8 bits and Short is 16 bits. 128 * 129 * _SUNOS_VTOC_8 / _SUNOS_VTOC_16 / _SVR4_VTOC_16: 130 * This specifies the form of the disk VTOC (or label): 131 * 132 * _SUNOS_VTOC_8: 133 * This is a VTOC form which is upwardly compatible with the 134 * SunOS 4.x disk label and allows 8 partitions per disk. 135 * 136 * _SUNOS_VTOC_16: 137 * In this format the incore vtoc image matches the ondisk 138 * version. It allows 16 slices per disk, and is not 139 * compatible with the SunOS 4.x disk label. 140 * 141 * Note that these are not the only two VTOC forms possible and 142 * additional forms may be added. One possible form would be the 143 * SVr4 VTOC form. The symbol for that is reserved now, although 144 * it is not implemented. 145 * 146 * _SVR4_VTOC_16: 147 * This VTOC form is compatible with the System V Release 4 148 * VTOC (as implemented on the SVr4 Intel and 3b ports) with 149 * 16 partitions per disk. 150 * 151 * 152 * _DMA_USES_PHYSADDR / _DMA_USES_VIRTADDR 153 * This describes the type of addresses used by system DMA: 154 * 155 * _DMA_USES_PHYSADDR: 156 * This type of DMA, used in the x86 implementation, 157 * requires physical addresses for DMA buffers. The 24-bit 158 * addresses used by some legacy boards is the source of the 159 * "low-memory" (<16MB) requirement for some devices using DMA. 160 * 161 * _DMA_USES_VIRTADDR: 162 * This method of DMA allows the use of virtual addresses for 163 * DMA transfers. 164 * 165 * _FIRMWARE_NEEDS_FDISK / _NO_FDISK_PRESENT 166 * This indicates the presence/absence of an fdisk table. 167 * 168 * _FIRMWARE_NEEDS_FDISK 169 * The fdisk table is required by system firmware. If present, 170 * it allows a disk to be subdivided into multiple fdisk 171 * partitions, each of which is equivalent to a separate, 172 * virtual disk. This enables the co-existence of multiple 173 * operating systems on a shared hard disk. 174 * 175 * _NO_FDISK_PRESENT 176 * If the fdisk table is absent, it is assumed that the entire 177 * media is allocated for a single operating system. 178 * 179 * _HAVE_TEM_FIRMWARE 180 * Defined if this architecture has the (fallback) option of 181 * using prom_* calls for doing I/O if a suitable kernel driver 182 * is not available to do it. 183 * 184 * _DONT_USE_1275_GENERIC_NAMES 185 * Controls whether or not device tree node names should 186 * comply with the IEEE 1275 "Generic Names" Recommended 187 * Practice. With _DONT_USE_GENERIC_NAMES, device-specific 188 * names identifying the particular device will be used. 189 * 190 * __i386_COMPAT 191 * This indicates whether the i386 ABI is supported as a *non-native* 192 * mode for the platform. When this symbol is defined: 193 * - 32-bit xstat-style system calls are enabled 194 * - 32-bit xmknod-style system calls are enabled 195 * - 32-bit system calls use i386 sizes -and- alignments 196 * 197 * Note that this is NOT defined for the i386 native environment! 198 * 199 * __x86 200 * This is ONLY a synonym for defined(__i386) || defined(__amd64) 201 * which is useful only insofar as these two architectures share 202 * common attributes. Analogous to __sparc. 203 * 204 * _PSM_MODULES 205 * This indicates whether or not the implementation uses PSM 206 * modules for processor support, reading /etc/mach from inside 207 * the kernel to extract a list. 208 * 209 * _RTC_CONFIG 210 * This indicates whether or not the implementation uses /etc/rtc_config 211 * to configure the real-time clock in the kernel. 212 * 213 * _UNIX_KRTLD 214 * This indicates that the implementation uses a dynamically 215 * linked unix + krtld to form the core kernel image at boot 216 * time, or (in the absence of this symbol) a prelinked kernel image. 217 * 218 * _OBP 219 * This indicates the firmware interface is OBP. 220 * 221 * _SOFT_HOSTID 222 * This indicates that the implementation obtains the hostid 223 * from the file /etc/hostid, rather than from hardware. 224 */ 225 226 #ifdef __cplusplus 227 extern "C" { 228 #endif 229 230 /* 231 * The following set of definitions characterize Solaris on AMD's 232 * 64-bit systems. 233 */ 234 #if defined(__x86_64) || defined(__amd64) 235 236 #if !defined(__amd64) 237 #define __amd64 /* preferred guard */ 238 #endif 239 240 #if !defined(__x86) 241 #define __x86 242 #endif 243 244 /* 245 * Define the appropriate "processor characteristics" 246 */ 247 #define _LITTLE_ENDIAN 248 #define _STACK_GROWS_DOWNWARD 249 #define _LONG_LONG_LTOH 250 #define _BIT_FIELDS_LTOH 251 #define _IEEE_754 252 #define _CHAR_IS_SIGNED 253 #define _BOOL_ALIGNMENT 1 254 #define _CHAR_ALIGNMENT 1 255 #define _SHORT_ALIGNMENT 2 256 #define _INT_ALIGNMENT 4 257 #define _FLOAT_ALIGNMENT 4 258 #define _FLOAT_COMPLEX_ALIGNMENT 4 259 #define _LONG_ALIGNMENT 8 260 #define _LONG_LONG_ALIGNMENT 8 261 #define _DOUBLE_ALIGNMENT 8 262 #define _DOUBLE_COMPLEX_ALIGNMENT 8 263 #define _LONG_DOUBLE_ALIGNMENT 16 264 #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 265 #define _POINTER_ALIGNMENT 8 266 #define _MAX_ALIGNMENT 16 267 #define _ALIGNMENT_REQUIRED 1 268 #define _MAX_ALIGNMENT_TYPE long double 269 #define _CACHE_LINE_SHIFT 6 270 #define _CACHE_LINE_SIZE (1 << _CACHE_LINE_SHIFT) 271 272 /* 273 * Different alignment constraints for the i386 ABI in compatibility mode 274 */ 275 #define _LONG_LONG_ALIGNMENT_32 4 276 277 /* 278 * Define the appropriate "implementation choices". 279 */ 280 #if !defined(_LP64) 281 #define _LP64 282 #endif 283 #define _MULTI_DATAMODEL 284 #define _SUNOS_VTOC_16 285 #define _DMA_USES_PHYSADDR 286 #define _FIRMWARE_NEEDS_FDISK 287 #define __i386_COMPAT 288 #define _PSM_MODULES 289 #define _RTC_CONFIG 290 #define _SOFT_HOSTID 291 #define _DONT_USE_1275_GENERIC_NAMES 292 #define _HAVE_CPUID_INSN 293 294 /* 295 * The feature test macro __i386 is generic for all processors implementing 296 * the Intel 386 instruction set or a superset of it. Specifically, this 297 * includes all members of the 386, 486, and Pentium family of processors. 298 */ 299 #elif defined(__i386) || defined(__i386__) 300 301 #if !defined(__i386) 302 #define __i386 303 #endif 304 305 #if !defined(__x86) 306 #define __x86 307 #endif 308 309 /* 310 * Define the appropriate "processor characteristics" 311 */ 312 #define _LITTLE_ENDIAN 313 #define _STACK_GROWS_DOWNWARD 314 #define _LONG_LONG_LTOH 315 #define _BIT_FIELDS_LTOH 316 #define _IEEE_754 317 #define _CHAR_IS_SIGNED 318 #define _BOOL_ALIGNMENT 1 319 #define _CHAR_ALIGNMENT 1 320 #define _SHORT_ALIGNMENT 2 321 #define _INT_ALIGNMENT 4 322 #define _FLOAT_ALIGNMENT 4 323 #define _FLOAT_COMPLEX_ALIGNMENT 4 324 #define _LONG_ALIGNMENT 4 325 #define _LONG_LONG_ALIGNMENT 4 326 #define _DOUBLE_ALIGNMENT 4 327 #define _DOUBLE_COMPLEX_ALIGNMENT 4 328 #define _LONG_DOUBLE_ALIGNMENT 4 329 #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 4 330 #define _POINTER_ALIGNMENT 4 331 #define _MAX_ALIGNMENT 4 332 #define _ALIGNMENT_REQUIRED 0 333 #define _MAX_ALIGNMENT_TYPE long 334 #define _CACHE_LINE_SHIFT 6 335 #define _CACHE_LINE_SIZE (1 << _CACHE_LINE_SHIFT) 336 337 #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 338 339 /* 340 * Define the appropriate "implementation choices". 341 */ 342 #if !defined(_ILP32) 343 #define _ILP32 344 #endif 345 #define _SUNOS_VTOC_16 346 #define _DMA_USES_PHYSADDR 347 #define _FIRMWARE_NEEDS_FDISK 348 #define _PSM_MODULES 349 #define _RTC_CONFIG 350 #define _SOFT_HOSTID 351 #define _DONT_USE_1275_GENERIC_NAMES 352 #define _HAVE_CPUID_INSN 353 354 /* 355 * The following set of definitions characterize the Solaris on SPARC systems. 356 * 357 * The symbol __sparc indicates any of the SPARC family of processor 358 * architectures. This includes SPARC V7, SPARC V8 and SPARC V9. 359 * 360 * The symbol __sparcv8 indicates the 32-bit SPARC V8 architecture as defined 361 * by Version 8 of the SPARC Architecture Manual. (SPARC V7 is close enough 362 * to SPARC V8 for the former to be subsumed into the latter definition.) 363 * 364 * The symbol __sparcv9 indicates the 64-bit SPARC V9 architecture as defined 365 * by Version 9 of the SPARC Architecture Manual. 366 * 367 * The symbols __sparcv8 and __sparcv9 are mutually exclusive, and are only 368 * relevant when the symbol __sparc is defined. 369 */ 370 /* 371 * XXX Due to the existence of 5110166, "defined(__sparcv9)" needs to be added 372 * to support backwards builds. This workaround should be removed in s10_71. 373 */ 374 #elif defined(__sparc) || defined(__sparcv9) || defined(__sparc__) 375 #if !defined(__sparc) 376 #define __sparc 377 #endif 378 379 /* 380 * You can be 32-bit or 64-bit, but not both at the same time. 381 */ 382 #if defined(__sparcv8) && defined(__sparcv9) 383 #error "SPARC Versions 8 and 9 are mutually exclusive choices" 384 #endif 385 386 /* 387 * Existing compilers do not set __sparcv8. Years will transpire before 388 * the compilers can be depended on to set the feature test macro. In 389 * the interim, we'll set it here on the basis of historical behaviour; 390 * if you haven't asked for SPARC V9, then you must've meant SPARC V8. 391 */ 392 #if !defined(__sparcv9) && !defined(__sparcv8) 393 #define __sparcv8 394 #endif 395 396 /* 397 * Define the appropriate "processor characteristics" shared between 398 * all Solaris on SPARC systems. 399 */ 400 #define _BIG_ENDIAN 401 #define _STACK_GROWS_DOWNWARD 402 #define _LONG_LONG_HTOL 403 #define _BIT_FIELDS_HTOL 404 #define _IEEE_754 405 #define _CHAR_IS_SIGNED 406 #define _BOOL_ALIGNMENT 1 407 #define _CHAR_ALIGNMENT 1 408 #define _SHORT_ALIGNMENT 2 409 #define _INT_ALIGNMENT 4 410 #define _FLOAT_ALIGNMENT 4 411 #define _FLOAT_COMPLEX_ALIGNMENT 4 412 #define _LONG_LONG_ALIGNMENT 8 413 #define _DOUBLE_ALIGNMENT 8 414 #define _DOUBLE_COMPLEX_ALIGNMENT 8 415 #define _ALIGNMENT_REQUIRED 1 416 417 /* 418 * Define the appropriate "implementation choices" shared between versions. 419 */ 420 #define _SUNOS_VTOC_8 421 #define _DMA_USES_VIRTADDR 422 #define _NO_FDISK_PRESENT 423 #define _HAVE_TEM_FIRMWARE 424 #define _OBP 425 426 /* 427 * The following set of definitions characterize the implementation of 428 * 32-bit Solaris on SPARC V8 systems. 429 */ 430 #if defined(__sparcv8) 431 432 /* 433 * Define the appropriate "processor characteristics" 434 */ 435 #define _LONG_ALIGNMENT 4 436 #define _LONG_DOUBLE_ALIGNMENT 8 437 #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 8 438 #define _POINTER_ALIGNMENT 4 439 #define _MAX_ALIGNMENT 8 440 #define _MAX_ALIGNMENT_TYPE long double 441 442 #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 443 444 /* 445 * Define the appropriate "implementation choices" 446 */ 447 #if !defined(_ILP32) 448 #define _ILP32 449 #endif 450 451 /* 452 * The following set of definitions characterize the implementation of 453 * 64-bit Solaris on SPARC V9 systems. 454 */ 455 #elif defined(__sparcv9) 456 457 /* 458 * Define the appropriate "processor characteristics" 459 */ 460 #define _LONG_ALIGNMENT 8 461 #define _LONG_DOUBLE_ALIGNMENT 16 462 #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 463 #define _POINTER_ALIGNMENT 8 464 #define _MAX_ALIGNMENT 16 465 #define _MAX_ALIGNMENT_TYPE long double 466 467 #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 468 469 /* 470 * Define the appropriate "implementation choices" 471 */ 472 #if !defined(_LP64) 473 #define _LP64 474 #endif 475 #define _MULTI_DATAMODEL 476 477 #else 478 #error "unknown SPARC version" 479 #endif 480 481 /* 482 * #error is strictly ansi-C, but works as well as anything for K&R systems. 483 */ 484 #else 485 #error "ISA not supported" 486 #endif 487 488 #if defined(_ILP32) && defined(_LP64) 489 #error "Both _ILP32 and _LP64 are defined" 490 #endif 491 492 #ifdef __cplusplus 493 } 494 #endif 495 496 #endif /* _SYS_ISA_DEFS_H */ 497