tail head cat sleep
QR code linking to this page

Manual Pages  — ARCH

NAME

arch – Architecture-specific details

CONTENTS

DESCRIPTION

Differences between CPU architectures and platforms supported by FreeBSD .

Introduction

This document is a quick reference of key ABI details of FreeBSD architecture ports. For full details consult the processor-specific ABI supplement documentation.

If not explicitly mentioned, sizes are in bytes. The architecture details in this document apply to FreeBSD 10.0 and later, unless otherwise noted.

FreeBSD uses a flat address space. Variables of types unsigned long, uintptr_t, and size_t and pointers all have the same representation.

In order to maximize compatibility with future pointer integrity mechanisms, manipulations of pointers as integers should be performed via uintptr_t or intptr_t and no other types. In particular, long and ptrdiff_t should be avoided.

On some architectures, e.g. sparc64, powerpc and AIM variants of powerpc64, the kernel uses a separate address space. On other architectures, kernel and a user mode process share a single address space. The kernel is located at the highest addresses.

On each architecture, the main user mode thread's stack starts near the highest user address and grows down.

FreeBSD architecture support varies by release. This table shows the first FreeBSD release to support each architecture, and, for discontinued architectures, the final release.

Architecture Initial Release Final Release

alpha
3.2 6.4

amd64
5.1

arm
6.0

armeb
8.0

armv6
10.0

arm64
11.0

ia64
5.0 10.x

i386
1.0

mips
8.0

mipsel
9.0

mipselhf
12.0

mipshf
12.0

mipsn32
9.0

mips64
9.0

mips64el
9.0

mips64elhf
12.0

mips64hf
12.0

pc98
2.2 11.x

powerpc
6.0

powerpcspe
12.0

powerpc64
6.0

riscv64
12.0

riscv64sf
12.0

sparc64
5.0

Type sizes

All FreeBSD architectures use some variant of the ELF (see elf(5)) Application Binary Interface (ABI) for the machine processor. All supported ABIs can be divided into two groups:
ILP32 int, long, void * types machine representations all have 4-byte size.
LP64 int type machine representation uses 4 bytes, while long and void * are 8 bytes.
Compilers define the _LP64 symbol when compiling for an LP64 ABI.

Some machines support more that one FreeBSD ABI. Typically these are 64-bit machines, where the "native" LP64 execution environment is accompanied by the "legacy" ILP32 environment, which was historical 32-bit predecessor for 64-bit evolution. Examples are:
LP64 ILP32 counterpart
amd64 i386
powerpc64 powerpc
mips64* mips*
arm64 currently does not support execution of armv6 binaries, even if the CPU implements AArch32 execution state.

On all supported architectures:
Type Size

short
2

int
4

long
sizeof(void*)

long long
8

float
4

double
8
Integers are represented in two's complement. Alignment of integer and pointer types is natural, that is, the address of the variable must be congruent to zero modulo the type size. Most ILP32 ABIs, except arm, require only 4-byte alignment for 64-bit integers.

Machine-dependent type sizes:
Architecture void * long double time_t

amd64
8 16 8

arm
4 8 8

armeb
4 8 8

armv6
4 8 8

arm64
8 16 8

i386
4 12 4

mips
4 8 8

mipsel
4 8 8

mipselhf
4 8 8

mipshf
4 8 8

mipsn32
4 8 8

mips64
8 8 8

mips64el
8 8 8

mips64elhf
8 8 8

mips64hf
8 8 8

powerpc
4 8 4

powerpcspe
4 8 4

powerpc64
8 8 8

riscv64
8 16 8

riscv64sf
8 16 8

sparc64
8 16 8

time_t is 8 bytes on all supported architectures except i386 and 32-bit variants of powerpc.

Endianness and Char Signedness

Architecture Endianness char Signedness

amd64
little signed

arm
little unsigned

armeb
big unsigned

armv6
little unsigned

arm64
little unsigned

i386
little signed

mips
big signed

mipsel
little signed

mipselhf
little signed

mipshf
big signed

mipsn32
big signed

mips64
big signed

mips64el
little signed

mips64elhf
little signed

mips64hf
big signed

powerpc
big unsigned

powerpcspe
big unsigned

powerpc64
big unsigned

riscv64
little signed

riscv64sf
little signed

sparc64
big signed

Page Size

Architecture Page Sizes

amd64
4K, 2M, 1G

arm
4K

armeb
4K

armv6
4K, 1M

arm64
4K, 2M, 1G

i386
4K, 2M (PAE), 4M

mips
4K

mipsel
4K

mipselhf
4K

mipshf
4K

mipsn32
4K

mips64
4K

mips64el
4K

mips64elhf
4K

mips64hf
4K

powerpc
4K

powerpcspe
4K

powerpc64
4K

riscv64
4K

riscv64sf
4K

sparc64
8K

Floating Point

Architecture float, double long double

amd64
hard hard, 80 bit

arm
soft soft, double precision

armeb
soft soft, double precision

armv6
hard(1) hard, double precision

arm64
hard soft, quad precision

i386
hard hard, 80 bit

mips
soft identical to double

mipsel
soft identical to double

mipselhf
hard identical to double

mipshf
hard identical to double

mipsn32
soft identical to double

mips64
soft identical to double

mips64el
soft identical to double

mips64elhf
hard identical to double

mips64hf
hard identical to double

powerpc
hard hard, double precision

powerpcspe
hard hard, double precision

powerpc64
hard hard, double precision

riscv64
hard hard, double precision

riscv64sf
soft soft, double precision

sparc64
hard hard, quad precision

(1) Prior to FreeBSD 11.0, armv6 used the softfp ABI even though it supported only processors with a floating point unit.

Predefined Macros

The compiler provides a number of predefined macros. Some of these provide architecture-specific details and are explained below. Other macros, including those required by the language standard, are not included here.

The full set of predefined macros can be obtained with this command:

cc -x c -dM -E /dev/null

Common type size and endianness macros:
Macro Meaning
__LP64__ 64-bit (8-byte) long and pointer, 32-bit (4-byte) int
__ILP32__ 32-bit (4-byte) int, long and pointer
BYTE_ORDER Either BIG_ENDIAN or LITTLE_ENDIAN. PDP11_ENDIAN is not used on FreeBSD .

Architecture-specific macros:
Architecture Predefined macros

amd64
__amd64__, __x86_64__

arm
__arm__

armeb
__arm__

armv6
__arm__, __ARM_ARCH >= 6

arm64
__aarch64__

i386
__i386__

mips
__mips__, __MIPSEB__, __mips_o32

mipsel
__mips__, __mips_o32

mipselhf
__mips__, __mips_o32

mipshf
__mips__, __MIPSEB__, __mips_o32

mipsn32
__mips__, __MIPSEB__, __mips_n32

mips64
__mips__, __MIPSEB__, __mips_n64

mips64el
__mips__, __mips_n64

mips64elhf
__mips__, __mips_n64

mips64hf
__mips__, __MIPSEB__, __mips_n64

powerpc
__powerpc__

powerpcspe
__powerpc__, __SPE__

powerpc64
__powerpc__, __powerpc64__

riscv64
__riscv__, __riscv64

riscv64sf
__riscv__, __riscv64

sparc64
__sparc64__

SEE ALSO

src.conf(5), build(7)

HISTORY

An arch manual page appeared in FreeBSD 12 .

ARCH (7) May 16, 2017

tail head cat sleep
QR code linking to this page


Please direct any comments about this manual page service to Ben Bullock.