|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* Copyright (c) 1991 NeXT Computer, Inc. All rights reserved. ! 23: * ! 24: * File: kern/mach_fat.c ! 25: * Author: Peter King ! 26: * ! 27: * Fat file support routines. ! 28: * ! 29: * HISTORY ! 30: * 18 May 1992 ? at NeXT ! 31: * Expanded to handle little endian machines. ! 32: * ! 33: * 8-Dec-91 Peter King (king) at NeXT ! 34: * Created. ! 35: */ ! 36: ! 37: #include <sys/param.h> ! 38: #include <sys/types.h> ! 39: #include <sys/uio.h> ! 40: #include <sys/vnode.h> ! 41: #include <kern/mapfs.h> ! 42: #include <vm/vm_kern.h> ! 43: #include <mach/kern_return.h> ! 44: #include <mach/vm_param.h> ! 45: #include <kern/cpu_number.h> ! 46: #include <mach-o/fat.h> ! 47: #include <kern/mach_loader.h> ! 48: #include <architecture/byte_order.h> ! 49: ! 50: ! 51: /********************************************************************** ! 52: * Routine: fatfile_getarch() ! 53: * ! 54: * Function: Locate the architecture-dependant contents of a fat ! 55: * file that match this CPU. ! 56: * ! 57: * Args: vp: The vnode for the fat file. ! 58: * header: A pointer to the fat file header. ! 59: * archret (out): Pointer to fat_arch structure to hold ! 60: * the results. ! 61: * ! 62: * Returns: KERN_SUCCESS: Valid architecture found. ! 63: * KERN_FAILURE: No valid architecture found. ! 64: **********************************************************************/ ! 65: load_return_t fatfile_getarch( ! 66: struct vnode *vp, ! 67: vm_offset_t data_ptr, ! 68: struct fat_arch *archret) ! 69: { ! 70: /* vm_pager_t pager; */ ! 71: vm_offset_t addr; ! 72: vm_size_t size; ! 73: kern_return_t kret; ! 74: load_return_t lret; ! 75: struct machine_slot *ms; ! 76: struct fat_arch *arch; ! 77: struct fat_arch *best_arch; ! 78: int grade; ! 79: int best_grade; ! 80: int nfat_arch; ! 81: int end_of_archs; ! 82: struct proc *p = current_proc(); /* XXXX */ ! 83: struct fat_header *header; ! 84: ! 85: /* ! 86: * Get the pager for the file. ! 87: */ ! 88: ! 89: header = (struct fat_header *)data_ptr; ! 90: ! 91: /* ! 92: * Map portion that must be accessible directly into ! 93: * kernel's map. ! 94: */ ! 95: nfat_arch = NXSwapBigLongToHost(header->nfat_arch); ! 96: ! 97: end_of_archs = sizeof(struct fat_header) ! 98: + nfat_arch * sizeof(struct fat_arch); ! 99: #if 0 ! 100: if (vp->v_vm_info) { ! 101: if (end_of_archs > vp->v_vm_info->vnode_size) ! 102: return(LOAD_BADMACHO); ! 103: } ! 104: #endif ! 105: ! 106: /* This is beacuse we are reading only 512 bytes */ ! 107: ! 108: if (end_of_archs > 512) ! 109: return(LOAD_BADMACHO); ! 110: /* ! 111: * Round size of fat_arch structures up to page boundry. ! 112: */ ! 113: size = round_page(end_of_archs); ! 114: if (size <= 0) ! 115: return(LOAD_BADMACHO); ! 116: ! 117: /* ! 118: * Scan the fat_arch's looking for the best one. ! 119: */ ! 120: addr = data_ptr; ! 121: ms = &machine_slot[cpu_number()]; ! 122: best_arch = NULL; ! 123: best_grade = 0; ! 124: arch = (struct fat_arch *) (addr + sizeof(struct fat_header)); ! 125: for (; nfat_arch-- > 0; arch++) { ! 126: ! 127: /* ! 128: * Check to see if right cpu type. ! 129: */ ! 130: if(NXSwapBigIntToHost(arch->cputype) != ms->cpu_type) ! 131: continue; ! 132: ! 133: /* ! 134: * Get the grade of the cpu subtype. ! 135: */ ! 136: grade = grade_cpu_subtype( ! 137: NXSwapBigIntToHost(arch->cpusubtype)); ! 138: ! 139: /* ! 140: * Remember it if it's the best we've seen. ! 141: */ ! 142: if (grade > best_grade) { ! 143: best_grade = grade; ! 144: best_arch = arch; ! 145: } ! 146: } ! 147: ! 148: /* ! 149: * Return our results. ! 150: */ ! 151: if (best_arch == NULL) { ! 152: lret = LOAD_BADARCH; ! 153: } else { ! 154: archret->cputype = ! 155: NXSwapBigIntToHost(best_arch->cputype); ! 156: archret->cpusubtype = ! 157: NXSwapBigIntToHost(best_arch->cpusubtype); ! 158: archret->offset = ! 159: NXSwapBigLongToHost(best_arch->offset); ! 160: archret->size = ! 161: NXSwapBigLongToHost(best_arch->size); ! 162: archret->align = ! 163: NXSwapBigLongToHost(best_arch->align); ! 164: ! 165: lret = LOAD_SUCCESS; ! 166: } ! 167: ! 168: /* ! 169: * Free the memory we allocated and return. ! 170: */ ! 171: return(lret); ! 172: } ! 173: ! 174:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.