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 __NetBSD__ |
218 | |
219 | #include <sys/cdefs.h> |
220 | |
221 | #ifdef _LP64 |
222 | __CTASSERT(sizeof(int) == 4); |
223 | __CTASSERT(sizeof(long) == 8); |
224 | __CTASSERT(sizeof(void *) == 8); |
225 | #else |
226 | /* |
227 | * For 64-bit architectures the compiler defines _LP64. All else in |
228 | * NetBSD is ILP32 for now. |
229 | */ |
230 | __CTASSERT(sizeof(int) == 4); |
231 | __CTASSERT(sizeof(long) == 4); |
232 | __CTASSERT(sizeof(void *) == 4); |
233 | #define _ILP32 1 |
234 | #endif |
235 | |
236 | #else /* __NetBSD__ */ |
237 | |
238 | #ifdef __cplusplus |
239 | extern "C" { |
240 | #endif |
241 | |
242 | /* |
243 | * The following set of definitions characterize Solaris on AMD's |
244 | * 64-bit systems. |
245 | */ |
246 | #if defined(__x86_64) || defined(__amd64) |
247 | |
248 | #if !defined(__amd64) |
249 | #define __amd64 /* preferred guard */ |
250 | #endif |
251 | |
252 | #if !defined(__x86) |
253 | #define __x86 |
254 | #endif |
255 | |
256 | /* |
257 | * Define the appropriate "processor characteristics" |
258 | */ |
259 | #ifdef illumos |
260 | #define _LITTLE_ENDIAN |
261 | #endif |
262 | #define _STACK_GROWS_DOWNWARD |
263 | #define _LONG_LONG_LTOH |
264 | #define _BIT_FIELDS_LTOH |
265 | #define _IEEE_754 |
266 | #define _CHAR_IS_SIGNED |
267 | #define _BOOL_ALIGNMENT 1 |
268 | #define _CHAR_ALIGNMENT 1 |
269 | #define _SHORT_ALIGNMENT 2 |
270 | #define _INT_ALIGNMENT 4 |
271 | #define _FLOAT_ALIGNMENT 4 |
272 | #define _FLOAT_COMPLEX_ALIGNMENT 4 |
273 | #define _LONG_ALIGNMENT 8 |
274 | #define _LONG_LONG_ALIGNMENT 8 |
275 | #define _DOUBLE_ALIGNMENT 8 |
276 | #define _DOUBLE_COMPLEX_ALIGNMENT 8 |
277 | #define _LONG_DOUBLE_ALIGNMENT 16 |
278 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 |
279 | #define _POINTER_ALIGNMENT 8 |
280 | #define _MAX_ALIGNMENT 16 |
281 | #define _ALIGNMENT_REQUIRED 1 |
282 | |
283 | /* |
284 | * Different alignment constraints for the i386 ABI in compatibility mode |
285 | */ |
286 | #define _LONG_LONG_ALIGNMENT_32 4 |
287 | |
288 | /* |
289 | * Define the appropriate "implementation choices". |
290 | */ |
291 | #if !defined(_LP64) |
292 | #define _LP64 |
293 | #endif |
294 | #if !defined(_I32LPx) && defined(_KERNEL) |
295 | #define _I32LPx |
296 | #endif |
297 | #define _MULTI_DATAMODEL |
298 | #define _SUNOS_VTOC_16 |
299 | #define _DMA_USES_PHYSADDR |
300 | #define _FIRMWARE_NEEDS_FDISK |
301 | #define __i386_COMPAT |
302 | #define _PSM_MODULES |
303 | #define _RTC_CONFIG |
304 | #define _SOFT_HOSTID |
305 | #define _DONT_USE_1275_GENERIC_NAMES |
306 | #define _HAVE_CPUID_INSN |
307 | |
308 | /* |
309 | * The feature test macro __i386 is generic for all processors implementing |
310 | * the Intel 386 instruction set or a superset of it. Specifically, this |
311 | * includes all members of the 386, 486, and Pentium family of processors. |
312 | */ |
313 | #elif defined(__i386) || defined(__i386__) |
314 | |
315 | #if !defined(__i386) |
316 | #define __i386 |
317 | #endif |
318 | |
319 | #if !defined(__x86) |
320 | #define __x86 |
321 | #endif |
322 | |
323 | /* |
324 | * Define the appropriate "processor characteristics" |
325 | */ |
326 | #ifdef illumos |
327 | #define _LITTLE_ENDIAN |
328 | #endif |
329 | #define _STACK_GROWS_DOWNWARD |
330 | #define _LONG_LONG_LTOH |
331 | #define _BIT_FIELDS_LTOH |
332 | #define _IEEE_754 |
333 | #define _CHAR_IS_SIGNED |
334 | #define _BOOL_ALIGNMENT 1 |
335 | #define _CHAR_ALIGNMENT 1 |
336 | #define _SHORT_ALIGNMENT 2 |
337 | #define _INT_ALIGNMENT 4 |
338 | #define _FLOAT_ALIGNMENT 4 |
339 | #define _FLOAT_COMPLEX_ALIGNMENT 4 |
340 | #define _LONG_ALIGNMENT 4 |
341 | #define _LONG_LONG_ALIGNMENT 4 |
342 | #define _DOUBLE_ALIGNMENT 4 |
343 | #define _DOUBLE_COMPLEX_ALIGNMENT 4 |
344 | #define _LONG_DOUBLE_ALIGNMENT 4 |
345 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 4 |
346 | #define _POINTER_ALIGNMENT 4 |
347 | #define _MAX_ALIGNMENT 4 |
348 | #define _ALIGNMENT_REQUIRED 0 |
349 | |
350 | #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT |
351 | |
352 | /* |
353 | * Define the appropriate "implementation choices". |
354 | */ |
355 | #if !defined(_ILP32) |
356 | #define _ILP32 |
357 | #endif |
358 | #if !defined(_I32LPx) && defined(_KERNEL) |
359 | #define _I32LPx |
360 | #endif |
361 | #define _SUNOS_VTOC_16 |
362 | #define _DMA_USES_PHYSADDR |
363 | #define _FIRMWARE_NEEDS_FDISK |
364 | #define _PSM_MODULES |
365 | #define _RTC_CONFIG |
366 | #define _SOFT_HOSTID |
367 | #define _DONT_USE_1275_GENERIC_NAMES |
368 | #define _HAVE_CPUID_INSN |
369 | |
370 | #elif defined(__aarch64__) |
371 | |
372 | /* |
373 | * Define the appropriate "processor characteristics" |
374 | */ |
375 | #define _STACK_GROWS_DOWNWARD |
376 | #define _LONG_LONG_LTOH |
377 | #define _BIT_FIELDS_LTOH |
378 | #define _IEEE_754 |
379 | #define _CHAR_IS_UNSIGNED |
380 | #define _BOOL_ALIGNMENT 1 |
381 | #define _CHAR_ALIGNMENT 1 |
382 | #define _SHORT_ALIGNMENT 2 |
383 | #define _INT_ALIGNMENT 4 |
384 | #define _FLOAT_ALIGNMENT 4 |
385 | #define _FLOAT_COMPLEX_ALIGNMENT 4 |
386 | #define _LONG_ALIGNMENT 8 |
387 | #define _LONG_LONG_ALIGNMENT 8 |
388 | #define _DOUBLE_ALIGNMENT 8 |
389 | #define _DOUBLE_COMPLEX_ALIGNMENT 8 |
390 | #define _LONG_DOUBLE_ALIGNMENT 16 |
391 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 |
392 | #define _POINTER_ALIGNMENT 8 |
393 | #define _MAX_ALIGNMENT 16 |
394 | #define _ALIGNMENT_REQUIRED 1 |
395 | |
396 | #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT |
397 | |
398 | /* |
399 | * Define the appropriate "implementation choices" |
400 | */ |
401 | #if !defined(_LP64) |
402 | #define _LP64 |
403 | #endif |
404 | #define _SUNOS_VTOC_16 |
405 | #define _DMA_USES_PHYSADDR |
406 | #define _FIRMWARE_NEEDS_FDISK |
407 | #define _PSM_MODULES |
408 | #define _RTC_CONFIG |
409 | #define _DONT_USE_1275_GENERIC_NAMES |
410 | #define _HAVE_CPUID_INSN |
411 | |
412 | #elif defined(__riscv__) |
413 | |
414 | /* |
415 | * Define the appropriate "processor characteristics" |
416 | */ |
417 | #define _STACK_GROWS_DOWNWARD |
418 | #define _LONG_LONG_LTOH |
419 | #define _BIT_FIELDS_LTOH |
420 | #define _IEEE_754 |
421 | #define _CHAR_IS_UNSIGNED |
422 | #define _BOOL_ALIGNMENT 1 |
423 | #define _CHAR_ALIGNMENT 1 |
424 | #define _SHORT_ALIGNMENT 2 |
425 | #define _INT_ALIGNMENT 4 |
426 | #define _FLOAT_ALIGNMENT 4 |
427 | #define _FLOAT_COMPLEX_ALIGNMENT 4 |
428 | #define _LONG_ALIGNMENT 8 |
429 | #define _LONG_LONG_ALIGNMENT 8 |
430 | #define _DOUBLE_ALIGNMENT 8 |
431 | #define _DOUBLE_COMPLEX_ALIGNMENT 8 |
432 | #define _LONG_DOUBLE_ALIGNMENT 16 |
433 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 |
434 | #define _POINTER_ALIGNMENT 8 |
435 | #define _MAX_ALIGNMENT 16 |
436 | #define _ALIGNMENT_REQUIRED 1 |
437 | |
438 | #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT |
439 | |
440 | /* |
441 | * Define the appropriate "implementation choices" |
442 | */ |
443 | #if !defined(_LP64) |
444 | #define _LP64 |
445 | #endif |
446 | #define _SUNOS_VTOC_16 |
447 | #define _DMA_USES_PHYSADDR |
448 | #define _FIRMWARE_NEEDS_FDISK |
449 | #define _PSM_MODULES |
450 | #define _RTC_CONFIG |
451 | #define _DONT_USE_1275_GENERIC_NAMES |
452 | #define _HAVE_CPUID_INSN |
453 | |
454 | #elif defined(__arm__) |
455 | |
456 | /* |
457 | * Define the appropriate "processor characteristics" |
458 | */ |
459 | #define _STACK_GROWS_DOWNWARD |
460 | #define _LONG_LONG_LTOH |
461 | #define _BIT_FIELDS_LTOH |
462 | #define _IEEE_754 |
463 | #define _CHAR_IS_SIGNED |
464 | #define _BOOL_ALIGNMENT 1 |
465 | #define _CHAR_ALIGNMENT 1 |
466 | #define _SHORT_ALIGNMENT 2 |
467 | #define _INT_ALIGNMENT 4 |
468 | #define _FLOAT_ALIGNMENT 4 |
469 | #define _FLOAT_COMPLEX_ALIGNMENT 4 |
470 | #define _LONG_ALIGNMENT 4 |
471 | #define _LONG_LONG_ALIGNMENT 4 |
472 | #define _DOUBLE_ALIGNMENT 4 |
473 | #define _DOUBLE_COMPLEX_ALIGNMENT 4 |
474 | #define _LONG_DOUBLE_ALIGNMENT 4 |
475 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 4 |
476 | #define _POINTER_ALIGNMENT 4 |
477 | #define _MAX_ALIGNMENT 4 |
478 | #define _ALIGNMENT_REQUIRED 0 |
479 | |
480 | #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT |
481 | |
482 | /* |
483 | * Define the appropriate "implementation choices". |
484 | */ |
485 | #if !defined(_ILP32) |
486 | #define _ILP32 |
487 | #endif |
488 | #if !defined(_I32LPx) && defined(_KERNEL) |
489 | #define _I32LPx |
490 | #endif |
491 | #define _SUNOS_VTOC_16 |
492 | #define _DMA_USES_PHYSADDR |
493 | #define _FIRMWARE_NEEDS_FDISK |
494 | #define _PSM_MODULES |
495 | #define _RTC_CONFIG |
496 | #define _DONT_USE_1275_GENERIC_NAMES |
497 | #define _HAVE_CPUID_INSN |
498 | |
499 | #elif defined(__mips__) |
500 | |
501 | /* |
502 | * Define the appropriate "processor characteristics" |
503 | */ |
504 | #define _STACK_GROWS_DOWNWARD |
505 | #define _LONG_LONG_LTOH |
506 | #define _BIT_FIELDS_LTOH |
507 | #define _IEEE_754 |
508 | #define _CHAR_IS_SIGNED |
509 | #define _BOOL_ALIGNMENT 1 |
510 | #define _CHAR_ALIGNMENT 1 |
511 | #define _SHORT_ALIGNMENT 2 |
512 | #define _INT_ALIGNMENT 4 |
513 | #define _FLOAT_ALIGNMENT 4 |
514 | #define _FLOAT_COMPLEX_ALIGNMENT 4 |
515 | #if defined(__mips_n64) |
516 | #define _LONG_ALIGNMENT 8 |
517 | #define _LONG_LONG_ALIGNMENT 8 |
518 | #define _DOUBLE_ALIGNMENT 8 |
519 | #define _DOUBLE_COMPLEX_ALIGNMENT 8 |
520 | #define _LONG_DOUBLE_ALIGNMENT 8 |
521 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 8 |
522 | #define _POINTER_ALIGNMENT 8 |
523 | #define _MAX_ALIGNMENT 8 |
524 | #define _ALIGNMENT_REQUIRED 0 |
525 | |
526 | #define _LONG_LONG_ALIGNMENT_32 _INT_ALIGNMENT |
527 | /* |
528 | * Define the appropriate "implementation choices". |
529 | */ |
530 | #if !defined(_LP64) |
531 | #define _LP64 |
532 | #endif |
533 | #else |
534 | #define _LONG_ALIGNMENT 4 |
535 | #define _LONG_LONG_ALIGNMENT 4 |
536 | #define _DOUBLE_ALIGNMENT 4 |
537 | #define _DOUBLE_COMPLEX_ALIGNMENT 4 |
538 | #define _LONG_DOUBLE_ALIGNMENT 4 |
539 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 4 |
540 | #define _POINTER_ALIGNMENT 4 |
541 | #define _MAX_ALIGNMENT 4 |
542 | #define _ALIGNMENT_REQUIRED 0 |
543 | |
544 | #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT |
545 | |
546 | /* |
547 | * Define the appropriate "implementation choices". |
548 | */ |
549 | #define _ILP32 |
550 | #if !defined(_I32LPx) && defined(_KERNEL) |
551 | #define _I32LPx |
552 | #endif |
553 | #endif |
554 | #define _SUNOS_VTOC_16 |
555 | #define _DMA_USES_PHYSADDR |
556 | #define _FIRMWARE_NEEDS_FDISK |
557 | #define _PSM_MODULES |
558 | #define _RTC_CONFIG |
559 | #define _DONT_USE_1275_GENERIC_NAMES |
560 | #define _HAVE_CPUID_INSN |
561 | |
562 | #elif defined(__powerpc__) |
563 | |
564 | #if defined(__BIG_ENDIAN__) |
565 | #define _BIT_FIELDS_HTOL |
566 | #else |
567 | #define _BIT_FIELDS_LTOH |
568 | #endif |
569 | |
570 | /* |
571 | * The following set of definitions characterize the Solaris on SPARC systems. |
572 | * |
573 | * The symbol __sparc indicates any of the SPARC family of processor |
574 | * architectures. This includes SPARC V7, SPARC V8 and SPARC V9. |
575 | * |
576 | * The symbol __sparcv8 indicates the 32-bit SPARC V8 architecture as defined |
577 | * by Version 8 of the SPARC Architecture Manual. (SPARC V7 is close enough |
578 | * to SPARC V8 for the former to be subsumed into the latter definition.) |
579 | * |
580 | * The symbol __sparcv9 indicates the 64-bit SPARC V9 architecture as defined |
581 | * by Version 9 of the SPARC Architecture Manual. |
582 | * |
583 | * The symbols __sparcv8 and __sparcv9 are mutually exclusive, and are only |
584 | * relevant when the symbol __sparc is defined. |
585 | */ |
586 | /* |
587 | * XXX Due to the existence of 5110166, "defined(__sparcv9)" needs to be added |
588 | * to support backwards builds. This workaround should be removed in s10_71. |
589 | */ |
590 | #elif defined(__sparc) || defined(__sparcv9) || defined(__sparc__) |
591 | #if !defined(__sparc) |
592 | #define __sparc |
593 | #endif |
594 | |
595 | /* |
596 | * You can be 32-bit or 64-bit, but not both at the same time. |
597 | */ |
598 | #if defined(__sparcv8) && defined(__sparcv9) |
599 | #error "SPARC Versions 8 and 9 are mutually exclusive choices" |
600 | #endif |
601 | |
602 | /* |
603 | * Existing compilers do not set __sparcv8. Years will transpire before |
604 | * the compilers can be depended on to set the feature test macro. In |
605 | * the interim, we'll set it here on the basis of historical behaviour; |
606 | * if you haven't asked for SPARC V9, then you must've meant SPARC V8. |
607 | */ |
608 | #if !defined(__sparcv9) && !defined(__sparcv8) |
609 | #define __sparcv8 |
610 | #endif |
611 | |
612 | /* |
613 | * Define the appropriate "processor characteristics" shared between |
614 | * all Solaris on SPARC systems. |
615 | */ |
616 | #ifdef illumos |
617 | #define _BIG_ENDIAN |
618 | #endif |
619 | #define _STACK_GROWS_DOWNWARD |
620 | #define _LONG_LONG_HTOL |
621 | #define _BIT_FIELDS_HTOL |
622 | #define _IEEE_754 |
623 | #define _CHAR_IS_SIGNED |
624 | #define _BOOL_ALIGNMENT 1 |
625 | #define _CHAR_ALIGNMENT 1 |
626 | #define _SHORT_ALIGNMENT 2 |
627 | #define _INT_ALIGNMENT 4 |
628 | #define _FLOAT_ALIGNMENT 4 |
629 | #define _FLOAT_COMPLEX_ALIGNMENT 4 |
630 | #define _LONG_LONG_ALIGNMENT 8 |
631 | #define _DOUBLE_ALIGNMENT 8 |
632 | #define _DOUBLE_COMPLEX_ALIGNMENT 8 |
633 | #define _ALIGNMENT_REQUIRED 1 |
634 | |
635 | /* |
636 | * Define the appropriate "implementation choices" shared between versions. |
637 | */ |
638 | #define _SUNOS_VTOC_8 |
639 | #define _DMA_USES_VIRTADDR |
640 | #define _NO_FDISK_PRESENT |
641 | #define _HAVE_TEM_FIRMWARE |
642 | #define _OBP |
643 | |
644 | /* |
645 | * The following set of definitions characterize the implementation of |
646 | * 32-bit Solaris on SPARC V8 systems. |
647 | */ |
648 | #if defined(__sparcv8) |
649 | |
650 | /* |
651 | * Define the appropriate "processor characteristics" |
652 | */ |
653 | #define _LONG_ALIGNMENT 4 |
654 | #define _LONG_DOUBLE_ALIGNMENT 8 |
655 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 8 |
656 | #define _POINTER_ALIGNMENT 4 |
657 | #define _MAX_ALIGNMENT 8 |
658 | |
659 | #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT |
660 | |
661 | /* |
662 | * Define the appropriate "implementation choices" |
663 | */ |
664 | #define _ILP32 |
665 | #if !defined(_I32LPx) && defined(_KERNEL) |
666 | #define _I32LPx |
667 | #endif |
668 | |
669 | /* |
670 | * The following set of definitions characterize the implementation of |
671 | * 64-bit Solaris on SPARC V9 systems. |
672 | */ |
673 | #elif defined(__sparcv9) |
674 | |
675 | /* |
676 | * Define the appropriate "processor characteristics" |
677 | */ |
678 | #define _LONG_ALIGNMENT 8 |
679 | #define _LONG_DOUBLE_ALIGNMENT 16 |
680 | #define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16 |
681 | #define _POINTER_ALIGNMENT 8 |
682 | #define _MAX_ALIGNMENT 16 |
683 | |
684 | #define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT |
685 | |
686 | /* |
687 | * Define the appropriate "implementation choices" |
688 | */ |
689 | #if !defined(_LP64) |
690 | #define _LP64 |
691 | #endif |
692 | #if !defined(_I32LPx) |
693 | #define _I32LPx |
694 | #endif |
695 | #define _MULTI_DATAMODEL |
696 | |
697 | #else |
698 | #error "unknown SPARC version" |
699 | #endif |
700 | |
701 | /* |
702 | * #error is strictly ansi-C, but works as well as anything for K&R systems. |
703 | */ |
704 | #else |
705 | #error "ISA not supported" |
706 | #endif |
707 | |
708 | #if defined(_ILP32) && defined(_LP64) |
709 | #error "Both _ILP32 and _LP64 are defined" |
710 | #endif |
711 | |
712 | #ifdef __cplusplus |
713 | } |
714 | #endif |
715 | |
716 | #endif /* __NetBSD__ */ |
717 | |
718 | #endif /* _SYS_ISA_DEFS_H */ |
719 | |