void __init cpu_init(void) { /* Initialize VMM (APIs only available after this) */ vmm_init(); /* We will never come back here. */ vmm_hang(); }
void vmm_init_secondary(void) { int ret; /* Initialize host virtual address space */ ret = vmm_host_aspace_init(); if (ret) { vmm_hang(); } /* Initialize host interrupts */ ret = vmm_host_irq_init(); if (ret) { vmm_hang(); } /* Initialize clockchip manager */ ret = vmm_clockchip_init(); if (ret) { vmm_hang(); } /* Initialize hypervisor timer */ ret = vmm_timer_init(); if (ret) { vmm_hang(); } /* Initialize soft delay */ ret = vmm_delay_init(); if (ret) { vmm_hang(); } /* Initialize hypervisor scheduler */ ret = vmm_scheduler_init(); if (ret) { vmm_hang(); } /* Initialize inter-processor interrupts */ ret = vmm_smp_ipi_init(); if (ret) { vmm_hang(); } /* Start timer (Must be last step) */ vmm_timer_start(); /* Wait here till scheduler gets invoked by timer */ vmm_hang(); }
void __init cpu_init(struct multiboot_info *binfo, char *cmdline) { memcpy(&boot_info, binfo, sizeof(struct multiboot_info)); memcpy(boot_cmd_line, cmdline, sizeof(boot_cmd_line)); BUG_ON(!(binfo->flags & MULTIBOOT_INFO_MEMORY)); vmm_parse_early_options((char *)boot_cmd_line); indentify_cpu(); /* Initialize VMM (APIs only available after this) */ vmm_init(); /* We should never come back here. */ vmm_hang(); }
void __init cpu_init(void) { #if defined(CONFIG_SMP) u32 cpu = vmm_smp_processor_id(); if (!cpu) { /* Primary CPU */ vmm_init(); } else { /* Secondary CPUs */ vmm_init_secondary(); } #else /* Initialize VMM (APIs only available after this) */ vmm_init(); #endif /* We will never come back here. */ vmm_hang(); }
void vmm_shutdown(void) { int rc; /* Stop scheduler */ vmm_printf("Stopping Hypervisor Timer Subsytem\n"); vmm_timer_stop(); /* FIXME: Do other cleanup stuff. */ /* Issue board shutdown */ vmm_printf("Issuing Board Shutdown\n"); if ((rc = arch_board_shutdown())) { vmm_panic("Error: Board shutdown failed.\n"); } /* Wait here. Nothing else to do. */ vmm_hang(); }
void vmm_reset(void) { int rc; /* Stop scheduler */ vmm_printf("Stopping Hypervisor Timer\n"); vmm_timer_stop(); /* FIXME: Do other cleanup stuff. */ /* Issue board reset */ vmm_printf("Issuing Board Reset\n"); if ((rc = arch_board_reset())) { vmm_panic("Error: Board reset failed.\n"); } /* Wait here. Nothing else to do. */ vmm_hang(); }
void __init cpu_init(void) { #if defined(CONFIG_SMP) u32 cpu = vmm_smp_processor_id(); #if defined(ARCH_HAS_DEFTERM_EARLY_PRINT) arch_defterm_early_putc('0'+cpu); #endif if (!cpu) { /* Primary CPU */ vmm_init(); } else { /* Secondary CPUs */ vmm_init_secondary(); } #else /* Initialize VMM (APIs only available after this) */ vmm_init(); #endif /* We will never come back here. */ vmm_hang(); }
void vmm_init(void) { int ret; #if defined(CONFIG_SMP) u32 c; #endif u32 cpu = vmm_smp_processor_id(); struct vmm_work sysinit; /* Mark this CPU possible & present */ vmm_set_cpu_possible(cpu, TRUE); vmm_set_cpu_present(cpu, TRUE); /* Print version string */ vmm_printf("\n"); vmm_printf("%s v%d.%d.%d (%s %s)\n", VMM_NAME, VMM_VERSION_MAJOR, VMM_VERSION_MINOR, VMM_VERSION_RELEASE, __DATE__, __TIME__); vmm_printf("\n"); /* Initialize host virtual address space */ vmm_printf("Initialize Host Address Space\n"); ret = vmm_host_aspace_init(); if (ret) { vmm_hang(); } /* Initialize heap */ vmm_printf("Initialize Heap Management\n"); ret = vmm_heap_init(); if (ret) { vmm_hang(); } /* Initialize per-cpu area */ vmm_printf("Initialize PerCPU Areas\n"); ret = vmm_percpu_init(); if (ret) { vmm_hang(); } /* Initialize device tree */ vmm_printf("Initialize Device Tree\n"); ret = vmm_devtree_init(); if (ret) { vmm_hang(); } /* Initialize host interrupts */ vmm_printf("Initialize Host IRQ\n"); ret = vmm_host_irq_init(); if (ret) { vmm_hang(); } /* Initialize CPU early */ vmm_printf("Initialize CPU Early\n"); ret = arch_cpu_early_init(); if (ret) { vmm_hang(); } /* Initialize Board early */ vmm_printf("Initialize Board Early\n"); ret = arch_board_early_init(); if (ret) { vmm_hang(); } /* Initialize standerd input/output */ vmm_printf("Initialize Standard I/O\n"); ret = vmm_stdio_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Initialize clocksource manager */ vmm_printf("Initialize Clocksource Manager\n"); ret = vmm_clocksource_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Initialize clockchip manager */ vmm_printf("Initialize Clockchip Manager\n"); ret = vmm_clockchip_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Initialize hypervisor timer */ vmm_printf("Initialize Hypervisor Timer\n"); ret = vmm_timer_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Initialize soft delay */ vmm_printf("Initialize Soft Delay\n"); ret = vmm_delay_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Initialize hypervisor manager */ vmm_printf("Initialize Hypervisor Manager\n"); ret = vmm_manager_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Initialize hypervisor scheduler */ vmm_printf("Initialize Hypervisor Scheduler\n"); ret = vmm_scheduler_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Initialize hypervisor threads */ vmm_printf("Initialize Hypervisor Threads\n"); ret = vmm_threads_init(); if (ret) { vmm_panic("Error %d\n", ret); } #ifdef CONFIG_PROFILE /* Intialize hypervisor profiler */ vmm_printf("Initialize Hypervisor Profiler\n"); ret = vmm_profiler_init(); if (ret) { vmm_panic("Error %d\n", ret); } #endif #if defined(CONFIG_SMP) /* Initialize inter-processor interrupts */ vmm_printf("Initialize Inter Processor Interrupts\n") ret = vmm_smp_ipi_init(); if (ret) { vmm_hang(); } /* Initialize secondary CPUs */ vmm_printf("Initialize Secondary CPUs\n"); ret = arch_smp_init_cpus(); if (ret) { vmm_panic("Error %d\n", ret); } /* Prepare secondary CPUs */ ret = arch_smp_prepare_cpus(vmm_num_possible_cpus()); if (ret) { vmm_panic("Error %d\n", ret); } /* Start each present secondary CPUs */ for_each_present_cpu(c) { if (c == cpu) { continue; } ret = arch_smp_start_cpu(c); if (ret) { vmm_printf("Failed to start CPU%d\n", ret); } } /* Initialize hypervisor load balancer */ vmm_printf("Initialize Hypervisor Load Balancer\n"); ret = vmm_loadbal_init(); if (ret) { vmm_panic("Error %d\n", ret); } #endif /* Initialize workqueue framework */ vmm_printf("Initialize Workqueue Framework\n"); ret = vmm_workqueue_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Initialize wallclock */ vmm_printf("Initialize Wallclock Subsystem\n"); ret = vmm_wallclock_init(); if (ret) { vmm_panic("Error %d\n", ret); } /* Schedule system initialization work */ INIT_WORK(&sysinit, &system_init_work); vmm_workqueue_schedule_work(NULL, &sysinit); /* Start timer (Must be last step) */ vmm_timer_start(); /* Wait here till scheduler gets invoked by timer */ vmm_hang(); }