|
|
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: /* ! 23: * @OSF_FREE_COPYRIGHT@ ! 24: */ ! 25: /* ! 26: * Mach Operating System ! 27: * Copyright (c) 1991,1990,1989 Carnegie Mellon University ! 28: * All Rights Reserved. ! 29: * ! 30: * Permission to use, copy, modify and distribute this software and its ! 31: * documentation is hereby granted, provided that both the copyright ! 32: * notice and this permission notice appear in all copies of the ! 33: * software, derivative works or modified versions, and any portions ! 34: * thereof, and that both notices appear in supporting documentation. ! 35: * ! 36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 39: * ! 40: * Carnegie Mellon requests users of this software to return to ! 41: * ! 42: * Software Distribution Coordinator or [email protected] ! 43: * School of Computer Science ! 44: * Carnegie Mellon University ! 45: * Pittsburgh PA 15213-3890 ! 46: * ! 47: * any improvements or extensions that they make and grant Carnegie Mellon ! 48: * the rights to redistribute these changes. ! 49: */ ! 50: /* ! 51: */ ! 52: /* ! 53: * Bootstrap the various built-in servers. ! 54: */ ! 55: ! 56: #include <mach_kdb.h> ! 57: #include <bootstrap_symbols.h> ! 58: #include <dipc.h> ! 59: ! 60: #include <cputypes.h> ! 61: #include <mach/port.h> ! 62: #include <mach/message.h> ! 63: #include <mach/machine/vm_types.h> ! 64: #include <mach/vm_prot.h> ! 65: #include <mach/boolean.h> ! 66: #include <mach/boot_info.h> ! 67: #include <mach/mach_port_server.h> ! 68: #include <mach/bootstrap_server.h> ! 69: ! 70: #include <device/device_port.h> ! 71: #include <ipc/ipc_space.h> ! 72: ! 73: #include <kern/thread.h> ! 74: #include <ipc/ipc_port.h> ! 75: #include <ipc/ipc_entry.h> ! 76: #include <kern/host.h> ! 77: #include <kern/ledger.h> ! 78: #include <kern/processor.h> ! 79: #include <kern/zalloc.h> ! 80: #include <kern/misc_protos.h> ! 81: #include <vm/vm_object.h> ! 82: #include <vm/vm_page.h> ! 83: #include <vm/vm_map.h> ! 84: #include <vm/vm_fault.h> ! 85: ! 86: #if MACH_KDB ! 87: #include <ddb/db_sym.h> ! 88: ! 89: #if defined(__alpha) ! 90: extern boolean_t use_kdb; ! 91: extern int stpages; ! 92: #endif /* defined(__alpha) */ ! 93: ! 94: #endif /* MACH_KDB */ ! 95: ! 96: vm_offset_t kern_sym_start = 0; /* pointer to kernel symbols */ ! 97: vm_size_t kern_sym_size = 0; /* size of kernel symbols */ ! 98: vm_offset_t kern_args_start = 0; /* kernel arguments */ ! 99: vm_size_t kern_args_size = 0; /* size of kernel arguments */ ! 100: vm_offset_t boot_sym_start = 0; /* pointer to bootstrap symbols */ ! 101: vm_size_t boot_sym_size = 0; /* size of bootstrap symbols */ ! 102: vm_offset_t boot_args_start = 0; /* bootstrap arguments */ ! 103: vm_size_t boot_args_size = 0; /* size of bootstrap arguments */ ! 104: vm_offset_t boot_start = 0; /* pointer to bootstrap image */ ! 105: vm_size_t boot_size = 0; /* size of bootstrap image */ ! 106: vm_offset_t boot_region_desc = 0; /* bootstrap region descriptions */ ! 107: vm_size_t boot_region_count = 0; /* number of regions */ ! 108: int boot_thread_state_flavor = 0; ! 109: thread_state_t boot_thread_state = 0; ! 110: unsigned int boot_thread_state_count = 0; ! 111: vm_offset_t env_start = 0; /* environment */ ! 112: vm_size_t env_size = 0; /* size of environment */ ! 113: ! 114: vm_offset_t load_info_start = 0; /* pointer to bootstrap load info */ ! 115: vm_size_t load_info_size = 0; /* size of bootstrap load info */ ! 116: ! 117: kern_return_t ! 118: do_bootstrap_ports( ! 119: ipc_port_t bootstrap, ! 120: ipc_port_t *priv_hostp, ! 121: ipc_port_t *priv_devicep, ! 122: ipc_port_t *wired_ledgerp, ! 123: ipc_port_t *paged_ledgerp, ! 124: ipc_port_t *host_securityp) ! 125: { ! 126: #ifdef lint ! 127: bootstrap = ipc_port_make_send(realhost.host_priv_self); ! 128: #endif /* lint */ ! 129: ! 130: *priv_hostp = ipc_port_make_send(realhost.host_priv_self); ! 131: *priv_devicep = ipc_port_make_send(master_device_port); ! 132: *wired_ledgerp = ipc_port_make_send(root_wired_ledger_port); ! 133: *paged_ledgerp = ipc_port_make_send(root_paged_ledger_port); ! 134: *host_securityp = ipc_port_make_send(realhost.host_security_self); ! 135: return KERN_SUCCESS; ! 136: } ! 137: ! 138: kern_return_t ! 139: do_bootstrap_arguments( ! 140: ipc_port_t bootstrap_port, ! 141: task_t task, ! 142: vm_offset_t *arguments_ptr, ! 143: mach_msg_type_number_t *arguments_count) ! 144: { ! 145: vm_offset_t args_addr; ! 146: unsigned int args_size; ! 147: kern_return_t kr; ! 148: vm_map_copy_t copy; ! 149: ! 150: #ifdef lint ! 151: bootstrap_port = (ipc_port_t) 0; ! 152: task->map = VM_MAP_NULL; ! 153: #endif /* lint */ ! 154: ! 155: if (boot_args_size == 0) ! 156: args_size = PAGE_SIZE; ! 157: else ! 158: args_size = round_page(boot_args_size); ! 159: kr = kmem_alloc_pageable(ipc_kernel_map, &args_addr, args_size); ! 160: if (kr != KERN_SUCCESS) ! 161: return kr; ! 162: if (boot_args_size) ! 163: bcopy((char *)boot_args_start, (char *)args_addr, ! 164: boot_args_size); ! 165: if (args_size != boot_args_size) ! 166: bzero((char *) args_addr + boot_args_size, ! 167: args_size - boot_args_size); ! 168: kr = vm_map_copyin(ipc_kernel_map, args_addr, args_size, TRUE, ©); ! 169: assert(kr == KERN_SUCCESS); ! 170: *arguments_ptr = (vm_offset_t) copy; ! 171: *arguments_count = boot_args_size; ! 172: return KERN_SUCCESS; ! 173: } ! 174: ! 175: ! 176: kern_return_t ! 177: do_bootstrap_environment( ! 178: ipc_port_t bootstrap_port, ! 179: task_t task, ! 180: vm_offset_t *environment_ptr, ! 181: mach_msg_type_number_t *environment_count) ! 182: { ! 183: vm_offset_t env_addr; ! 184: vm_size_t alloc_size; ! 185: kern_return_t kr; ! 186: vm_map_copy_t copy; ! 187: ! 188: #ifdef lint ! 189: task->map = VM_MAP_NULL; ! 190: bootstrap_port = (ipc_port_t) 0; ! 191: #endif /* lint */ ! 192: ! 193: if (env_size == 0) ! 194: alloc_size = PAGE_SIZE; ! 195: else ! 196: alloc_size = round_page(env_size); ! 197: kr = kmem_alloc_pageable(ipc_kernel_map, &env_addr, alloc_size); ! 198: if (kr != KERN_SUCCESS) ! 199: return kr; ! 200: if (env_size) ! 201: bcopy((char *)env_start, (char *)env_addr, env_size); ! 202: if (alloc_size != env_size) ! 203: bzero((char *) env_addr + env_size, ! 204: alloc_size - env_size); ! 205: kr = vm_map_copyin(ipc_kernel_map, env_addr, alloc_size, TRUE, ©); ! 206: assert(kr == KERN_SUCCESS); ! 207: *environment_ptr = (vm_offset_t) copy; ! 208: *environment_count = env_size; ! 209: return KERN_SUCCESS; ! 210: } ! 211: ! 212: kern_return_t ! 213: do_bootstrap_completed( ! 214: ipc_port_t bootstrap_port, ! 215: task_t task) ! 216: { ! 217: /* Need do nothing; only the bootstrap task cares when a ! 218: server signals bootstrap_completed. */ ! 219: return KERN_SUCCESS; ! 220: } ! 221: ! 222: void load_info_print(void); ! 223: ! 224: #if DEBUG ! 225: void ! 226: load_info_print(void) ! 227: { ! 228: struct loader_info *lp = (struct loader_info *)load_info_start; ! 229: ! 230: printf("Load info: text (%#x, %#x, %#x)\n", ! 231: lp->text_start, lp->text_size, lp->text_offset); ! 232: printf(" data (%#x, %#x, %#x)\n", ! 233: lp->data_start, lp->data_size, lp->data_offset); ! 234: printf(" bss (%#x)\n", lp->bss_size); ! 235: printf(" syms (%#x, %#x)\n", ! 236: lp->sym_offset, lp->sym_size); ! 237: printf(" entry(%#x, %#x)\n", ! 238: lp->entry_1, lp->entry_2); ! 239: } ! 240: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.