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 */ 27 28#ifndef _SYS_ISA_DEFS_H 29#define _SYS_ISA_DEFS_H 30 31/* 32 * This header file serves to group a set of well known defines and to 33 * set these for each instruction set architecture. These defines may 34 * be divided into two groups; characteristics of the processor and 35 * implementation choices for Solaris on a processor. 36 * 37 * Processor Characteristics: 38 * 39 * _LITTLE_ENDIAN / _BIG_ENDIAN: 40 * The natural byte order of the processor. A pointer to an int points 41 * to the least/most significant byte of that int. 42 * 43 * _STACK_GROWS_UPWARD / _STACK_GROWS_DOWNWARD: 44 * The processor specific direction of stack growth. A push onto the 45 * stack increases/decreases the stack pointer, so it stores data at 46 * successively higher/lower addresses. (Stackless machines ignored 47 * without regrets). 48 * 49 * _LONG_LONG_HTOL / _LONG_LONG_LTOH: 50 * A pointer to a long long points to the most/least significant long 51 * within that long long. 52 * 53 * _BIT_FIELDS_HTOL / _BIT_FIELDS_LTOH: 54 * The C compiler assigns bit fields from the high/low to the low/high end 55 * of an int (most to least significant vs. least to most significant). 56 * 57 * _IEEE_754: 58 * The processor (or supported implementations of the processor) 59 * supports the ieee-754 floating point standard. No other floating 60 * point standards are supported (or significant). Any other supported 61 * floating point formats are expected to be cased on the ISA processor 62 * symbol. 63 * 64 * _CHAR_IS_UNSIGNED / _CHAR_IS_SIGNED: 65 * The C Compiler implements objects of type `char' as `unsigned' or 66 * `signed' respectively. This is really an implementation choice of 67 * the compiler writer, but it is specified in the ABI and tends to 68 * be uniform across compilers for an instruction set architecture. 69 * Hence, it has the properties of a processor characteristic. 70 * 71 * _CHAR_ALIGNMENT / _SHORT_ALIGNMENT / _INT_ALIGNMENT / _LONG_ALIGNMENT / 72 * _LONG_LONG_ALIGNMENT / _DOUBLE_ALIGNMENT / _LONG_DOUBLE_ALIGNMENT / 73 * _POINTER_ALIGNMENT / _FLOAT_ALIGNMENT: 74 * The ABI defines alignment requirements of each of the primitive 75 * object types. Some, if not all, may be hardware requirements as 76 * well. The values are expressed in "byte-alignment" units. 77 * 78 * _MAX_ALIGNMENT: 79 * The most stringent alignment requirement as specified by the ABI. 80 * Equal to the maximum of all the above _XXX_ALIGNMENT values. 81 * 82 * _ALIGNMENT_REQUIRED: 83 * True or false (1 or 0) whether or not the hardware requires the ABI 84 * alignment. 85 * 86 * _LONG_LONG_ALIGNMENT_32 87 * The 32-bit ABI supported by a 64-bit kernel may have different 88 * alignment requirements for primitive object types. The value of this 89 * identifier is expressed in "byte-alignment" units. 90 * 91 * _HAVE_CPUID_INSN 92 * This indicates that the architecture supports the 'cpuid' 93 * instruction as defined by Intel. (Intel allows other vendors 94 * to extend the instruction for their own purposes.) 95 * 96 * 97 * Implementation Choices: 98 * 99 * _ILP32 / _LP64: 100 * This specifies the compiler data type implementation as specified in 101 * the relevant ABI. The choice between these is strongly influenced 102 * by the underlying hardware, but is not absolutely tied to it. 103 * Currently only two data type models are supported: 104 * 105 * _ILP32: 106 * Int/Long/Pointer are 32 bits. This is the historical UNIX 107 * and Solaris implementation. Due to its historical standing, 108 * this is the default case. 109 * 110 * _LP64: 111 * Long/Pointer are 64 bits, Int is 32 bits. This is the chosen 112 * implementation for 64-bit ABIs such as SPARC V9. 113 * 114 * _I32LPx: 115 * A compilation environment where 'int' is 32-bit, and 116 * longs and pointers are simply the same size. 117 * 118 * In all cases, Char is 8 bits and Short is 16 bits. 119 * 120 * _SUNOS_VTOC_8 / _SUNOS_VTOC_16 / _SVR4_VTOC_16: 121 * This specifies the form of the disk VTOC (or label): 122 * 123 * _SUNOS_VTOC_8: 124 * This is a VTOC form which is upwardly compatible with the 125 * SunOS 4.x disk label and allows 8 partitions per disk. 126 * 127 * _SUNOS_VTOC_16: 128 * In this format the incore vtoc image matches the ondisk 129 * version. It allows 16 slices per disk, and is not 130 * compatible with the SunOS 4.x disk label. 131 * 132 * Note that these are not the only two VTOC forms possible and 133 * additional forms may be added. One possible form would be the 134 * SVr4 VTOC form. The symbol for that is reserved now, although 135 * it is not implemented. 136 * 137 * _SVR4_VTOC_16: 138 * This VTOC form is compatible with the System V Release 4 139 * VTOC (as implemented on the SVr4 Intel and 3b ports) with 140 * 16 partitions per disk. 141 * 142 * 143 * _DMA_USES_PHYSADDR / _DMA_USES_VIRTADDR 144 * This describes the type of addresses used by system DMA: 145 * 146 * _DMA_USES_PHYSADDR: 147 * This type of DMA, used in the x86 implementation, 148 * requires physical addresses for DMA buffers. The 24-bit 149 * addresses used by some legacy boards is the source of the 150 * "low-memory" (<16MB) requirement for some devices using DMA. 151 * 152 * _DMA_USES_VIRTADDR: 153 * This method of DMA allows the use of virtual addresses for 154 * DMA transfers. 155 * 156 * _FIRMWARE_NEEDS_FDISK / _NO_FDISK_PRESENT 157 * This indicates the presence/absence of an fdisk table. 158 * 159 * _FIRMWARE_NEEDS_FDISK 160 * The fdisk table is required by system firmware. If present, 161 * it allows a disk to be subdivided into multiple fdisk 162 * partitions, each of which is equivalent to a separate, 163 * virtual disk. This enables the co-existence of multiple 164 * operating systems on a shared hard disk. 165 * 166 * _NO_FDISK_PRESENT 167 * If the fdisk table is absent, it is assumed that the entire 168 * media is allocated for a single operating system. 169 * 170 * _HAVE_TEM_FIRMWARE 171 * Defined if this architecture has the (fallback) option of 172 * using prom_* calls for doing I/O if a suitable kernel driver 173 * is not available to do it. 174 * 175 * _DONT_USE_1275_GENERIC_NAMES 176 * Controls whether or not device tree node names should 177 * comply with the IEEE 1275 "Generic Names" Recommended 178 * Practice. With _DONT_USE_GENERIC_NAMES, device-specific 179 * names identifying the particular device will be used. 180 * 181 * __i386_COMPAT 182 * This indicates whether the i386 ABI is supported as a *non-native* 183 * mode for the platform. When this symbol is defined: 184 * - 32-bit xstat-style system calls are enabled 185 * - 32-bit xmknod-style system calls are enabled 186 * - 32-bit system calls use i386 sizes -and- alignments 187 * 188 * Note that this is NOT defined for the i386 native environment! 189 * 190 * __x86 191 * This is ONLY a synonym for defined(__i386) || defined(__amd64) 192 * which is useful only insofar as these two architectures share 193 * common attributes. Analogous to __sparc. 194 * 195 * _PSM_MODULES 196 * This indicates whether or not the implementation uses PSM 197 * modules for processor support, reading /etc/mach from inside 198 * the kernel to extract a list. 199 * 200 * _RTC_CONFIG 201 * This indicates whether or not the implementation uses /etc/rtc_config 202 * to configure the real-time clock in the kernel. 203 * 204 * _UNIX_KRTLD 205 * This indicates that the implementation uses a dynamically 206 * linked unix + krtld to form the core kernel image at boot 207 * time, or (in the absence of this symbol) a prelinked kernel image. 208 * 209 * _OBP 210 * This indicates the firmware interface is OBP. 211 * 212 * _SOFT_HOSTID 213 * This indicates that the implementation obtains the hostid 214 * from the file /etc/hostid, rather than from hardware. 215 */ 216 217#ifdef __cplusplus 218extern "C" { 219#endif 220 221/* 222 * The following set of definitions characterize Solaris on AMD's 223 * 64-bit systems. 224 */ 225#if defined(__x86_64) || defined(__amd64) 226 227#if !defined(__amd64) 228#define __amd64 /* preferred guard */ 229#endif 230 231#if !defined(__x86) 232#define __x86 233#endif 234 235/* 236 * Define the appropriate "processor characteristics" 237 */ 238#ifdef illumos 239#define _LITTLE_ENDIAN 240#endif 241#define _STACK_GROWS_DOWNWARD 242#define _LONG_LONG_LTOH 243#define _BIT_FIELDS_LTOH 244#define _IEEE_754 245#define _CHAR_IS_SIGNED 246#define _BOOL_ALIGNMENT 1 247#define _CHAR_ALIGNMENT 1 248#define _SHORT_ALIGNMENT 2 249#define _INT_ALIGNMENT 4 250#define _FLOAT_ALIGNMENT 4 251#define _FLOAT_COMPLEX_ALIGNMENT 4 252#define _LONG_ALIGNMENT 8 253#define _LONG_LONG_ALIGNMENT 8 254#define _DOUBLE_ALIGNMENT 8 255#define _DOUBLE_COMPLEX_ALIGNMENT 8 256#define _LONG_DOUBLE_ALIGNMENT 16 257#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 258#define _POINTER_ALIGNMENT 8 259#define _MAX_ALIGNMENT 16 260#define _ALIGNMENT_REQUIRED 1 261 262/* 263 * Different alignment constraints for the i386 ABI in compatibility mode 264 */ 265#define _LONG_LONG_ALIGNMENT_32 4 266 267/* 268 * Define the appropriate "implementation choices". 269 */ 270#if !defined(_LP64) 271#define _LP64 272#endif 273#if !defined(_I32LPx) && defined(_KERNEL) 274#define _I32LPx 275#endif 276#define _MULTI_DATAMODEL 277#define _SUNOS_VTOC_16 278#define _DMA_USES_PHYSADDR 279#define _FIRMWARE_NEEDS_FDISK 280#define __i386_COMPAT 281#define _PSM_MODULES 282#define _RTC_CONFIG 283#define _SOFT_HOSTID 284#define _DONT_USE_1275_GENERIC_NAMES 285#define _HAVE_CPUID_INSN 286 287/* 288 * The feature test macro __i386 is generic for all processors implementing 289 * the Intel 386 instruction set or a superset of it. Specifically, this 290 * includes all members of the 386, 486, and Pentium family of processors. 291 */ 292#elif defined(__i386) || defined(__i386__) 293 294#if !defined(__i386) 295#define __i386 296#endif 297 298#if !defined(__x86) 299#define __x86 300#endif 301 302/* 303 * Define the appropriate "processor characteristics" 304 */ 305#ifdef illumos 306#define _LITTLE_ENDIAN 307#endif 308#define _STACK_GROWS_DOWNWARD 309#define _LONG_LONG_LTOH 310#define _BIT_FIELDS_LTOH 311#define _IEEE_754 312#define _CHAR_IS_SIGNED 313#define _BOOL_ALIGNMENT 1 314#define _CHAR_ALIGNMENT 1 315#define _SHORT_ALIGNMENT 2 316#define _INT_ALIGNMENT 4 317#define _FLOAT_ALIGNMENT 4 318#define _FLOAT_COMPLEX_ALIGNMENT 4 319#define _LONG_ALIGNMENT 4 320#define _LONG_LONG_ALIGNMENT 4 321#define _DOUBLE_ALIGNMENT 4 322#define _DOUBLE_COMPLEX_ALIGNMENT 4 323#define _LONG_DOUBLE_ALIGNMENT 4 324#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 4 325#define _POINTER_ALIGNMENT 4 326#define _MAX_ALIGNMENT 4 327#define _ALIGNMENT_REQUIRED 0 328 329#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 330 331/* 332 * Define the appropriate "implementation choices". 333 */ 334#if !defined(_ILP32) 335#define _ILP32 336#endif 337#if !defined(_I32LPx) && defined(_KERNEL) 338#define _I32LPx 339#endif 340#define _SUNOS_VTOC_16 341#define _DMA_USES_PHYSADDR 342#define _FIRMWARE_NEEDS_FDISK 343#define _PSM_MODULES 344#define _RTC_CONFIG 345#define _SOFT_HOSTID 346#define _DONT_USE_1275_GENERIC_NAMES 347#define _HAVE_CPUID_INSN 348 349#elif defined(__aarch64__) 350 351/* 352 * Define the appropriate "processor characteristics" 353 */ 354#define _STACK_GROWS_DOWNWARD 355#define _LONG_LONG_LTOH 356#define _BIT_FIELDS_LTOH 357#define _IEEE_754 358#define _CHAR_IS_UNSIGNED 359#define _BOOL_ALIGNMENT 1 360#define _CHAR_ALIGNMENT 1 361#define _SHORT_ALIGNMENT 2 362#define _INT_ALIGNMENT 4 363#define _FLOAT_ALIGNMENT 4 364#define _FLOAT_COMPLEX_ALIGNMENT 4 365#define _LONG_ALIGNMENT 8 366#define _LONG_LONG_ALIGNMENT 8 367#define _DOUBLE_ALIGNMENT 8 368#define _DOUBLE_COMPLEX_ALIGNMENT 8 369#define _LONG_DOUBLE_ALIGNMENT 16 370#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 371#define _POINTER_ALIGNMENT 8 372#define _MAX_ALIGNMENT 16 373#define _ALIGNMENT_REQUIRED 1 374 375#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 376 377/* 378 * Define the appropriate "implementation choices" 379 */ 380#if !defined(_LP64) 381#define _LP64 382#endif 383#define _SUNOS_VTOC_16 384#define _DMA_USES_PHYSADDR 385#define _FIRMWARE_NEEDS_FDISK 386#define _PSM_MODULES 387#define _RTC_CONFIG 388#define _DONT_USE_1275_GENERIC_NAMES 389#define _HAVE_CPUID_INSN 390 391#elif defined(__riscv) 392 393/* 394 * Define the appropriate "processor characteristics" 395 */ 396#define _STACK_GROWS_DOWNWARD 397#define _LONG_LONG_LTOH 398#define _BIT_FIELDS_LTOH 399#define _IEEE_754 400#define _CHAR_IS_UNSIGNED 401#define _BOOL_ALIGNMENT 1 402#define _CHAR_ALIGNMENT 1 403#define _SHORT_ALIGNMENT 2 404#define _INT_ALIGNMENT 4 405#define _FLOAT_ALIGNMENT 4 406#define _FLOAT_COMPLEX_ALIGNMENT 4 407#define _LONG_ALIGNMENT 8 408#define _LONG_LONG_ALIGNMENT 8 409#define _DOUBLE_ALIGNMENT 8 410#define _DOUBLE_COMPLEX_ALIGNMENT 8 411#define _LONG_DOUBLE_ALIGNMENT 16 412#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 413#define _POINTER_ALIGNMENT 8 414#define _MAX_ALIGNMENT 16 415#define _ALIGNMENT_REQUIRED 1 416 417#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 418 419/* 420 * Define the appropriate "implementation choices" 421 */ 422#if !defined(_LP64) 423#define _LP64 424#endif 425#define _SUNOS_VTOC_16 426#define _DMA_USES_PHYSADDR 427#define _FIRMWARE_NEEDS_FDISK 428#define _PSM_MODULES 429#define _RTC_CONFIG 430#define _DONT_USE_1275_GENERIC_NAMES 431#define _HAVE_CPUID_INSN 432 433#elif defined(__arm__) 434 435/* 436 * Define the appropriate "processor characteristics" 437 */ 438#define _STACK_GROWS_DOWNWARD 439#define _LONG_LONG_LTOH 440#define _BIT_FIELDS_LTOH 441#define _IEEE_754 442#define _CHAR_IS_SIGNED 443#define _BOOL_ALIGNMENT 1 444#define _CHAR_ALIGNMENT 1 445#define _SHORT_ALIGNMENT 2 446#define _INT_ALIGNMENT 4 447#define _FLOAT_ALIGNMENT 4 448#define _FLOAT_COMPLEX_ALIGNMENT 4 449#define _LONG_ALIGNMENT 4 450#define _LONG_LONG_ALIGNMENT 4 451#define _DOUBLE_ALIGNMENT 4 452#define _DOUBLE_COMPLEX_ALIGNMENT 4 453#define _LONG_DOUBLE_ALIGNMENT 4 454#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 4 455#define _POINTER_ALIGNMENT 4 456#define _MAX_ALIGNMENT 4 457#define _ALIGNMENT_REQUIRED 0 458 459#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 460 461/* 462 * Define the appropriate "implementation choices". 463 */ 464#if !defined(_ILP32) 465#define _ILP32 466#endif 467#if !defined(_I32LPx) && defined(_KERNEL) 468#define _I32LPx 469#endif 470#define _SUNOS_VTOC_16 471#define _DMA_USES_PHYSADDR 472#define _FIRMWARE_NEEDS_FDISK 473#define _PSM_MODULES 474#define _RTC_CONFIG 475#define _DONT_USE_1275_GENERIC_NAMES 476#define _HAVE_CPUID_INSN 477 478#elif defined(__mips__) 479 480/* 481 * Define the appropriate "processor characteristics" 482 */ 483#define _STACK_GROWS_DOWNWARD 484#define _LONG_LONG_LTOH 485#define _BIT_FIELDS_LTOH 486#define _IEEE_754 487#define _CHAR_IS_SIGNED 488#define _BOOL_ALIGNMENT 1 489#define _CHAR_ALIGNMENT 1 490#define _SHORT_ALIGNMENT 2 491#define _INT_ALIGNMENT 4 492#define _FLOAT_ALIGNMENT 4 493#define _FLOAT_COMPLEX_ALIGNMENT 4 494#if defined(__mips_n64) 495#define _LONG_ALIGNMENT 8 496#define _LONG_LONG_ALIGNMENT 8 497#define _DOUBLE_ALIGNMENT 8 498#define _DOUBLE_COMPLEX_ALIGNMENT 8 499#define _LONG_DOUBLE_ALIGNMENT 8 500#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 8 501#define _POINTER_ALIGNMENT 8 502#define _MAX_ALIGNMENT 8 503#define _ALIGNMENT_REQUIRED 0 504 505#define _LONG_LONG_ALIGNMENT_32 _INT_ALIGNMENT 506/* 507 * Define the appropriate "implementation choices". 508 */ 509#if !defined(_LP64) 510#define _LP64 511#endif 512#else 513#define _LONG_ALIGNMENT 4 514#define _LONG_LONG_ALIGNMENT 4 515#define _DOUBLE_ALIGNMENT 4 516#define _DOUBLE_COMPLEX_ALIGNMENT 4 517#define _LONG_DOUBLE_ALIGNMENT 4 518#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 4 519#define _POINTER_ALIGNMENT 4 520#define _MAX_ALIGNMENT 4 521#define _ALIGNMENT_REQUIRED 0 522 523#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 524 525/* 526 * Define the appropriate "implementation choices". 527 */ 528#if !defined(_ILP32) 529#define _ILP32 530#endif 531#if !defined(_I32LPx) && defined(_KERNEL) 532#define _I32LPx 533#endif 534#endif 535#define _SUNOS_VTOC_16 536#define _DMA_USES_PHYSADDR 537#define _FIRMWARE_NEEDS_FDISK 538#define _PSM_MODULES 539#define _RTC_CONFIG 540#define _DONT_USE_1275_GENERIC_NAMES 541#define _HAVE_CPUID_INSN 542 543#elif defined(__powerpc__) 544 545#if defined(__BIG_ENDIAN__) 546#define _BIT_FIELDS_HTOL 547#else 548#define _BIT_FIELDS_LTOH 549#endif 550 551/* 552 * The following set of definitions characterize the Solaris on SPARC systems. 553 * 554 * The symbol __sparc indicates any of the SPARC family of processor 555 * architectures. This includes SPARC V7, SPARC V8 and SPARC V9. 556 * 557 * The symbol __sparcv8 indicates the 32-bit SPARC V8 architecture as defined 558 * by Version 8 of the SPARC Architecture Manual. (SPARC V7 is close enough 559 * to SPARC V8 for the former to be subsumed into the latter definition.) 560 * 561 * The symbol __sparcv9 indicates the 64-bit SPARC V9 architecture as defined 562 * by Version 9 of the SPARC Architecture Manual. 563 * 564 * The symbols __sparcv8 and __sparcv9 are mutually exclusive, and are only 565 * relevant when the symbol __sparc is defined. 566 */ 567/* 568 * XXX Due to the existence of 5110166, "defined(__sparcv9)" needs to be added 569 * to support backwards builds. This workaround should be removed in s10_71. 570 */ 571#elif defined(__sparc) || defined(__sparcv9) || defined(__sparc__) 572#if !defined(__sparc) 573#define __sparc 574#endif 575 576/* 577 * You can be 32-bit or 64-bit, but not both at the same time. 578 */ 579#if defined(__sparcv8) && defined(__sparcv9) 580#error "SPARC Versions 8 and 9 are mutually exclusive choices" 581#endif 582 583/* 584 * Existing compilers do not set __sparcv8. Years will transpire before 585 * the compilers can be depended on to set the feature test macro. In 586 * the interim, we'll set it here on the basis of historical behaviour; 587 * if you haven't asked for SPARC V9, then you must've meant SPARC V8. 588 */ 589#if !defined(__sparcv9) && !defined(__sparcv8) 590#define __sparcv8 591#endif 592 593/* 594 * Define the appropriate "processor characteristics" shared between 595 * all Solaris on SPARC systems. 596 */ 597#ifdef illumos 598#define _BIG_ENDIAN 599#endif 600#define _STACK_GROWS_DOWNWARD 601#define _LONG_LONG_HTOL 602#define _BIT_FIELDS_HTOL 603#define _IEEE_754 604#define _CHAR_IS_SIGNED 605#define _BOOL_ALIGNMENT 1 606#define _CHAR_ALIGNMENT 1 607#define _SHORT_ALIGNMENT 2 608#define _INT_ALIGNMENT 4 609#define _FLOAT_ALIGNMENT 4 610#define _FLOAT_COMPLEX_ALIGNMENT 4 611#define _LONG_LONG_ALIGNMENT 8 612#define _DOUBLE_ALIGNMENT 8 613#define _DOUBLE_COMPLEX_ALIGNMENT 8 614#define _ALIGNMENT_REQUIRED 1 615 616/* 617 * Define the appropriate "implementation choices" shared between versions. 618 */ 619#define _SUNOS_VTOC_8 620#define _DMA_USES_VIRTADDR 621#define _NO_FDISK_PRESENT 622#define _HAVE_TEM_FIRMWARE 623#define _OBP 624 625/* 626 * The following set of definitions characterize the implementation of 627 * 32-bit Solaris on SPARC V8 systems. 628 */ 629#if defined(__sparcv8) 630 631/* 632 * Define the appropriate "processor characteristics" 633 */ 634#define _LONG_ALIGNMENT 4 635#define _LONG_DOUBLE_ALIGNMENT 8 636#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 8 637#define _POINTER_ALIGNMENT 4 638#define _MAX_ALIGNMENT 8 639 640#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 641 642/* 643 * Define the appropriate "implementation choices" 644 */ 645#define _ILP32 646#if !defined(_I32LPx) && defined(_KERNEL) 647#define _I32LPx 648#endif 649 650/* 651 * The following set of definitions characterize the implementation of 652 * 64-bit Solaris on SPARC V9 systems. 653 */ 654#elif defined(__sparcv9) 655 656/* 657 * Define the appropriate "processor characteristics" 658 */ 659#define _LONG_ALIGNMENT 8 660#define _LONG_DOUBLE_ALIGNMENT 16 661#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 662#define _POINTER_ALIGNMENT 8 663#define _MAX_ALIGNMENT 16 664 665#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT 666 667/* 668 * Define the appropriate "implementation choices" 669 */ 670#if !defined(_LP64) 671#define _LP64 672#endif 673#if !defined(_I32LPx) 674#define _I32LPx 675#endif 676#define _MULTI_DATAMODEL 677 678#else 679#error "unknown SPARC version" 680#endif 681 682/* 683 * #error is strictly ansi-C, but works as well as anything for K&R systems. 684 */ 685#else 686#error "ISA not supported" 687#endif 688 689#if defined(_ILP32) && defined(_LP64) 690#error "Both _ILP32 and _LP64 are defined" 691#endif 692 693#ifdef __cplusplus 694} 695#endif 696 697#endif /* _SYS_ISA_DEFS_H */ 698