/* * __ipipe_enable_pipeline() -- We are running on the boot CPU, hw * interrupts are off, and secondary CPUs are still lost in space. */ void __ipipe_enable_pipeline(void) { unsigned irq; __ipipe_core_clock = get_cclk(); /* Fetch this once. */ __ipipe_freq_scale = 1000000000UL / __ipipe_core_clock; for (irq = 0; irq < NR_IRQS; ++irq) ipipe_virtualize_irq(ipipe_root_domain, irq, (ipipe_irq_handler_t)&asm_do_IRQ, NULL, &__ipipe_ack_irq, IPIPE_HANDLE_MASK | IPIPE_PASS_MASK); }
void __init __ipipe_enable_pipeline(void) { unsigned int vector, irq; #ifdef CONFIG_X86_LOCAL_APIC /* Map the APIC system vectors. */ ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(LOCAL_TIMER_VECTOR), (ipipe_irq_handler_t)&smp_apic_timer_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(SPURIOUS_APIC_VECTOR), (ipipe_irq_handler_t)&smp_spurious_interrupt, NULL, &__ipipe_noack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(ERROR_APIC_VECTOR), (ipipe_irq_handler_t)&smp_error_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR0), &__ipipe_null_handler, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR1), &__ipipe_null_handler, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR2), &__ipipe_null_handler, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(IPIPE_SERVICE_VECTOR3), &__ipipe_null_handler, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); #ifdef CONFIG_X86_THERMAL_VECTOR ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(THERMAL_APIC_VECTOR), (ipipe_irq_handler_t)&smp_thermal_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); #endif /* CONFIG_X86_THERMAL_VECTOR */ #ifdef CONFIG_X86_MCE_THRESHOLD ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(THRESHOLD_APIC_VECTOR), (ipipe_irq_handler_t)&smp_threshold_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); #endif /* CONFIG_X86_MCE_THRESHOLD */ #ifdef CONFIG_X86_NEW_MCE ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(MCE_SELF_VECTOR), (ipipe_irq_handler_t)&smp_mce_self_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); #endif /* CONFIG_X86_MCE_THRESHOLD */ #ifdef CONFIG_X86_UV ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(UV_BAU_MESSAGE), (ipipe_irq_handler_t)&uv_bau_message_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); #endif /* CONFIG_X86_UV */ ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(X86_PLATFORM_IPI_VECTOR), (ipipe_irq_handler_t)&smp_x86_platform_ipi, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); #ifdef CONFIG_IRQ_WORK ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(IRQ_WORK_VECTOR), (ipipe_irq_handler_t)&irq_work_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); #endif /* CONFIG_IRQ_WORK */ #endif /* CONFIG_X86_LOCAL_APIC */ #ifdef CONFIG_SMP ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(RESCHEDULE_VECTOR), (ipipe_irq_handler_t)&smp_reschedule_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); for (vector = INVALIDATE_TLB_VECTOR_START; vector <= INVALIDATE_TLB_VECTOR_END; ++vector) ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(vector), (ipipe_irq_handler_t)&smp_invalidate_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(CALL_FUNCTION_VECTOR), (ipipe_irq_handler_t)&smp_call_function_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(CALL_FUNCTION_SINGLE_VECTOR), (ipipe_irq_handler_t)&smp_call_function_single_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, IRQ_MOVE_CLEANUP_VECTOR, (ipipe_irq_handler_t)&smp_irq_move_cleanup_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ipipe_apic_vector_irq(REBOOT_VECTOR), (ipipe_irq_handler_t)&smp_reboot_interrupt, NULL, &__ipipe_ack_apic, IPIPE_STDROOT_MASK); #else (void)vector; #endif /* CONFIG_SMP */ /* Finally, virtualize the remaining ISA and IO-APIC * interrupts. Interrupts which have already been virtualized * will just beget a silent -EPERM error since * IPIPE_SYSTEM_MASK has been passed for them, that's ok. */ for (irq = 0; irq < NR_IRQS; irq++) /* * Fails for IPIPE_CRITICAL_IPI and IRQ_MOVE_CLEANUP_VECTOR, * but that's ok. */ ipipe_virtualize_irq(ipipe_root_domain, irq, (ipipe_irq_handler_t)&do_IRQ, NULL, &__ipipe_ack_irq, IPIPE_STDROOT_MASK); #ifdef CONFIG_X86_LOCAL_APIC /* Eventually allow these vectors to be reprogrammed. */ ipipe_root_domain->irqs[IPIPE_SERVICE_IPI0].control &= ~IPIPE_SYSTEM_MASK; ipipe_root_domain->irqs[IPIPE_SERVICE_IPI1].control &= ~IPIPE_SYSTEM_MASK; ipipe_root_domain->irqs[IPIPE_SERVICE_IPI2].control &= ~IPIPE_SYSTEM_MASK; ipipe_root_domain->irqs[IPIPE_SERVICE_IPI3].control &= ~IPIPE_SYSTEM_MASK; #endif /* CONFIG_X86_LOCAL_APIC */ }
void __init __ipipe_enable_pipeline(void) { unsigned irq; #ifdef CONFIG_X86_LOCAL_APIC /* Map the APIC system vectors. */ ipipe_virtualize_irq(ipipe_root_domain, LOCAL_TIMER_VECTOR - FIRST_EXTERNAL_VECTOR, (ipipe_irq_handler_t)&smp_apic_timer_interrupt, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, SPURIOUS_APIC_VECTOR - FIRST_EXTERNAL_VECTOR, (ipipe_irq_handler_t)&smp_spurious_interrupt, NULL, &__ipipe_noack_irq, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, ERROR_APIC_VECTOR - FIRST_EXTERNAL_VECTOR, (ipipe_irq_handler_t)&smp_error_interrupt, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, IPIPE_SERVICE_VECTOR0 - FIRST_EXTERNAL_VECTOR, &__ipipe_null_handler, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, IPIPE_SERVICE_VECTOR1 - FIRST_EXTERNAL_VECTOR, &__ipipe_null_handler, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, IPIPE_SERVICE_VECTOR2 - FIRST_EXTERNAL_VECTOR, &__ipipe_null_handler, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, IPIPE_SERVICE_VECTOR3 - FIRST_EXTERNAL_VECTOR, &__ipipe_null_handler, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); __ipipe_tick_irq = using_apic_timer ? LOCAL_TIMER_VECTOR - FIRST_EXTERNAL_VECTOR : 0; #else /* !CONFIG_X86_LOCAL_APIC */ __ipipe_tick_irq = 0; #endif /* CONFIG_X86_LOCAL_APIC */ #ifdef CONFIG_SMP ipipe_virtualize_irq(ipipe_root_domain, RESCHEDULE_VECTOR - FIRST_EXTERNAL_VECTOR, (ipipe_irq_handler_t)&smp_reschedule_interrupt, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, INVALIDATE_TLB_VECTOR - FIRST_EXTERNAL_VECTOR, (ipipe_irq_handler_t)&smp_invalidate_interrupt, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); ipipe_virtualize_irq(ipipe_root_domain, CALL_FUNCTION_VECTOR - FIRST_EXTERNAL_VECTOR, (ipipe_irq_handler_t)&smp_call_function_interrupt, NULL, &__ipipe_ack_system_irq, IPIPE_STDROOT_MASK); /* Some guest O/S may run tasks over non-Linux stacks, so we * cannot rely on the regular definition of smp_processor_id() * on x86 to fetch the logical cpu id. We fix this by using * our own private physical apicid -> logicial cpuid mapping * as soon as the pipeline is enabled, so that * ipipe_processor_id() always do the right thing, regardless * of the current stack setup. Also note that the pipeline is * enabled after the APIC space has been mapped in * trap_init(), so it's safe to use it. */ __ipipe_logical_cpuid = &__ipipe_hard_cpuid; #endif /* CONFIG_SMP */ /* Finally, virtualize the remaining ISA and IO-APIC * interrupts. Interrupts which have already been virtualized * will just beget a silent -EPERM error since * IPIPE_SYSTEM_MASK has been passed for them, that's ok. */ for (irq = 0; irq < NR_IRQS; irq++) { /* Fails for IPIPE_CRITICAL_IPI but that's ok. */ ipipe_virtualize_irq(ipipe_root_domain, irq, (ipipe_irq_handler_t)&do_IRQ, NULL, &__ipipe_ack_common_irq, IPIPE_STDROOT_MASK); } #ifdef CONFIG_X86_LOCAL_APIC /* Eventually allow these vectors to be reprogrammed. */ ipipe_root_domain->irqs[IPIPE_SERVICE_IPI0].control &= ~IPIPE_SYSTEM_MASK; ipipe_root_domain->irqs[IPIPE_SERVICE_IPI1].control &= ~IPIPE_SYSTEM_MASK; ipipe_root_domain->irqs[IPIPE_SERVICE_IPI2].control &= ~IPIPE_SYSTEM_MASK; ipipe_root_domain->irqs[IPIPE_SERVICE_IPI3].control &= ~IPIPE_SYSTEM_MASK; #endif /* CONFIG_X86_LOCAL_APIC */ }