commit f725f4dd2163eba563bd2346933562a19c06593c
parent 90c35e3098bfe4101314687b8f8590d4cf11d184
Author: Christos Margiolis <christos@margiolis.net>
Date: Mon, 29 Nov 2021 03:34:57 +0200
simplify intr.s with INTVEC
Diffstat:
M | kern/idt.c | | | 125 | ++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- |
M | kern/idt.h | | | 2 | ++ |
M | kern/intr.s | | | 123 | ++++++++++++++++++++++++++++--------------------------------------------------- |
3 files changed, 128 insertions(+), 122 deletions(-)
diff --git a/kern/idt.c b/kern/idt.c
@@ -66,12 +66,15 @@ pic_remap(void)
outb(PIC_MASTER_DATA, 0x00);
}
-extern void ex_div, ex_dbg, ex_nmsk, ex_bpt, ex_ofl, ex_bnd, ex_ill, ex_dna,
- ex_dbl, ex_fpusegm, ex_tss, ex_missing, ex_stk, ex_prot, ex_page, ex_rsvd,
- ex_fpu, ex_align, ex_mchk, ex_simd;
+extern void INTVEC(div), INTVEC(dbg), INTVEC(nmsk), INTVEC(bpt), INTVEC(ofl),
+ INTVEC(bnd), INTVEC(ill), INTVEC(dna), INTVEC(dbl), INTVEC(fpusegm),
+ INTVEC(tss), INTVEC(missing), INTVEC(stk), INTVEC(prot), INTVEC(page),
+ INTVEC(rsvd), INTVEC(fpu), INTVEC(align), INTVEC(mchk), INTVEC(simd);
-extern void irq0, irq1, irq2, irq3, irq4, irq5, irq6, irq7, irq8, irq9, irq10,
- irq11, irq12, irq13, irq14, irq15;
+extern void INTVEC(irq0), INTVEC(irq1), INTVEC(irq2), INTVEC(irq3),
+ INTVEC(irq4), INTVEC(irq5), INTVEC(irq6), INTVEC(irq7), INTVEC(irq8),
+ INTVEC(irq9), INTVEC(irq10), INTVEC(irq11), INTVEC(irq12), INTVEC(irq13),
+ INTVEC(irq14), INTVEC(irq15);
void
idt_init(void)
@@ -80,49 +83,85 @@ idt_init(void)
int i;
for (i = 0; i < NINT; i++)
- idt_set_gate(&idt[i], &ex_rsvd, SEL_KCODE,
+ idt_set_gate(&idt[i], &INTVEC(rsvd), SEL_KCODE,
GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 0], &ex_div, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 1], &ex_dbg, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 2], &ex_nmsk, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 3], &ex_bpt, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 4], &ex_ofl, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 5], &ex_bnd, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 6], &ex_ill, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 7], &ex_dna, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 8], &ex_dbl, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[ 9], &ex_fpusegm, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[10], &ex_tss, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[11], &ex_missing, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[12], &ex_stk, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[13], &ex_prot, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[14], &ex_page, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[15], &ex_rsvd, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[16], &ex_fpu, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[17], &ex_align, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[18], &ex_mchk, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[19], &ex_simd, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 0], &INTVEC(div), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 1], &INTVEC(dbg), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 2], &INTVEC(nmsk), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 3], &INTVEC(bpt), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 4], &INTVEC(ofl), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 5], &INTVEC(bnd), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 6], &INTVEC(ill), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 7], &INTVEC(dna), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 8], &INTVEC(dbl), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[ 9], &INTVEC(fpusegm), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[10], &INTVEC(tss), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[11], &INTVEC(missing), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[12], &INTVEC(stk), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[13], &INTVEC(prot), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[14], &INTVEC(page), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[15], &INTVEC(rsvd), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[16], &INTVEC(fpu), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[17], &INTVEC(align), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[18], &INTVEC(mchk), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[19], &INTVEC(simd), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
/* 20 - 31 are reserved. */
pic_remap();
/* FIXME: how is this related to irq 0 -> timer etc? */
- idt_set_gate(&idt[32], &irq0, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[33], &irq1, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[34], &irq2, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[35], &irq3, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[36], &irq4, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[37], &irq5, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[38], &irq6, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[39], &irq7, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[40], &irq8, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[41], &irq9, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[42], &irq10, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[43], &irq11, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[44], &irq12, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[45], &irq13, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[46], &irq14, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
- idt_set_gate(&idt[47], &irq15, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[32], &INTVEC(irq0), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[33], &INTVEC(irq1), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[34], &INTVEC(irq2), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[35], &INTVEC(irq3), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[36], &INTVEC(irq4), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[37], &INTVEC(irq5), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[38], &INTVEC(irq6), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[39], &INTVEC(irq7), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[40], &INTVEC(irq8), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[41], &INTVEC(irq9), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[42], &INTVEC(irq10), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[43], &INTVEC(irq11), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[44], &INTVEC(irq12), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[45], &INTVEC(irq13), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[46], &INTVEC(irq14), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
+ idt_set_gate(&idt[47], &INTVEC(irq15), SEL_KCODE,
+ GT_FLAGS(PL_KERN, TP_386IGT));
/*idt_set_gate(&idt[127], &syscall, SEL_KCODE, GT_FLAGS(PL_KERN, TP_386IGT));*/
@@ -136,7 +175,7 @@ static const char *exceptmsg[] = {
"Debug Exception",
"Non Maskable Interrupt Exception",
"Breakpoint Exception",
- "Into Detected Overflow Exception",
+ "Detected Overflow Exception",
"Out of Bounds Exception",
"Invalid Opcode Exception",
"No Coprocessor Exception",
diff --git a/kern/idt.h b/kern/idt.h
@@ -1,6 +1,8 @@
#ifndef _KERNEL_IDT_H_
#define _KERNEL_IDT_H_
+#define INTVEC(name) __CONCAT(intr_, name)
+
/* IA-32 */
struct gate_desc {
uint16_t gd_off_lo;
diff --git a/kern/intr.s b/kern/intr.s
@@ -1,97 +1,62 @@
; Defined in `idt.h`.
[extern intr_handler]
-global ex_div
-global ex_dbg
-global ex_nmsk
-global ex_bpt
-global ex_ofl
-global ex_bnd
-global ex_ill
-global ex_dna
-global ex_dbl
-global ex_fpusegm
-global ex_tss
-global ex_missing
-global ex_stk
-global ex_prot
-global ex_page
-global ex_rsvd
-global ex_fpu
-global ex_align
-global ex_mchk
-global ex_simd
-
-; IRQs
-global irq0
-global irq1
-global irq2
-global irq3
-global irq4
-global irq5
-global irq6
-global irq7
-global irq8
-global irq9
-global irq10
-global irq11
-global irq12
-global irq13
-global irq14
-global irq15
-
-%macro intr_noerr 1
+%macro intr_noerr 2
+global intr_%1
+intr_%1:
cli
push byte 0
- push byte %1
+ push byte %2
jmp intr_common_stub
%endmacro
-%macro intr_err 1
+%macro intr_err 2
+global intr_%1
+intr_%1:
cli
- push byte %1
+ push byte %2
jmp intr_common_stub
%endmacro
; Exceptions
-ex_div: intr_noerr 0 ; Division By Zero
-ex_dbg: intr_noerr 1 ; Debug
-ex_nmsk: intr_noerr 2 ; Non Maskable Interrupt
-ex_bpt: intr_noerr 3 ; Breakpoint
-ex_ofl: intr_noerr 4 ; Into Detected Overflow
-ex_bnd: intr_noerr 5 ; Out of Bounds
-ex_ill: intr_noerr 6 ; Invalid Opcode
-ex_dna: intr_noerr 7 ; No Coprocessor
-ex_dbl: intr_err 8 ; Double Fault (with error code)
-ex_fpusegm: intr_noerr 9 ; Coprocessor Segment Overrrun
-ex_tss: intr_err 10 ; Bad TSS (with error code)
-ex_missing: intr_err 11 ; Segment Not Present (with error code)
-ex_stk: intr_err 12 ; Stack Fault (with error code)
-ex_prot: intr_err 13 ; General Protection Fault (with error code)
-ex_page: intr_err 14 ; Page Fault (with error code)
-ex_rsvd: intr_noerr 15 ; Unkown Interrupt
-ex_fpu: intr_noerr 16 ; Coprocessor Fault
-ex_align: intr_noerr 17 ; Alignment Check (486+)
-ex_mchk: intr_noerr 18 ; Machine Check (Pentium/586+)
-ex_simd: intr_noerr 19 ; Reserved ; FIXME: ??
+intr_noerr div, 0 ; Division By Zero
+intr_noerr dbg, 1 ; Debug
+intr_noerr nmsk, 2 ; Non Maskable Interrupt
+intr_noerr bpt, 3 ; Breakpoint
+intr_noerr ofl, 4 ; Into Detected Overflow
+intr_noerr bnd, 5 ; Out of Bounds
+intr_noerr ill, 6 ; Invalid Opcode
+intr_noerr dna, 7 ; No Coprocessor
+intr_err dbl, 8 ; Double Fault (with error code)
+intr_noerr fpusegm,9 ; Coprocessor Segment Overrrun
+intr_err tss, 10 ; Bad TSS (with error code)
+intr_err missing,11 ; Segment Not Present (with error code)
+intr_err stk, 12 ; Stack Fault (with error code)
+intr_err prot, 13 ; General Protection Fault (with error code)
+intr_err page, 14 ; Page Fault (with error code)
+intr_noerr rsvd, 15 ; Unkown Interrupt
+intr_noerr fpu, 16 ; Coprocessor Fault
+intr_noerr align, 17 ; Alignment Check (486+)
+intr_noerr mchk, 18 ; Machine Check (Pentium/586+)
+intr_noerr simd, 19 ; Reserved ; FIXME: ??
; IRQs
-irq0: intr_noerr 32 ; Programmable Interrupt Timer
-irq1: intr_noerr 33 ; Keyboard
-irq2: intr_noerr 34 ; Cascade (used internally by the two PICs, never raised)
-irq3: intr_noerr 35 ; COM2 (if enabled)
-irq4: intr_noerr 36 ; COM1 (if enabled)
-irq5: intr_noerr 37 ; LPT2 (if enabled)
-irq6: intr_noerr 38 ; Floppy Disk
-irq7: intr_noerr 39 ; LPT1
-irq8: intr_noerr 40 ; CMOS real-time clock (if enabled)
-irq9: intr_noerr 41 ; Peripherals / Legacy SCSI / NIC
-irq10: intr_noerr 42 ; Peripherals / SCSI / NIC
-irq11: intr_noerr 43 ; Peripherals / SCSI / NIC
-irq12: intr_noerr 44 ; PS2 Mouse
-irq13: intr_noerr 45 ; FPU / Coprocessor / Inter-processor
-irq14: intr_noerr 46 ; Primary ATA Hard Disk
-irq15: intr_noerr 47 ; Secondary ATA Hard Disk
+intr_noerr irq0, 32 ; Programmable Interrupt Timer
+intr_noerr irq1, 33 ; Keyboard
+intr_noerr irq2, 34 ; Cascade (used internally by the two PICs, never raised)
+intr_noerr irq3, 35 ; COM2 (if enabled)
+intr_noerr irq4, 36 ; COM1 (if enabled)
+intr_noerr irq5, 37 ; LPT2 (if enabled)
+intr_noerr irq6, 38 ; Floppy Disk
+intr_noerr irq7, 39 ; LPT1
+intr_noerr irq8, 40 ; CMOS real-time clock (if enabled)
+intr_noerr irq9, 41 ; Peripherals / Legacy SCSI / NIC
+intr_noerr irq10, 42 ; Peripherals / SCSI / NIC
+intr_noerr irq11, 43 ; Peripherals / SCSI / NIC
+intr_noerr irq12, 44 ; PS2 Mouse
+intr_noerr irq13, 45 ; FPU / Coprocessor / Inter-processor
+intr_noerr irq14, 46 ; Primary ATA Hard Disk
+intr_noerr irq15, 47 ; Secondary ATA Hard Disk
; Save the processor state, call the C interrupt handler and restore the
; stack frame.