isa_defs.h revision 641:057d58d31499
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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
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 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef	_SYS_ISA_DEFS_H
28#define	_SYS_ISA_DEFS_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
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 * _ALIGNMENT_REQUIRED:
84 *	True or false (1 or 0) whether or not the hardware requires the ABI
85 *	alignment.
86 *
87 * _LONG_LONG_ALIGNMENT_32
88 *	The 32-bit ABI supported by a 64-bit kernel may have different
89 *	alignment requirements for primitive object types.  The value of this
90 *	identifier is expressed in "byte-alignment" units.
91 *
92 * _HAVE_CPUID_INSN
93 *	This indicates that the architecture supports the 'cpuid'
94 *	instruction as defined by Intel.  (Intel allows other vendors
95 *	to extend the instruction for their own purposes.)
96 *
97 *
98 * Implementation Choices:
99 *
100 * _ILP32 / _LP64:
101 *	This specifies the compiler data type implementation as specified in
102 *	the relevant ABI.  The choice between these is strongly influenced
103 *	by the underlying hardware, but is not absolutely tied to it.
104 *	Currently only two data type models are supported:
105 *
106 *	_ILP32:
107 *		Int/Long/Pointer are 32 bits.  This is the historical UNIX
108 *		and Solaris implementation.  Due to its historical standing,
109 *		this is the default case.
110 *
111 *	_LP64:
112 *		Long/Pointer are 64 bits, Int is 32 bits.  This is the chosen
113 *		implementation for 64-bit ABIs such as SPARC V9.
114 *
115 *	_I32LPx:
116 *		A compilation environment where 'int' is 32-bit, and
117 *		longs and pointers are simply the same size.
118 *
119 *	In all cases, Char is 8 bits and Short is 16 bits.
120 *
121 * _SUNOS_VTOC_8 / _SUNOS_VTOC_16 / _SVR4_VTOC_16:
122 *	This specifies the form of the disk VTOC (or label):
123 *
124 *	_SUNOS_VTOC_8:
125 *		This is a VTOC form which is upwardly compatible with the
126 *		SunOS 4.x disk label and allows 8 partitions per disk.
127 *
128 *	_SUNOS_VTOC_16:
129 *		In this format the incore vtoc image matches the ondisk
130 *		version.  It allows 16 slices per disk, and is not
131 *		compatible with the SunOS 4.x disk label.
132 *
133 *	Note that these are not the only two VTOC forms possible and
134 *	additional forms may be added.  One possible form would be the
135 *	SVr4 VTOC form.  The symbol for that is reserved now, although
136 *	it is not implemented.
137 *
138 *	_SVR4_VTOC_16:
139 *		This VTOC form is compatible with the System V Release 4
140 *		VTOC (as implemented on the SVr4 Intel and 3b ports) with
141 *		16 partitions per disk.
142 *
143 *
144 * _DMA_USES_PHYSADDR / _DMA_USES_VIRTADDR
145 *	This describes the type of addresses used by system DMA:
146 *
147 *	_DMA_USES_PHYSADDR:
148 *		This type of DMA, used in the x86 implementation,
149 *		requires physical addresses for DMA buffers.  The 24-bit
150 *		addresses used by some legacy boards is the source of the
151 *		"low-memory" (<16MB) requirement for some devices using DMA.
152 *
153 *	_DMA_USES_VIRTADDR:
154 *		This method of DMA allows the use of virtual addresses for
155 *		DMA transfers.
156 *
157 * _FIRMWARE_NEEDS_FDISK / _NO_FDISK_PRESENT
158 *      This indicates the presence/absence of an fdisk table.
159 *
160 *      _FIRMWARE_NEEDS_FDISK
161 *              The fdisk table is required by system firmware.  If present,
162 *              it allows a disk to be subdivided into multiple fdisk
163 *              partitions, each of which is equivalent to a separate,
164 *              virtual disk.  This enables the co-existence of multiple
165 *              operating systems on a shared hard disk.
166 *
167 *      _NO_FDISK_PRESENT
168 *              If the fdisk table is absent, it is assumed that the entire
169 *              media is allocated for a single operating system.
170 *
171 * _CONSOLE_OUTPUT_VIA_FIRMWARE / _CONSOLE_OUTPUT_VIA_SOFTWARE
172 *	This indicates whether framebuffer console output is done by
173 *	firmware or software.
174 *
175 *	_CONSOLE_OUTPUT_VIA_FIRMWARE
176 *		Framebuffer console output is done via prom_* calls.
177 *
178 *	_CONSOLE_OUTPUT_VIA_SOFTWARE
179 *		Framebuffer console output is done via the software
180 *		terminal emulator.
181 *	_DONT_USE_1275_GENERIC_NAMES
182 *		Controls whether or not device tree node names should
183 *		comply with the IEEE 1275 "Generic Names" Recommended
184 *		Practice. With _DONT_USE_GENERIC_NAMES, device-specific
185 *		names identifying the particular device will be used.
186 *
187 * __i386_COMPAT
188 *	This indicates whether the i386 ABI is supported as a *non-native*
189 *	mode for the platform.  When this symbol is defined:
190 *	-	32-bit xstat-style system calls are enabled
191 *	-	32-bit xmknod-style system calls are enabled
192 *	-	32-bit system calls use i386 sizes -and- alignments
193 *
194 *	Note that this is NOT defined for the i386 native environment!
195 *
196 * __x86
197 *	This is ONLY a synonym for defined(__i386) || defined(__amd64)
198 *	which is useful only insofar as these two architectures share
199 *	common attributes.  Analogous to __sparc.
200 *
201 * _PSM_MODULES
202 *	This indicates whether or not the implementation uses PSM
203 *	modules for processor support, reading /etc/mach from inside
204 *	the kernel to extract a list.
205 *
206 * _RTC_CONFIG
207 *	This indicates whether or not the implementation uses /etc/rtc_config
208 *	to configure the real-time clock in the kernel.
209 */
210
211#ifdef	__cplusplus
212extern "C" {
213#endif
214
215/*
216 * The following set of definitions characterize Solaris on AMD's
217 * 64-bit systems.
218 */
219#if defined(__x86_64) || defined(__amd64)
220
221#if !defined(__amd64)
222#define	__amd64		/* preferred guard */
223#endif
224
225#if !defined(__x86)
226#define	__x86
227#endif
228
229/*
230 * Define the appropriate "processor characteristics"
231 */
232#define	_LITTLE_ENDIAN
233#define	_STACK_GROWS_DOWNWARD
234#define	_LONG_LONG_LTOH
235#define	_BIT_FIELDS_LTOH
236#define	_IEEE_754
237#define	_CHAR_IS_SIGNED
238#define	_BOOL_ALIGNMENT			1
239#define	_CHAR_ALIGNMENT			1
240#define	_SHORT_ALIGNMENT		2
241#define	_INT_ALIGNMENT			4
242#define	_FLOAT_ALIGNMENT		4
243#define	_FLOAT_COMPLEX_ALIGNMENT	4
244#define	_LONG_ALIGNMENT			8
245#define	_LONG_LONG_ALIGNMENT		8
246#define	_DOUBLE_ALIGNMENT		8
247#define	_DOUBLE_COMPLEX_ALIGNMENT	8
248#define	_LONG_DOUBLE_ALIGNMENT		16
249#define	_LONG_DOUBLE_COMPLEX_ALIGNMENT	16
250#define	_POINTER_ALIGNMENT		8
251#define	_MAX_ALIGNMENT			16
252#define	_ALIGNMENT_REQUIRED		1
253
254/*
255 * Different alignment constraints for the i386 ABI in compatibility mode
256 */
257#define	_LONG_LONG_ALIGNMENT_32		4
258
259/*
260 * Define the appropriate "implementation choices".
261 */
262#if !defined(_LP64)
263#define	_LP64
264#endif
265#if !defined(_I32LPx) && defined(_KERNEL)
266#define	_I32LPx
267#endif
268#define	_MULTI_DATAMODEL
269#define	_SUNOS_VTOC_16
270#define	_DMA_USES_PHYSADDR
271#define	_FIRMWARE_NEEDS_FDISK
272#define	_CONSOLE_OUTPUT_VIA_SOFTWARE
273#define	__i386_COMPAT
274#define	_PSM_MODULES
275#define	_RTC_CONFIG
276#define	_DONT_USE_1275_GENERIC_NAMES
277#define	_HAVE_CPUID_INSN
278
279/*
280 * The feature test macro __i386 is generic for all processors implementing
281 * the Intel 386 instruction set or a superset of it.  Specifically, this
282 * includes all members of the 386, 486, and Pentium family of processors.
283 */
284#elif defined(__i386) || defined(__i386__)
285
286#if !defined(__i386)
287#define	__i386
288#endif
289
290#if !defined(__x86)
291#define	__x86
292#endif
293
294/*
295 * Define the appropriate "processor characteristics"
296 */
297#define	_LITTLE_ENDIAN
298#define	_STACK_GROWS_DOWNWARD
299#define	_LONG_LONG_LTOH
300#define	_BIT_FIELDS_LTOH
301#define	_IEEE_754
302#define	_CHAR_IS_SIGNED
303#define	_BOOL_ALIGNMENT			1
304#define	_CHAR_ALIGNMENT			1
305#define	_SHORT_ALIGNMENT		2
306#define	_INT_ALIGNMENT			4
307#define	_FLOAT_ALIGNMENT		4
308#define	_FLOAT_COMPLEX_ALIGNMENT	4
309#define	_LONG_ALIGNMENT			4
310#define	_LONG_LONG_ALIGNMENT		4
311#define	_DOUBLE_ALIGNMENT		4
312#define	_DOUBLE_COMPLEX_ALIGNMENT	4
313#define	_LONG_DOUBLE_ALIGNMENT		4
314#define	_LONG_DOUBLE_COMPLEX_ALIGNMENT	4
315#define	_POINTER_ALIGNMENT		4
316#define	_MAX_ALIGNMENT			4
317#define	_ALIGNMENT_REQUIRED		0
318
319#define	_LONG_LONG_ALIGNMENT_32		_LONG_LONG_ALIGNMENT
320
321/*
322 * Define the appropriate "implementation choices".
323 */
324#define	_ILP32
325#if !defined(_I32LPx) && defined(_KERNEL)
326#define	_I32LPx
327#endif
328#define	_SUNOS_VTOC_16
329#define	_DMA_USES_PHYSADDR
330#define	_FIRMWARE_NEEDS_FDISK
331#define	_CONSOLE_OUTPUT_VIA_SOFTWARE
332#define	_PSM_MODULES
333#define	_RTC_CONFIG
334#define	_DONT_USE_1275_GENERIC_NAMES
335#define	_HAVE_CPUID_INSN
336
337/*
338 * The following set of definitions characterize the Solaris on SPARC systems.
339 *
340 * The symbol __sparc indicates any of the SPARC family of processor
341 * architectures.  This includes SPARC V7, SPARC V8 and SPARC V9.
342 *
343 * The symbol __sparcv8 indicates the 32-bit SPARC V8 architecture as defined
344 * by Version 8 of the SPARC Architecture Manual.  (SPARC V7 is close enough
345 * to SPARC V8 for the former to be subsumed into the latter definition.)
346 *
347 * The symbol __sparcv9 indicates the 64-bit SPARC V9 architecture as defined
348 * by Version 9 of the SPARC Architecture Manual.
349 *
350 * The symbols __sparcv8 and __sparcv9 are mutually exclusive, and are only
351 * relevant when the symbol __sparc is defined.
352 */
353/*
354 * XXX Due to the existence of 5110166, "defined(__sparcv9)" needs to be added
355 * to support backwards builds.  This workaround should be removed in s10_71.
356 */
357#elif defined(__sparc) || defined(__sparcv9) || defined(__sparc__)
358#if !defined(__sparc)
359#define	__sparc
360#endif
361
362/*
363 * You can be 32-bit or 64-bit, but not both at the same time.
364 */
365#if defined(__sparcv8) && defined(__sparcv9)
366#error	"SPARC Versions 8 and 9 are mutually exclusive choices"
367#endif
368
369/*
370 * Existing compilers do not set __sparcv8.  Years will transpire before
371 * the compilers can be depended on to set the feature test macro. In
372 * the interim, we'll set it here on the basis of historical behaviour;
373 * if you haven't asked for SPARC V9, then you must've meant SPARC V8.
374 */
375#if !defined(__sparcv9) && !defined(__sparcv8)
376#define	__sparcv8
377#endif
378
379/*
380 * Define the appropriate "processor characteristics" shared between
381 * all Solaris on SPARC systems.
382 */
383#define	_BIG_ENDIAN
384#define	_STACK_GROWS_DOWNWARD
385#define	_LONG_LONG_HTOL
386#define	_BIT_FIELDS_HTOL
387#define	_IEEE_754
388#define	_CHAR_IS_SIGNED
389#define	_BOOL_ALIGNMENT			1
390#define	_CHAR_ALIGNMENT			1
391#define	_SHORT_ALIGNMENT		2
392#define	_INT_ALIGNMENT			4
393#define	_FLOAT_ALIGNMENT		4
394#define	_FLOAT_COMPLEX_ALIGNMENT	4
395#define	_LONG_LONG_ALIGNMENT		8
396#define	_DOUBLE_ALIGNMENT		8
397#define	_DOUBLE_COMPLEX_ALIGNMENT	8
398#define	_ALIGNMENT_REQUIRED		1
399
400/*
401 * Define the appropriate "implementation choices" shared between versions.
402 */
403#define	_SUNOS_VTOC_8
404#define	_DMA_USES_VIRTADDR
405#define	_NO_FDISK_PRESENT
406#define	_CONSOLE_OUTPUT_VIA_FIRMWARE
407
408/*
409 * The following set of definitions characterize the implementation of
410 * 32-bit Solaris on SPARC V8 systems.
411 */
412#if defined(__sparcv8)
413
414/*
415 * Define the appropriate "processor characteristics"
416 */
417#define	_LONG_ALIGNMENT			4
418#define	_LONG_DOUBLE_ALIGNMENT		8
419#define	_LONG_DOUBLE_COMPLEX_ALIGNMENT	8
420#define	_POINTER_ALIGNMENT		4
421#define	_MAX_ALIGNMENT			8
422
423#define	_LONG_LONG_ALIGNMENT_32		_LONG_LONG_ALIGNMENT
424
425/*
426 * Define the appropriate "implementation choices"
427 */
428#define	_ILP32
429#if !defined(_I32LPx) && defined(_KERNEL)
430#define	_I32LPx
431#endif
432
433/*
434 * The following set of definitions characterize the implementation of
435 * 64-bit Solaris on SPARC V9 systems.
436 */
437#elif defined(__sparcv9)
438
439/*
440 * Define the appropriate "processor characteristics"
441 */
442#define	_LONG_ALIGNMENT			8
443#define	_LONG_DOUBLE_ALIGNMENT		16
444#define	_LONG_DOUBLE_COMPLEX_ALIGNMENT	16
445#define	_POINTER_ALIGNMENT		8
446#define	_MAX_ALIGNMENT			16
447
448#define	_LONG_LONG_ALIGNMENT_32		_LONG_LONG_ALIGMENT
449
450/*
451 * Define the appropriate "implementation choices"
452 */
453#if !defined(_LP64)
454#define	_LP64
455#endif
456#if !defined(_I32LPx)
457#define	_I32LPx
458#endif
459#define	_MULTI_DATAMODEL
460
461#else
462#error	"unknown SPARC version"
463#endif
464
465/*
466 * #error is strictly ansi-C, but works as well as anything for K&R systems.
467 */
468#else
469#error "ISA not supported"
470#endif
471
472#if defined(_ILP32) && defined(_LP64)
473#error "Both _ILP32 and _LP64 are defined"
474#endif
475
476#ifdef	__cplusplus
477}
478#endif
479
480#endif	/* _SYS_ISA_DEFS_H */
481