X-Git-Url: https://pd.if.org/git/?p=zos;a=blobdiff_plain;f=interrupt.h;fp=interrupt.h;h=26922ef1fde26e48b0fbb8062502c23d196c22b0;hp=0000000000000000000000000000000000000000;hb=120ce15fac48f7aceac231ea3fcdcade26093e7b;hpb=4bfc87356b0316256d2eaf91497973dbddcd2db7 diff --git a/interrupt.h b/interrupt.h new file mode 100644 index 0000000..26922ef --- /dev/null +++ b/interrupt.h @@ -0,0 +1,127 @@ +#ifndef _SYS_INTERRUPT_H_ +#define _SYS_INTERRUPT_H_ + +#include + +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