os

Toy OS
git clone git://git.margiolis.net/os.git
Log | Files | Refs | README | LICENSE

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:
Mkern/idt.c | 125++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Mkern/idt.h | 2++
Mkern/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.