X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=kern%2Fsrc%2Fintr.h;fp=kern%2Fsrc%2Fintr.h;h=569dbd78114735177e0a717a7c870706dd3d5ea9;hb=88e57cf7f2581900eb31cb835a18ad414e37786c;hp=0000000000000000000000000000000000000000;hpb=5145ed1e2adefc9c66e20681532a3a7cd6c2de01;p=eightysix diff --git a/kern/src/intr.h b/kern/src/intr.h new file mode 100644 index 0000000..569dbd7 --- /dev/null +++ b/kern/src/intr.h @@ -0,0 +1,48 @@ +#ifndef INTR_H_ +#define INTR_H_ + +#include +#include "asmutil.h" + +#define IRQ_TO_INUM(x) ((x) + 8) +#define INUM_TO_IRQ(x) ((x) - 8) + +/* general purpose registers, pushed by interrupt entry routine */ +struct registers { + uint16_t di, si, bp, sp; + uint16_t bx, dx, cx, ax; +} __attribute__((packed)); + +struct intr_frame { + /* registers pushed by intr_entry_* */ + struct registers regs; + /* interrupt number */ + uint16_t inum; + /* pushed by CPU during interrupt entry */ + uint16_t ip, cs, flags; +} __attribute__((packed)); + +typedef void (*intr_func_t)(struct intr_frame *frm); + +void init_intr(void); +void dispatch_intr(struct intr_frame frm); + +/* set low level interrupt vector */ +void set_intr_vect(int n, uint16_t seg, uint16_t offs); +/* set interrupt callback */ +void set_intr(int n, intr_func_t func); + +void mask_irq(int n); +void unmask_irq(int n); + +#define end_of_irq(n) \ + asm volatile( \ + "\n\ttest $8, %0" \ + "\n\tjz 0f" \ + "\n\tmov $0x20, %%ax" \ + "\n\tout %%ax, $0xa0" \ + "\n0:\tmov $0x20, %%ax" \ + "\n\tout %%ax, $0x20" \ + :: "a"(n)) + +#endif /* INTR_H_ */