#include <sys/types.h>
#include <mach/machine.h>
#include <kern/cpu_number.h>
-
-extern int grade_binary(cpu_type_t exectype, cpu_subtype_t execsubtype);
+#include <machine/exec.h>
+#include <machine/machine_routines.h>
/**********************************************************************
* Routine: grade_binary()
*
- * Function: Return a relative preference for exectypes and
- * execsubtypes in fat executable files. The higher the
- * grade, the higher the preference. A grade of 0 means
- * not acceptable.
+ * Function: Keep the API the same between PPC and X86; always say
+ * any CPU subtype is OK with us, but only OK CPU types
+ * for which we are actually capable of executing the
+ * binary, either directly or via an imputed interpreter.
**********************************************************************/
int
-grade_binary(__unused cpu_type_t exectype, cpu_subtype_t execsubtype)
+grade_binary(cpu_type_t exectype, cpu_subtype_t execsubtype)
{
- int cpusubtype = cpu_subtype();
-
- switch (cpusubtype) {
- case CPU_SUBTYPE_386:
- switch (execsubtype) {
- case CPU_SUBTYPE_386:
- return 1;
- default:
- return 0;
- }
-
- case CPU_SUBTYPE_486:
- switch (execsubtype) {
- case CPU_SUBTYPE_386:
- return 1;
-
- case CPU_SUBTYPE_486SX:
- return 2;
-
- case CPU_SUBTYPE_486:
- return 3;
-
- default:
- return 0;
- }
-
- case CPU_SUBTYPE_486SX:
- switch (execsubtype) {
- case CPU_SUBTYPE_386:
- return 1;
-
- case CPU_SUBTYPE_486:
- return 2;
-
- case CPU_SUBTYPE_486SX:
- return 3;
-
- default:
- return 0;
- }
-
- case CPU_SUBTYPE_586:
- switch (execsubtype) {
- case CPU_SUBTYPE_386:
- return 1;
-
- case CPU_SUBTYPE_486SX:
- return 2;
-
- case CPU_SUBTYPE_486:
- return 3;
-
- case CPU_SUBTYPE_586:
- return 4;
-
- default:
- return 0;
- }
-
- default:
- if ( CPU_SUBTYPE_INTEL_MODEL(execsubtype) ==
- CPU_SUBTYPE_INTEL_MODEL_ALL) {
- if ( CPU_SUBTYPE_INTEL_FAMILY(cpusubtype) >=
- CPU_SUBTYPE_INTEL_FAMILY(execsubtype))
- return CPU_SUBTYPE_INTEL_FAMILY_MAX -
- CPU_SUBTYPE_INTEL_FAMILY(cpusubtype) -
- CPU_SUBTYPE_INTEL_FAMILY(execsubtype);
- }
- else {
- if ( cpusubtype == execsubtype)
- return CPU_SUBTYPE_INTEL_FAMILY_MAX + 1;
- }
+ switch(exectype) {
+ case CPU_TYPE_X86: /* native */
+ case CPU_TYPE_POWERPC: /* via translator */
+ return 1;
+ case CPU_TYPE_X86_64: /* native 64-bit */
+ return (ml_is64bit() && execsubtype == CPU_SUBTYPE_X86_64_ALL) ? 2 : 0;
+ default: /* all other binary types */
return 0;
}
}