X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8ad349bb6ed4a0be06e34c92be0d98b92e078db4..15129b1c8dbb3650c63b70adb1cad9af601c6c17:/bsd/kern/mach_fat.c diff --git a/bsd/kern/mach_fat.c b/bsd/kern/mach_fat.c index 24c9145c0..acac3b819 100644 --- a/bsd/kern/mach_fat.c +++ b/bsd/kern/mach_fat.c @@ -1,41 +1,30 @@ /* - * Copyright (c) 2006 Apple Computer, Inc. All Rights Reserved. + * Copyright (c) 1991-2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * @APPLE_LICENSE_OSREFERENCE_HEADER_START@ + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the - * License may not be used to create, or enable the creation or - * redistribution of, unlawful or unlicensed copies of an Apple operating - * system, or to circumvent, violate, or enable the circumvention or - * violation of, any terms of an Apple operating system software license - * agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and * limitations under the License. - * - * @APPLE_LICENSE_OSREFERENCE_HEADER_END@ - */ -/* Copyright (c) 1991 NeXT Computer, Inc. All rights reserved. - * - * File: kern/mach_fat.c - * Author: Peter King - * - * Fat file support routines. - * + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ - #include #include #include @@ -46,16 +35,12 @@ #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() + * Routine: fatfile_getarch() * * Function: Locate the architecture-dependant contents of a fat * file that match this CPU. @@ -72,7 +57,7 @@ extern int grade_binary(cpu_type_t exectype, cpu_subtype_t execsubtype); * KERN_FAILURE: No valid architecture found. **********************************************************************/ static load_return_t -fatfile_getarch2( +fatfile_getarch( #if 0 struct vnode *vp, #else @@ -92,7 +77,9 @@ fatfile_getarch2( int grade; int best_grade; int nfat_arch; - int 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; @@ -108,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 = sizeof(struct fat_header) - + nfat_arch * sizeof(struct fat_arch); + 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) { @@ -119,38 +106,42 @@ fatfile_getarch2( } #endif - /* This is beacuse we are reading only 512 bytes */ - - if (end_of_archs > 512) + /* + * This check is limited on the top end because we are reading + * only PAGE_SIZE bytes + */ + if (end_of_archs > PAGE_SIZE || + 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. - */ + * 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++) { + testtype = OSSwapBigToHostInt32(arch->cputype); + 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 & ~mask_bits)) { 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, testsubtype); /* * Remember it if it's the best we've seen. @@ -168,15 +159,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; } @@ -187,59 +178,18 @@ fatfile_getarch2( return(lret); } -extern char classichandler[]; - load_return_t fatfile_getarch_affinity( struct vnode *vp, vm_offset_t data_ptr, struct fat_arch *archret, - int affinity) + int affinity __unused) { - load_return_t lret; - int handler = (classichandler[0] != 0); - cpu_type_t primary_type, fallback_type; - - if (handler && affinity) { - primary_type = CPU_TYPE_CLASSIC; - fallback_type = CPU_TYPE_NATIVE; - } else { - primary_type = CPU_TYPE_NATIVE; - fallback_type = CPU_TYPE_CLASSIC; - } - /* - * Ignore the 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, - 0, 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) -{ - return fatfile_getarch2(vp, data_ptr, CPU_TYPE_NATIVE, 0, 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); } /********************************************************************** @@ -264,6 +214,6 @@ 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_getarch(vp, data_ptr, archbits | (cpu_type() & ~CPU_ARCH_MASK), 0, archret); }