Home | History | Annotate | Download | only in x86

Lines Matching refs:ci

183 static void    	cpu_boot_secondary(struct cpu_info *ci);
184 static void cpu_start_secondary(struct cpu_info *ci);
199 struct cpu_info *ci;
214 ptr = (uintptr_t)kmem_zalloc(sizeof(*ci) + CACHE_LINE_SIZE - 1,
216 ci = (struct cpu_info *)roundup2(ptr, CACHE_LINE_SIZE);
217 ci->ci_curldt = -1;
223 tmp->ci_next = ci;
225 ci = &phycpu_info_primary;
228 ci->ci_self = ci;
229 sc->sc_info = ci;
231 ci->ci_dev = self;
232 ci->ci_acpiid = caa->cpu_id;
233 ci->ci_cpuid = caa->cpu_number;
234 ci->ci_vcpu = NULL;
235 ci->ci_index = nphycpu++;
236 ci->ci_kfpu_spl = -1;
255 struct cpu_info *ci = sc->sc_info;
258 cfaa.ci = ci;
262 if (ci->ci_frequency == NULL) {
264 ci->ci_frequency =
277 struct cpu_info *ci = sc->sc_info;
279 if (ci->ci_frequency == child)
280 ci->ci_frequency = NULL;
320 vcpu_is_up(struct cpu_info *ci)
322 KASSERT(ci != NULL);
323 return HYPERVISOR_vcpu_op(VCPUOP_is_up, ci->ci_vcpuid, NULL);
327 cpu_vm_init(struct cpu_info *ci)
335 cai = &ci->ci_cinfo[i];
355 aprint_debug_dev(ci->ci_dev, "%d page colors\n", ncolors);
357 pmap_tlb_cpu_init(ci);
359 pmap_vpage_cpu_init(ci);
368 struct cpu_info *ci;
381 ptr = (uintptr_t)kmem_alloc(sizeof(*ci) + CACHE_LINE_SIZE - 1,
383 ci = (struct cpu_info *)roundup2(ptr, CACHE_LINE_SIZE);
384 memset(ci, 0, sizeof(*ci));
385 cpu_init_tss(ci);
389 ci = &cpu_info_primary;
392 ci->ci_self = ci;
393 sc->sc_info = ci;
394 ci->ci_dev = self;
395 ci->ci_cpuid = cpunum;
396 ci->ci_vcpuid = cpunum;
397 ci->ci_kfpu_spl = -1;
401 ci->ci_vcpu = &HYPERVISOR_shared_info->vcpu_info[cpunum];
403 KASSERT(ci->ci_func == 0);
404 ci->ci_func = caa->cpu_func;
408 cpu_vm_init(ci);
413 error = mi_cpu_attach(ci);
415 KASSERT(ci->ci_data.cpu_idlelwp != NULL);
423 KASSERT(ci->ci_data.cpu_idlelwp != NULL);
426 KASSERT(ci->ci_cpuid == ci->ci_index);
429 ci->ci_xen_current_user_pgd = 0;
431 mutex_init(&ci->ci_kpm_mtx, MUTEX_DEFAULT, IPL_VM);
433 ci->ci_pmap = pmap_kernel();
434 ci->ci_tlbstate = TLBSTATE_STALE;
441 atomic_or_32(&ci->ci_flags, CPUF_PRESENT | CPUF_PRIMARY);
443 cpu_intr_init(ci);
444 cpu_get_tsc_freq(ci);
445 cpu_init(ci);
446 pmap_cpu_init_late(ci);
460 atomic_or_32(&ci->ci_flags, CPUF_SP);
461 cpu_identify(ci);
466 atomic_or_32(&ci->ci_flags, CPUF_BSP);
467 cpu_identify(ci);
472 atomic_or_32(&ci->ci_flags, CPUF_AP);
480 cpu_intr_init(ci);
483 idt_vec_init_cpu_md(&ci->ci_idtvec, cpu_index(ci));
486 gdt_alloc_cpu(ci);
488 pmap_cpu_init_late(ci);
489 cpu_start_secondary(ci);
491 if (ci->ci_flags & CPUF_PRESENT) {
494 cpu_identify(ci);
499 tmp->ci_next = ci;
502 aprint_error_dev(ci->ci_dev, "not started\n");
512 struct lwp *l = ci->ci_data.cpu_idlelwp;
534 cpu_init(struct cpu_info *ci)
574 ci->ci_feat_val[1] = descs[2];
582 atomic_or_32(&ci->ci_flags, CPUF_RUNNING);
591 struct cpu_info *ci;
598 ci = cpu_lookup(i);
599 if (ci == NULL)
601 if (ci->ci_data.cpu_idlelwp == NULL)
603 if ((ci->ci_flags & CPUF_PRESENT) == 0)
605 if (ci->ci_flags & (CPUF_BSP|CPUF_SP|CPUF_PRIMARY))
607 cpu_boot_secondary(ci);
608 kcpuset_set(cpus, cpu_index(ci));
618 cpu_init_idle_lwp(struct cpu_info *ci)
620 struct lwp *l = ci->ci_data.cpu_idlelwp;
629 struct cpu_info *ci;
633 ci = cpu_lookup(i);
634 if (ci == NULL)
636 if (ci->ci_data.cpu_idlelwp == NULL)
638 if ((ci->ci_flags & CPUF_PRESENT) == 0)
640 cpu_init_idle_lwp(ci);
645 cpu_start_secondary(struct cpu_info *ci)
649 aprint_debug_dev(ci->ci_dev, "starting\n");
651 ci->ci_curlwp = ci->ci_data.cpu_idlelwp;
653 if (CPU_STARTUP(ci, (vaddr_t) cpu_hatch) != 0) {
660 for (i = 100000; (!(ci->ci_flags & CPUF_PRESENT)) && i > 0; i--) {
663 if ((ci->ci_flags & CPUF_PRESENT) == 0) {
664 aprint_error_dev(ci->ci_dev, "failed to become ready\n");
671 CPU_START_CLEANUP(ci);
675 cpu_boot_secondary(struct cpu_info *ci)
678 atomic_or_32(&ci->ci_flags, CPUF_GO);
679 for (i = 100000; (!(ci->ci_flags & CPUF_RUNNING)) && i > 0; i--) {
682 if ((ci->ci_flags & CPUF_RUNNING) == 0) {
683 aprint_error_dev(ci->ci_dev, "CPU failed to start\n");
702 struct cpu_info *ci = (struct cpu_info *)v;
707 cpu_init_msrs(ci, true);
708 cpu_init_idt(ci);
709 gdt_init_cpu(ci);
711 cpu_probe(ci);
713 atomic_or_32(&ci->ci_flags, CPUF_PRESENT);
715 while ((ci->ci_flags & CPUF_GO) == 0) {
725 KASSERT((ci->ci_flags & CPUF_RUNNING) == 0);
727 KASSERT(ci->ci_curlwp == ci->ci_data.cpu_idlelwp);
728 KASSERT(curlwp == ci->ci_data.cpu_idlelwp);
737 fpuinit(ci);
742 cpu_init(ci);
743 cpu_get_tsc_freq(ci);
749 aprint_debug_dev(ci->ci_dev, "running\n");
751 KASSERT(ci->ci_curlwp == ci->ci_data.cpu_idlelwp);
767 struct cpu_info *ci;
771 for (CPU_INFO_FOREACH(cii, ci)) {
773 ci,
774 ci->ci_dev == NULL ? "BOOT" : device_xname(ci->ci_dev),
775 (long)ci->ci_vcpuid,
776 ci->ci_flags, ci->ci_ipis,
777 ci->ci_curlwp);
815 xen_init_amd64_vcpuctxt(struct cpu_info *ci, struct vcpu_guest_context *initctx,
828 KASSERT(ci != NULL);
829 KASSERT(ci != &cpu_info_primary);
838 gdt_prepframes(frames, (vaddr_t)ci->ci_gdt, gdt_ents);
842 l = ci->ci_data.cpu_idlelwp;
849 vci = ci->ci_vcpu;
863 initctx->user_regs.rdi = (uint64_t) ci; /* targetrip(ci); */
894 initctx->ctrlreg[3] = xen_pfn_to_cr3(x86_btop(xpmap_ptom(ci->ci_kpm_pdirpa)));
909 xen_init_i386_vcpuctxt(struct cpu_info *ci, struct vcpu_guest_context *initctx,
922 KASSERT(ci != NULL);
923 KASSERT(ci != &cpu_info_primary);
932 gdt_prepframes(frames, (vaddr_t)ci->ci_gdt, gdt_ents);
939 l = ci->ci_data.cpu_idlelwp;
946 vci = ci->ci_vcpu;
963 /* targeteip(ci); */
965 arg[1] = (uint32_t)ci; /* arg1 */
992 initctx->ctrlreg[3] = xen_pfn_to_cr3(x86_btop(xpmap_ptom(ci->ci_pae_l3_pdirpa)));
1006 mp_cpu_start(struct cpu_info *ci, vaddr_t target)
1011 KASSERT(ci != NULL);
1012 KASSERT(ci != &cpu_info_primary);
1013 KASSERT(ci->ci_flags & CPUF_AP);
1018 xen_init_amd64_vcpuctxt(ci, vcpuctx, (void (*)(struct cpu_info *))target);
1020 xen_init_i386_vcpuctxt(ci, vcpuctx, (void (*)(struct cpu_info *))target);
1023 /* Initialise the given vcpu to execute cpu_hatch(ci); */
1024 if ((hyperror = HYPERVISOR_vcpu_op(VCPUOP_initialise, ci->ci_vcpuid, vcpuctx))) {
1032 if ((hyperror = HYPERVISOR_vcpu_op(VCPUOP_down, ci->ci_vcpuid, NULL))) {
1037 if ((hyperror = HYPERVISOR_vcpu_op(VCPUOP_up, ci->ci_vcpuid, NULL))) {
1042 if (!vcpu_is_up(ci)) {
1054 mp_cpu_start_cleanup(struct cpu_info *ci)
1056 if (vcpu_is_up(ci)) {
1057 aprint_debug_dev(ci->ci_dev, "is started.\n");
1059 aprint_error_dev(ci->ci_dev, "did not start up.\n");
1064 cpu_init_msrs(struct cpu_info *ci, bool full)
1069 HYPERVISOR_set_segment_base(SEGBASE_GS_KERNEL, (uint64_t)ci);
1085 cpu_get_tsc_freq(struct cpu_info *ci)
1088 const volatile vcpu_time_info_t *tinfo = &ci->ci_vcpu->time;
1099 ci->ci_data.cpu_cc_freq = freq;
1108 struct cpu_info *ci = curcpu();
1109 cpuid_t cid = cpu_index(ci);
1115 mutex_enter(&ci->ci_kpm_mtx);
1123 l4_pd_ma = xpmap_ptom_masked(ci->ci_kpm_pdirpa);
1130 KASSERT(pmap == ci->ci_pmap);
1135 if (ci->ci_kpm_pdir[i] != new_pgd[i]) {
1142 ci->ci_xen_current_user_pgd = pmap_pdirpa(pmap, 0);
1144 paddr_t l3_pd = xpmap_ptom_masked(ci->ci_pae_l3_pdirpa);
1158 mutex_exit(&ci->ci_kpm_mtx);
1181 pmap_cpu_init_late(struct cpu_info *ci)
1194 ci->ci_normal_pdes[i] = normal_pdes[i];
1198 if (ci == &cpu_info_primary)
1201 KASSERT(ci != NULL);
1204 cpu_alloc_l3_page(ci);
1205 KASSERT(ci->ci_pae_l3_pdirpa != 0);
1209 ci->ci_pae_l3_pdir[i] =
1214 ci->ci_kpm_pdir = (pd_entry_t *)uvm_km_alloc(kernel_map, PAGE_SIZE, 0,
1217 if (ci->ci_kpm_pdir == NULL) {
1219 __func__, cpu_index(ci));
1221 ci->ci_kpm_pdirpa = vtophys((vaddr_t)ci->ci_kpm_pdir);
1222 KASSERT(ci->ci_kpm_pdirpa != 0);
1228 memcpy(ci->ci_kpm_pdir, pmap_kernel()->pm_pdir, PAGE_SIZE);
1231 ci->ci_kpm_pdir[PDIR_SLOT_PTE] = xpmap_ptom_masked(ci->ci_kpm_pdirpa)
1235 memcpy(ci->ci_kpm_pdir, pmap_kernel()->pm_pdir + PDIR_SLOT_KERN,
1240 pmap_protect(pmap_kernel(), (vaddr_t)ci->ci_kpm_pdir,
1241 (vaddr_t)ci->ci_kpm_pdir + PAGE_SIZE, VM_PROT_READ);
1245 xpq_queue_pin_l4_table(xpmap_ptom_masked(ci->ci_kpm_pdirpa));
1251 ci->ci_pae_l3_pdir[3] = xpmap_ptom_masked(ci->ci_kpm_pdirpa) | PTE_P;
1254 pmap_protect(pmap_kernel(), (vaddr_t)ci->ci_pae_l3_pdir,
1255 (vaddr_t)ci->ci_pae_l3_pdir + PAGE_SIZE, VM_PROT_READ);
1258 xpq_queue_pin_l3_table(xpmap_ptom_masked(ci->ci_pae_l3_pdirpa));
1277 cpu_kick(struct cpu_info *ci)
1279 (void)xen_send_ipi(ci, XEN_IPI_AST);