void cpu_userwindow_init(int cpu) { cpu_data_t *cdp = cpu_data_ptr[cpu]; cpu_desc_index_t *cdi = &cdp->cpu_desc_index; vm_offset_t user_window; vm_offset_t vaddr; int num_cpus; num_cpus = ml_get_max_cpus(); if (cpu >= num_cpus) panic("cpu_userwindow_init: cpu > num_cpus"); if (user_window_base == 0) { if (vm_allocate(kernel_map, &vaddr, (NBPDE * NCOPY_WINDOWS * num_cpus) + NBPDE, VM_FLAGS_ANYWHERE) != KERN_SUCCESS) panic("cpu_userwindow_init: " "couldn't allocate user map window"); /* * window must start on a page table boundary * in the virtual address space */ user_window_base = (vaddr + (NBPDE - 1)) & ~(NBPDE - 1); /* * get rid of any allocation leading up to our * starting boundary */ vm_deallocate(kernel_map, vaddr, user_window_base - vaddr); /* * get rid of tail that we don't need */ user_window = user_window_base + (NBPDE * NCOPY_WINDOWS * num_cpus); vm_deallocate(kernel_map, user_window, (vaddr + ((NBPDE * NCOPY_WINDOWS * num_cpus) + NBPDE)) - user_window); } user_window = user_window_base + (cpu * NCOPY_WINDOWS * NBPDE); cdp->cpu_copywindow_base = user_window; cdp->cpu_copywindow_pdp = pmap_pde(kernel_pmap, user_window); cdi->cdi_gdt[sel_idx(USER_WINDOW_SEL)] = userwindow_desc_pattern; cdi->cdi_gdt[sel_idx(USER_WINDOW_SEL)].offset = user_window; fix_desc(&cdi->cdi_gdt[sel_idx(USER_WINDOW_SEL)], 1); }
/* Determine number of CPUs on this system. We cannot rely on * machine_info.max_cpus this early in the boot. */ static int commpage_cpus( void ) { int cpus; cpus = ml_get_max_cpus(); // NB: this call can block if (cpus == 0) panic("commpage cpus==0"); if (cpus > 0xFF) cpus = 0xFF; return cpus; }
/* * Initialize the framework; this is currently called as part of BSD init. */ __private_extern__ void mcache_init(void) { mcache_bkttype_t *btp; unsigned int i; char name[32]; ncpu = ml_get_max_cpus(); mcache_llock_grp_attr = lck_grp_attr_alloc_init(); mcache_llock_grp = lck_grp_alloc_init("mcache.list", mcache_llock_grp_attr); mcache_llock_attr = lck_attr_alloc_init(); mcache_llock = lck_mtx_alloc_init(mcache_llock_grp, mcache_llock_attr); mcache_zone = zinit(MCACHE_ALLOC_SIZE, 256 * MCACHE_ALLOC_SIZE, PAGE_SIZE, "mcache"); if (mcache_zone == NULL) panic("mcache_init: failed to allocate mcache zone\n"); zone_change(mcache_zone, Z_CALLERACCT, FALSE); LIST_INIT(&mcache_head); for (i = 0; i < sizeof (mcache_bkttype) / sizeof (*btp); i++) { btp = &mcache_bkttype[i]; (void) snprintf(name, sizeof (name), "bkt_%d", btp->bt_bktsize); btp->bt_cache = mcache_create(name, (btp->bt_bktsize + 1) * sizeof (void *), 0, 0, MCR_SLEEP); } PE_parse_boot_argn("mcache_flags", &mcache_flags, sizeof (mcache_flags)); mcache_flags &= MCF_FLAGS_MASK; mcache_audit_cache = mcache_create("audit", sizeof (mcache_audit_t), 0, 0, MCR_SLEEP); mcache_reap_interval = 15 * hz; mcache_applyall(mcache_cache_bkt_enable); mcache_ready = 1; }