void mca_cpu_alloc(cpu_data_t *cdp) { vm_size_t mca_state_size; /* * Allocate space for an array of error banks. */ mca_state_size = sizeof(mca_state_t) + sizeof(mca_mci_bank_t) * mca_error_bank_count; cdp->cpu_mca_state = kalloc(mca_state_size); if (cdp->cpu_mca_state == NULL) { printf("mca_cpu_alloc() failed for cpu %d\n", cdp->cpu_number); return; } bzero((void *) cdp->cpu_mca_state, mca_state_size); /* * If the boot processor is yet have its allocation made, * do this now. */ if (cpu_datap(master_cpu)->cpu_mca_state == NULL) mca_cpu_alloc(cpu_datap(master_cpu)); }
cpu_data_t * cpu_data_alloc(boolean_t is_boot_cpu) { int ret; cpu_data_t *cdp; if (is_boot_cpu) { assert(real_ncpus == 1); simple_lock_init(&cpu_lock, 0); cdp = &cpu_data_master; if (cdp->cpu_processor == NULL) { cdp->cpu_processor = cpu_processor_alloc(TRUE); cdp->cpu_pmap = pmap_cpu_alloc(TRUE); cdp->cpu_this = cdp; cdp->cpu_is64bit = FALSE; cdp->cpu_int_stack_top = (vm_offset_t) low_eintstack; cpu_desc_init(cdp, TRUE); fast_syscall_init(); } return cdp; } /* Check count before making allocations */ if (real_ncpus >= max_ncpus) return NULL; /* * Allocate per-cpu data: */ ret = kmem_alloc(kernel_map, (vm_offset_t *) &cdp, sizeof(cpu_data_t)); if (ret != KERN_SUCCESS) { printf("cpu_data_alloc() failed, ret=%d\n", ret); goto abort; } bzero((void*) cdp, sizeof(cpu_data_t)); cdp->cpu_this = cdp; /* Propagate mode */ cdp->cpu_is64bit = cpu_mode_is64bit(); /* * Allocate interrupt stack: */ ret = kmem_alloc(kernel_map, (vm_offset_t *) &cdp->cpu_int_stack_top, INTSTACK_SIZE); if (ret != KERN_SUCCESS) { printf("cpu_data_alloc() int stack failed, ret=%d\n", ret); goto abort; } bzero((void*) cdp->cpu_int_stack_top, INTSTACK_SIZE); cdp->cpu_int_stack_top += INTSTACK_SIZE; /* * Allocate descriptor table: * Size depends on cpu mode. */ ret = kmem_alloc(kernel_map, (vm_offset_t *) &cdp->cpu_desc_tablep, cdp->cpu_is64bit ? sizeof(cpu_desc_table64_t) : sizeof(cpu_desc_table_t)); if (ret != KERN_SUCCESS) { printf("cpu_data_alloc() desc_table failed, ret=%d\n", ret); goto abort; } /* * Allocate LDT */ ret = kmem_alloc(kernel_map, (vm_offset_t *) &cdp->cpu_ldtp, sizeof(struct real_descriptor) * LDTSZ); if (ret != KERN_SUCCESS) { printf("cpu_data_alloc() ldt failed, ret=%d\n", ret); goto abort; } /* Machine-check shadow register allocation. */ mca_cpu_alloc(cdp); simple_lock(&cpu_lock); if (real_ncpus >= max_ncpus) { simple_unlock(&cpu_lock); goto abort; } cpu_data_ptr[real_ncpus] = cdp; cdp->cpu_number = real_ncpus; real_ncpus++; simple_unlock(&cpu_lock); kprintf("cpu_data_alloc(%d) %p desc_table: %p " "ldt: %p " "int_stack: 0x%x-0x%x\n", cdp->cpu_number, cdp, cdp->cpu_desc_tablep, cdp->cpu_ldtp, cdp->cpu_int_stack_top - INTSTACK_SIZE, cdp->cpu_int_stack_top); return cdp; abort: if (cdp) { if (cdp->cpu_desc_tablep) kfree((void *) cdp->cpu_desc_tablep, sizeof(*cdp->cpu_desc_tablep)); if (cdp->cpu_int_stack_top) kfree((void *) (cdp->cpu_int_stack_top - INTSTACK_SIZE), INTSTACK_SIZE); kfree((void *) cdp, sizeof(*cdp)); } return NULL; }