X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..8a3053a07cee346dca737a5670e546fd26a7c9d6:/bsd/kern/mach_fat.c diff --git a/bsd/kern/mach_fat.c b/bsd/kern/mach_fat.c index 9a75e6861..acac3b819 100644 --- a/bsd/kern/mach_fat.c +++ b/bsd/kern/mach_fat.c @@ -35,11 +35,12 @@ #include #include #include +#include #include #include /********************************************************************** - * Routine: fatfile_getarch2() + * Routine: fatfile_getarch() * * Function: Locate the architecture-dependant contents of a fat * file that match this CPU. @@ -56,7 +57,7 @@ * KERN_FAILURE: No valid architecture found. **********************************************************************/ static load_return_t -fatfile_getarch2( +fatfile_getarch( #if 0 struct vnode *vp, #else @@ -110,22 +111,16 @@ fatfile_getarch2( * only PAGE_SIZE bytes */ if (end_of_archs > PAGE_SIZE || - end_of_archs < (sizeof(struct fat_header)+sizeof(struct fat_arch))) + end_of_archs < (off_t)(sizeof(struct fat_header)+sizeof(struct fat_arch))) return(LOAD_BADMACHO); /* * Round size of fat_arch structures up to page boundry. */ - size = round_page_32(end_of_archs); + size = round_page(end_of_archs); if (size == 0) return(LOAD_BADMACHO); - /* - * Ignore LIB64 flag so that binary slices with the flag set - * don't choke in grade_binary. - */ - mask_bits |= CPU_SUBTYPE_LIB64; - /* * Scan the fat_arch's looking for the best one. */ addr = data_ptr; @@ -133,29 +128,20 @@ fatfile_getarch2( best_grade = 0; arch = (struct fat_arch *) (addr + sizeof(struct fat_header)); for (; nfat_arch-- > 0; arch++) { - - /* - * Collect flags from both cputype and cpusubtype - */ - testtype = OSSwapBigToHostInt32(arch->cputype) | - (OSSwapBigToHostInt32(arch->cpusubtype) & - CPU_SUBTYPE_MASK); - testsubtype = OSSwapBigToHostInt32(arch->cpusubtype) - & ~CPU_SUBTYPE_MASK; + testtype = OSSwapBigToHostInt32(arch->cputype); + testsubtype = OSSwapBigToHostInt32(arch->cpusubtype) & ~CPU_SUBTYPE_MASK; /* * Check to see if right cpu type. */ - if((testtype & ~mask_bits) != req_cpu_type) { + if((testtype & ~mask_bits) != (req_cpu_type & ~mask_bits)) { continue; } /* * Get the grade of the cpu subtype (without feature flags) */ - grade = grade_binary( - (testtype & ~CPU_SUBTYPE_LIB64), - testsubtype); + grade = grade_binary(testtype, testsubtype); /* * Remember it if it's the best we've seen. @@ -197,54 +183,13 @@ fatfile_getarch_affinity( struct vnode *vp, vm_offset_t data_ptr, struct fat_arch *archret, - int affinity) -{ - load_return_t lret; - int handler = (exec_archhandler_ppc.path[0] != 0); - cpu_type_t primary_type, fallback_type; - - if (handler && affinity) { - primary_type = CPU_TYPE_POWERPC; - fallback_type = cpu_type(); - } else { - primary_type = cpu_type(); - fallback_type = CPU_TYPE_POWERPC; - } - /* - * Ignore all architectural bits when determining if an image - * in a fat file should be skipped or graded. - */ - lret = fatfile_getarch2(vp, data_ptr, primary_type, - CPU_ARCH_MASK, archret); - if ((lret != 0) && handler) { - lret = fatfile_getarch2(vp, data_ptr, fallback_type, - CPU_SUBTYPE_LIB64, archret); - } - return lret; -} - -/********************************************************************** - * Routine: fatfile_getarch() - * - * Function: Locate the architecture-dependant contents of a fat - * file that match this CPU. - * - * Args: vp: The vnode for the fat file. - * header: A pointer to the fat file header. - * archret (out): Pointer to fat_arch structure to hold - * the results. - * - * Returns: KERN_SUCCESS: Valid architecture found. - * KERN_FAILURE: No valid architecture found. - **********************************************************************/ -load_return_t -fatfile_getarch( - struct vnode *vp, - vm_offset_t data_ptr, - struct fat_arch *archret) + int affinity __unused) { - return fatfile_getarch2(vp, data_ptr, cpu_type(), - CPU_SUBTYPE_LIB64, archret); + /* + * Ignore all architectural bits when determining if an image + * in a fat file should be skipped or graded. + */ + return fatfile_getarch(vp, data_ptr, cpu_type(), CPU_ARCH_MASK, archret); } /********************************************************************** @@ -269,7 +214,6 @@ fatfile_getarch_with_bits( vm_offset_t data_ptr, struct fat_arch *archret) { - return fatfile_getarch2(vp, data_ptr, archbits | cpu_type(), - CPU_SUBTYPE_LIB64, archret); + return fatfile_getarch(vp, data_ptr, archbits | (cpu_type() & ~CPU_ARCH_MASK), 0, archret); }