1/*
2 * Copyright 2009-2010, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _CONFIG_HAIKU_CONFIG_H
6#define _CONFIG_HAIKU_CONFIG_H
7
8
9/* Determine the architecture and define macros for some fundamental
10   properties:
11   __HAIKU_ARCH					- short name of the architecture (used in paths)
12   __HAIKU_ARCH_ABI				- name of ABI (as in package architecture)
13   __HAIKU_ARCH_<arch>			- defined to 1 for the respective architecture
14   __HAIKU_ARCH_BITS			- defined to 32/64 on 32/64 bit architectures
15   								  (defaults to 32)
16   __HAIKU_ARCH_PHYSICAL_BITS	- defined to 32/64 on architectures with 32/64
17   								  (defaults to __HAIKU_ARCH_BITS)
18   __HAIKU_BIG_ENDIAN			- defined to 1 on big endian architectures
19   								  (defaults to undefined)
20*/
21#ifdef __INTEL__
22#	define __HAIKU_ARCH					x86
23#	if __GNUC__ == 2
24#		define __HAIKU_ARCH_ABI			"x86_gcc2"
25#	else
26#		define __HAIKU_ARCH_ABI			"x86"
27#	endif
28#	define __HAIKU_ARCH_X86				1
29#	define __HAIKU_ARCH_PHYSICAL_BITS	64
30#elif __x86_64__
31#	define __HAIKU_ARCH					x86_64
32#	define __HAIKU_ARCH_ABI				"x86_64"
33#	define __HAIKU_ARCH_X86_64			1
34#	define __HAIKU_ARCH_BITS			64
35#elif __POWERPC__
36#	define __HAIKU_ARCH					ppc
37#	define __HAIKU_ARCH_ABI				"ppc"
38#	define __HAIKU_ARCH_PPC				1
39#	define __HAIKU_ARCH_PHYSICAL_BITS	64
40#	define __HAIKU_BIG_ENDIAN			1
41#elif __M68K__
42#	define __HAIKU_ARCH					m68k
43#	define __HAIKU_ARCH_ABI				"m68k"
44#	define __HAIKU_ARCH_M68K			1
45#	define __HAIKU_BIG_ENDIAN			1
46#elif __MIPSEL__
47#	define __HAIKU_ARCH					mipsel
48#	define __HAIKU_ARCH_ABI				"mipsel"
49#	define __HAIKU_ARCH_MIPSEL			1
50#elif __ARM__
51#	define __HAIKU_ARCH					arm
52#	define __HAIKU_ARCH_ABI				"arm"
53#	define __HAIKU_ARCH_ARM				1
54#else
55#	error Unsupported architecture!
56#endif
57
58/* implied properties:
59   __HAIKU_ARCH_{32,64}_BIT		- defined to 1 on 32/64 bit architectures, i.e.
60   								  using 32/64 bit virtual addresses
61   __HAIKU_ARCH_PHYSICAL_BITS	- defined to 32/64 on architectures with 32/64
62   								  bit physical addresses
63   __HAIKU_ARCH_PHYSICAL_{32,64}_BIT - defined to 1 on architectures using 64
64   								  bit physical addresses
65   __HAIKU_BIG_ENDIAN			- defined to 1 on big endian architectures
66*/
67
68/* bitness */
69#ifndef __HAIKU_ARCH_BITS
70#	define __HAIKU_ARCH_BITS		32
71#endif
72
73#if __HAIKU_ARCH_BITS == 32
74#	define __HAIKU_ARCH_32_BIT		1
75#elif __HAIKU_ARCH_BITS == 64
76#	define __HAIKU_ARCH_64_BIT		1
77#else
78#	error Unsupported bitness!
79#endif
80
81/* physical bitness */
82#ifndef __HAIKU_ARCH_PHYSICAL_BITS
83#	define __HAIKU_ARCH_PHYSICAL_BITS	__HAIKU_ARCH_BITS
84#endif
85
86#if __HAIKU_ARCH_PHYSICAL_BITS == 32
87#	define __HAIKU_ARCH_PHYSICAL_32_BIT	1
88#elif __HAIKU_ARCH_PHYSICAL_BITS == 64
89#	define __HAIKU_ARCH_PHYSICAL_64_BIT	1
90#else
91#	error Unsupported physical bitness!
92#endif
93
94/* endianess */
95#ifndef __HAIKU_BIG_ENDIAN
96#	define	__HAIKU_LITTLE_ENDIAN	1
97#endif
98
99/* architecture specific include macros */
100#define __HAIKU_ARCH_HEADER(header)					<arch/__HAIKU_ARCH/header>
101#define __HAIKU_SUBDIR_ARCH_HEADER(subdir, header)	\
102	<subdir/arch/__HAIKU_ARCH/header>
103
104/* BeOS R5 binary compatibility (gcc 2 on x86) */
105#if defined(__HAIKU_ARCH_X86) && __GNUC__ == 2
106#	define __HAIKU_BEOS_COMPATIBLE	1
107#endif
108
109/* BeOS R5 compatible types */
110#ifndef __HAIKU_ARCH_64_BIT
111/*#ifdef __HAIKU_ARCH_X86*/
112	/* TODO: This should be "#ifdef __HAIKU_BEOS_COMPATIBLE", but this will
113	   break all gcc 4 C++ optional packages. I.e. switch that at a suitable
114	   time.
115	*/
116#	define __HAIKU_BEOS_COMPATIBLE_TYPES	1
117#endif
118
119
120#endif	/* _CONFIG_HAIKU_CONFIG_H */
121