Interrupt Handling More
=======================

``SA_SHIRQ`` and IRQ internal
-----------------------------

- struct irq_desc, irqaction
- https://gist.github.com/u1240976/e4358c1ba6dda64e8f41a74bf7689ab

- irq_desc->depth implements nested call of ``disable_irq()/enable_irq()``

``disable_irq()`` v.s. ``local_irq_disable()``
----------------------------------------------

internal:

- ``local_irq_*()`` use CPU instructions to disable CPU receive IRQ.
- ``disable_irq()`` use irqchip feature to disable irqchip send IRQ.

``disable_irq()``::

    kernel/irq/manage.c
    kernel/irq/chip.c

    disable_irq()/disable_irq_nosync() => irq_disable() => irq_chip.irq_disable()

``local_irq_*()`` compatibility in ARM
--------------------------------------

``local_irq_*()`` in ARM

    source file::
    
        include/linux/irqflags.h
        arch/arm/include/asm/irqflags.h
        arch/arm64/include/asm/irqflags.h
    
    各平台實作基於 ``arch_local_irq_save()``.
    
    很多不同平台的 ARM instructions support.
    
    enable/disable::

        1. cpsid / cpsie instructions
        2. CPSR, CPSR_c registers
        3. daifset / daifclr registers

    save/restore::
        
        1. primask register
        2. CPSR_c register
        3. daif register
        
Some Topics/Questions

- How to write a safe interrupt handler?
- trace ``/proc/interrupt`` and ``/proc/stat``.

- ``disable_irq()`` sync problem. why ``disable_irq()`` calls ``__disable_irq_nosync()`` before ``synchronize_irq()``?

Reference
---------

- http://kernel.meizu.com/linux-interrupt.html
- http://kernel.meizu.com/linux-workqueue.html
- http://www.wowotech.net/irq_subsystem/gic_driver.htm