2 * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
5 * Copyright (C) 1990, NeXT, Inc.
7 * File: next/kern_machdep.c
10 * Machine-specific kernel routines.
13 #include <sys/types.h>
14 #include <mach/machine.h>
15 #include <kern/cpu_number.h>
16 #include <machine/exec.h>
17 #include <pexpert/arm64/board_config.h>
20 extern int bootarg_no64exec
; /* bsd_init.c */
21 static cpu_subtype_t
cpu_subtype32(void);
22 #endif /* __arm64__ */
26 * When an arm64 CPU is executing an arm32 binary, we need to map from the
27 * host's 64-bit subtype to the appropriate 32-bit subtype.
32 switch (cpu_subtype()) {
33 case CPU_SUBTYPE_ARM64_V8
:
34 return CPU_SUBTYPE_ARM_V8
;
41 /**********************************************************************
42 * Routine: grade_binary()
44 * Function: Return a relative preference for exectypes and
45 * execsubtypes in fat executable files. The higher the
46 * grade, the higher the preference. A grade of 0 means
48 **********************************************************************/
50 grade_binary(cpu_type_t exectype
, cpu_subtype_t execsubtype
)
53 cpu_subtype_t hostsubtype
=
54 (exectype
& CPU_ARCH_ABI64
) ? cpu_subtype() : cpu_subtype32();
56 cpu_subtype_t hostsubtype
= cpu_subtype();
57 #endif /* __arm64__ */
62 if (bootarg_no64exec
) {
66 switch (hostsubtype
) {
67 case CPU_SUBTYPE_ARM64_V8
:
68 switch (execsubtype
) {
69 case CPU_SUBTYPE_ARM64_V8
:
71 case CPU_SUBTYPE_ARM64_ALL
:
76 } /* switch (hostsubtype) */
81 switch (hostsubtype
) {
83 * For 32-bit ARMv8, try the ARMv8 slice before falling back to Swift.
85 case CPU_SUBTYPE_ARM_V8
:
86 switch (execsubtype
) {
87 case CPU_SUBTYPE_ARM_V8
:
93 * For Swift and later, we prefer to run a swift slice, but fall back
94 * to v7 as Cortex A9 errata should not apply
97 case CPU_SUBTYPE_ARM_V7S
:
98 switch (execsubtype
) {
99 case CPU_SUBTYPE_ARM_V7S
:
105 * For Cortex A7, accept v7k only due to differing ABI
107 case CPU_SUBTYPE_ARM_V7K
:
108 switch (execsubtype
) {
109 case CPU_SUBTYPE_ARM_V7K
:
115 * For Cortex A9, we prefer the A9 slice, but will run v7 albeit
116 * under the risk of hitting the NEON load/store errata
118 case CPU_SUBTYPE_ARM_V7F
:
119 switch (execsubtype
) {
120 case CPU_SUBTYPE_ARM_V7F
:
126 case CPU_SUBTYPE_ARM_V7
:
127 switch (execsubtype
) {
128 case CPU_SUBTYPE_ARM_V7
:
133 case CPU_SUBTYPE_ARM_V6
:
134 switch (execsubtype
) {
135 case CPU_SUBTYPE_ARM_V6
:
140 case CPU_SUBTYPE_ARM_V5TEJ
:
141 switch (execsubtype
) {
142 case CPU_SUBTYPE_ARM_V5TEJ
:
147 case CPU_SUBTYPE_ARM_V4T
:
148 switch (execsubtype
) {
149 case CPU_SUBTYPE_ARM_V4T
:
151 case CPU_SUBTYPE_ARM_ALL
:
156 case CPU_SUBTYPE_ARM_XSCALE
:
157 switch (execsubtype
) {
158 case CPU_SUBTYPE_ARM_XSCALE
:
160 case CPU_SUBTYPE_ARM_V5TEJ
:
162 case CPU_SUBTYPE_ARM_V4T
:
164 case CPU_SUBTYPE_ARM_ALL
:
169 #endif /* __arm64__ */
176 pie_required(cpu_type_t exectype
, cpu_subtype_t execsubtype
)
182 #endif /* __arm64__ */
185 switch (execsubtype
) {
186 case CPU_SUBTYPE_ARM_V7K
: