]> pd.if.org Git - zos/blobdiff - interrupt.h
interrupt setup and handling
[zos] / interrupt.h
diff --git a/interrupt.h b/interrupt.h
new file mode 100644 (file)
index 0000000..26922ef
--- /dev/null
@@ -0,0 +1,127 @@
+#ifndef _SYS_INTERRUPT_H_
+#define _SYS_INTERRUPT_H_
+
+#include <stddef.h>
+
+struct interrupt_context {
+       /* pushed on the stack, before the handler is called */
+       uint64_t kerrno;
+       uint64_t cr2;
+       uint64_t rdi;
+       uint64_t rsi;
+       uint64_t rbp;
+       uint64_t not_rsp;
+       uint64_t rbx;
+       uint64_t rdx;
+       uint64_t rcx;
+       uint64_t rax;
+       uint64_t r8;
+       uint64_t r9;
+       uint64_t r10;
+       uint64_t r11;
+       uint64_t r12;
+       uint64_t r13;
+       uint64_t r14;
+       uint64_t r15;
+       /* assembly interrupt trampoline handles these */
+       uint64_t int_no;
+       uint64_t err_code;
+       /* following pushed onto stack by CPU */
+       uint64_t rip;
+       uint64_t cs;
+       uint64_t rflags;
+       uint64_t rsp;
+       uint64_t ss;
+};
+
+struct interrupt_handler {
+       void (*handler)(struct interrupt_context *, void *);
+       void *context;
+       struct interrupt_handler *next;
+       struct interrupt_handler *prev;
+};
+
+void interrupt_handler_null();
+void isr128();
+void isr129();
+void isr0();
+void isr1();
+void isr2();
+void isr3();
+void isr4();
+void isr5();
+void isr6();
+void isr7();
+void isr8();
+void isr9();
+void isr10();
+void isr11();
+void isr12();
+void isr13();
+void isr14();
+void isr15();
+void isr16();
+void isr17();
+void isr18();
+void isr19();
+void isr20();
+void isr21();
+void isr22();
+void isr23();
+void isr24();
+void isr25();
+void isr26();
+void isr27();
+void isr28();
+void isr29();
+void isr30();
+void isr31();
+void isr128();
+void isr130();
+void isr131();
+
+void irq0();
+void irq1();
+void irq2();
+void irq3();
+void irq4();
+void irq5();
+void irq6();
+void irq7();
+void irq8();
+void irq9();
+void irq10();
+void irq11();
+void irq12();
+void irq13();
+void irq14();
+void irq15();
+
+#define IRQ0 32
+#define IRQ1 33
+#define IRQ2 34
+#define IRQ3 35
+#define IRQ4 36
+#define IRQ5 37
+#define IRQ6 38
+#define IRQ7 39
+#define IRQ8 40
+#define IRQ9 41
+#define IRQ10 42
+#define IRQ11 43
+#define IRQ12 44
+#define IRQ13 45
+#define IRQ14 46
+#define IRQ15 47
+
+void init_interrupts();
+
+int interrupts_enabled(); 
+void enable_interrupts();
+void disable_interrupts(); 
+int interrupts_set(int enable);
+
+void interrupt_add_handler(unsigned int intno, struct interrupt_handler *handler);
+void interrupt_remove_handler(unsigned int intno, struct interrupt_handler *handler);
+
+#endif