diff options
Diffstat (limited to 'x86_64/interrupt.S')
-rw-r--r-- | x86_64/interrupt.S | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/x86_64/interrupt.S b/x86_64/interrupt.S index 31f386ec..eabf934e 100644 --- a/x86_64/interrupt.S +++ b/x86_64/interrupt.S @@ -42,6 +42,9 @@ ENTRY(interrupt) #ifdef APIC cmpl $255,%eax /* was this a spurious intr? */ je _no_eoi /* if so, just return */ + + cmpl $CALL_SINGLE_FUNCTION_BASE,%eax /* was this a SMP call single function request? */ + je _call_single #endif subq $16,%rsp /* Two local variables */ movl %eax,S_IRQ /* save irq number */ @@ -112,6 +115,13 @@ ENTRY(interrupt) _isa_eoi: movl %ecx,%edi /* load irq number as 1st arg */ call EXT(ioapic_irq_eoi) /* ioapic irq specific EOI */ + addq $16,%rsp /* pop local variables */ + ret +_call_single: + cli /* no nested interrupts */ + call EXT(lapic_eoi) /* lapic EOI before the handler to allow extra update */ + call EXT(pmap_update_interrupt) /* TODO: Allow other functions */ + ret #endif addq $16,%rsp /* pop local variables */ _no_eoi: |