summaryrefslogtreecommitdiff
path: root/core/minute-ia/irq_handler.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/minute-ia/irq_handler.h')
-rw-r--r--core/minute-ia/irq_handler.h89
1 files changed, 25 insertions, 64 deletions
diff --git a/core/minute-ia/irq_handler.h b/core/minute-ia/irq_handler.h
index b691dc71fb..1d44a577bd 100644
--- a/core/minute-ia/irq_handler.h
+++ b/core/minute-ia/irq_handler.h
@@ -11,35 +11,11 @@
#include "registers.h"
#include "task_defs.h"
-#ifdef CONFIG_FPU
-#define save_fpu_ctx "movl "USE_FPU_OFFSET_STR"(%eax), %ebx\n" \
- "test %ebx, %ebx\n" \
- "jz 9f\n" \
- "fnsave "FPU_CTX_OFFSET_STR"(%eax)\n" \
- "9:\n"
-
-#define rstr_fpu_ctx "movl "USE_FPU_OFFSET_STR"(%eax), %ebx\n" \
- "test %ebx, %ebx\n" \
- "jz 9f\n" \
- "frstor "FPU_CTX_OFFSET_STR"(%eax)\n" \
- "9:\n"
-#else
-#define save_fpu_ctx
-#define rstr_fpu_ctx
-#endif
-
-#ifdef CONFIG_TASK_PROFILING
-#define task_start_irq_handler_call(vector) \
- "push $"#vector"\n" \
- "call task_start_irq_handler\n" \
- "addl $0x4, %esp\n"
-#else
-#define task_start_irq_handler_call(vector)
-#endif
-
+asm (".include \"core/minute-ia/irq_handler_common.S\"");
struct irq_data {
void (*routine)(void);
+ void (*ioapic_routine)(void);
int irq;
};
@@ -55,43 +31,28 @@ struct irq_data {
* Note: currently we don't allow nested irq handling
*/
#define DECLARE_IRQ(irq, routine) DECLARE_IRQ_(irq, routine, irq + 32 + 10)
-/* Each irq has a irq_data structure placed in .rodata.irqs section,
- * to be used for dynamically setting up interrupt gates */
-#define DECLARE_IRQ_(irq, routine, vector) \
- void __keep routine(void); \
- void IRQ_HANDLER(irq)(void); \
- __asm__ (".section .rodata.irqs\n"); \
- const struct irq_data __keep CONCAT4(__irq_, irq, _, routine) \
- __attribute__((section(".rodata.irqs")))= {IRQ_HANDLER(irq), irq};\
- __asm__ ( \
- ".section .text._irq_"#irq"_handler\n" \
- "_irq_"#irq"_handler:\n" \
- "pusha\n" \
- ASM_LOCK_PREFIX "addl $1, __in_isr\n" \
- "movl %esp, %eax\n" \
- "movl $stack_end, %esp\n" \
- "push %eax\n" \
- task_start_irq_handler_call(vector) \
- "call "#routine"\n" \
- "push $0\n" \
- "push $0\n" \
- "call switch_handler\n" \
- "addl $0x08, %esp\n" \
- "pop %esp\n" \
- "test %eax, %eax\n" \
- "je 1f\n" \
- "movl current_task, %eax\n" \
- save_fpu_ctx \
- "movl %esp, (%eax)\n" \
- "movl next_task, %eax\n" \
- "movl %eax, current_task\n" \
- "movl (%eax), %esp\n" \
- rstr_fpu_ctx \
- "1:\n" \
- "movl $"#vector ", (0xFEC00040)\n" \
- "movl $0x00, (0xFEE000B0)\n" \
- ASM_LOCK_PREFIX "subl $1, __in_isr\n" \
- "popa\n" \
- "iret\n" \
+/*
+ * Each irq has a irq_data structure placed in .rodata.irqs section,
+ * to be used for dynamically setting up interrupt gates
+ */
+#define DECLARE_IRQ_(irq, routine, vector) \
+ void __keep routine(void); \
+ void IRQ_HANDLER(irq)(void); \
+ __asm__ (".section .rodata.irqs\n"); \
+ const struct irq_data __keep CONCAT4(__irq_, irq, _, routine) \
+ __attribute__((section(".rodata.irqs"))) = { routine, \
+ IRQ_HANDLER(irq), \
+ irq}; \
+ __asm__ ( \
+ ".section .text._irq_"#irq"_handler\n" \
+ "_irq_"#irq"_handler:\n" \
+ "pusha\n" \
+ ASM_LOCK_PREFIX "addl $1, __in_isr\n" \
+ "irq_handler_common $0 $0 $"#irq"\n" \
+ "movl $"#vector ", " STRINGIFY(IOAPIC_EOI_REG) "\n" \
+ "movl $0x00, " STRINGIFY(LAPIC_EOI_REG) "\n" \
+ ASM_LOCK_PREFIX "subl $1, __in_isr\n" \
+ "popa\n" \
+ "iret\n" \
);
#endif /* __CROS_EC_IRQ_HANDLER_H */