X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..13f56ec4e58bf8687e2a68032c093c0213dd519b:/bsd/kern/mach_fat.c diff --git a/bsd/kern/mach_fat.c b/bsd/kern/mach_fat.c index a9418aa8f..9811047d7 100644 --- a/bsd/kern/mach_fat.c +++ b/bsd/kern/mach_fat.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1991-2005 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -25,15 +25,6 @@ * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ -/* Copyright (c) 1991 NeXT Computer, Inc. All rights reserved. - * - * File: kern/mach_fat.c - * Author: Peter King - * - * Fat file support routines. - * - */ - #include #include #include @@ -44,13 +35,9 @@ #include #include #include -#include - -/* XXX should be in common header */ -extern int grade_binary(cpu_type_t exectype, cpu_subtype_t execsubtype); - -#define CPU_TYPE_NATIVE (cpu_type()) -#define CPU_TYPE_CLASSIC CPU_TYPE_POWERPC +#include +#include +#include /********************************************************************** * Routine: fatfile_getarch2() @@ -90,7 +77,9 @@ fatfile_getarch2( int grade; int best_grade; int nfat_arch; - off_t end_of_archs; + off_t end_of_archs; + cpu_type_t testtype; + cpu_type_t testsubtype; struct fat_header *header; #if 0 off_t filesize; @@ -106,10 +95,10 @@ fatfile_getarch2( * Map portion that must be accessible directly into * kernel's map. */ - nfat_arch = NXSwapBigLongToHost(header->nfat_arch); + nfat_arch = OSSwapBigToHostInt32(header->nfat_arch); - end_of_archs = (off_t)nfat_arch * sizeof(struct fat_arch) + - sizeof(struct fat_header); + end_of_archs = (off_t)nfat_arch * sizeof(struct fat_arch) + + sizeof(struct fat_header); #if 0 filesize = ubc_getsize(vp); if (end_of_archs > (int)filesize) { @@ -122,36 +111,52 @@ 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); /* - * Scan the fat_arch's looking for the best one. + * 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; best_arch = NULL; 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; + /* * Check to see if right cpu type. */ - if(((cpu_type_t)NXSwapBigIntToHost(arch->cputype) & ~mask_bits) != req_cpu_type) + if((testtype & ~mask_bits) != req_cpu_type) { continue; + } /* - * Get the grade of the cpu subtype. + * Get the grade of the cpu subtype (without feature flags) */ - grade = grade_binary( - NXSwapBigIntToHost(arch->cputype), - NXSwapBigIntToHost(arch->cpusubtype)); + grade = grade_binary( + (testtype & ~CPU_SUBTYPE_LIB64), + testsubtype); /* * Remember it if it's the best we've seen. @@ -169,15 +174,15 @@ fatfile_getarch2( lret = LOAD_BADARCH; } else { archret->cputype = - NXSwapBigIntToHost(best_arch->cputype); + OSSwapBigToHostInt32(best_arch->cputype); archret->cpusubtype = - NXSwapBigIntToHost(best_arch->cpusubtype); + OSSwapBigToHostInt32(best_arch->cpusubtype); archret->offset = - NXSwapBigLongToHost(best_arch->offset); + OSSwapBigToHostInt32(best_arch->offset); archret->size = - NXSwapBigLongToHost(best_arch->size); + OSSwapBigToHostInt32(best_arch->size); archret->align = - NXSwapBigLongToHost(best_arch->align); + OSSwapBigToHostInt32(best_arch->align); lret = LOAD_SUCCESS; } @@ -188,8 +193,6 @@ fatfile_getarch2( return(lret); } -extern char classichandler[]; - load_return_t fatfile_getarch_affinity( struct vnode *vp, @@ -198,24 +201,25 @@ fatfile_getarch_affinity( int affinity) { load_return_t lret; - int handler = (classichandler[0] != 0); + int handler = (exec_archhandler_ppc.path[0] != 0); cpu_type_t primary_type, fallback_type; if (handler && affinity) { - primary_type = CPU_TYPE_CLASSIC; - fallback_type = CPU_TYPE_NATIVE; + primary_type = CPU_TYPE_POWERPC; + fallback_type = cpu_type(); } else { - primary_type = CPU_TYPE_NATIVE; - fallback_type = CPU_TYPE_CLASSIC; + primary_type = cpu_type(); + fallback_type = CPU_TYPE_POWERPC; } /* - * Ignore the architectural bits when determining if an image + * 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); + lret = fatfile_getarch2(vp, data_ptr, primary_type, + CPU_ARCH_MASK, archret); if ((lret != 0) && handler) { lret = fatfile_getarch2(vp, data_ptr, fallback_type, - 0, archret); + CPU_SUBTYPE_LIB64, archret); } return lret; } @@ -240,7 +244,8 @@ fatfile_getarch( vm_offset_t data_ptr, struct fat_arch *archret) { - return fatfile_getarch2(vp, data_ptr, CPU_TYPE_NATIVE, 0, archret); + return fatfile_getarch2(vp, data_ptr, cpu_type(), + CPU_SUBTYPE_LIB64, archret); } /********************************************************************** @@ -265,6 +270,7 @@ fatfile_getarch_with_bits( vm_offset_t data_ptr, struct fat_arch *archret) { - return fatfile_getarch2(vp, data_ptr, archbits | CPU_TYPE_NATIVE, 0, archret); + return fatfile_getarch2(vp, data_ptr, archbits | cpu_type(), + CPU_SUBTYPE_LIB64, archret); }