summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/interrupts.c66
-rw-r--r--kernel/kernel.c64
2 files changed, 65 insertions, 65 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index c3ff513..3404228 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -53,6 +53,48 @@ void int_def_handler()
X86_IRQ_END
}
+void int_irq0(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Divide by 0"); X86_IRQ_END }
+void int_irq1(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Single step (debugger)"); X86_IRQ_END }
+void int_irq2(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Non Maskable Interrupt"); X86_IRQ_END }
+void int_irq3(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Breakpoint (debugger)"); X86_IRQ_END }
+void int_irq4(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Overflow"); X86_IRQ_END }
+void int_irq5(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Bounds check"); X86_IRQ_END }
+void int_irq6(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Undefined OP Code"); X86_IRQ_END }
+void int_irq7(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"No coprocessor"); X86_IRQ_END }
+void int_irq8(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Double Fault"); X86_IRQ_END }
+void int_irq9(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Coprocessor Segment Overrun"); X86_IRQ_END }
+void int_irq10(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Invalid TSS"); X86_IRQ_END }
+void int_irq11(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Segment Not Present"); X86_IRQ_END }
+void int_irq12(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Stack Segment Overrun"); X86_IRQ_END }
+
+void show_error(uint32_t err)
+{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"interrupt error code: 0x%08x",err);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"External Event: %x",err&0b001);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Location: %x",err&0b110);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Selector: %x",err&0b1111111111111000);
+}
+
+void int_irq13()
+{
+ X86_IRQ_BEGIN
+
+ uint32_t err;
+ asm("pop %eax"); // get Error Code
+ asm ("mov %%eax, %0":"=r"(err));
+ show_error(err);
+
+ panic(FOOLOS_MODULE_NAME,"General Protection Fault");
+
+ X86_IRQ_END
+}
+
+void int_irq14(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Page Fault"); X86_IRQ_END }
+void int_irq15(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Unassigned"); X86_IRQ_END }
+void int_irq16(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Coprocessor error"); X86_IRQ_END }
+void int_irq17(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Alignment Check"); X86_IRQ_END }
+void int_irq18(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Machine Check"); X86_IRQ_END }
+
//set a handler for a specific interrupt
void int_install_ir(int irq, uint16_t flags, uint16_t sel, void *addr)
{
@@ -71,13 +113,35 @@ void int_install_ir(int irq, uint16_t flags, uint16_t sel, void *addr)
// set default handler for all interrupts for a start
void int_init(uint16_t sel)
{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing. IDT: 0x%08x, IDTD: 0x%08X",&idt,&idtd);
+
int i;
for(i=0; i<INT_MAX; i++)
{
int_install_ir(i, 0b10001110, sel,&int_def_handler);
}
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing. IDT: 0x%08x, IDTD: 0x%08X",&idt,&idtd);
+ // exceptions
+ int_install_ir(0, 0b10001110, 0x08,&int_irq0);
+ int_install_ir(1, 0b10001110, 0x08,&int_irq1);
+ int_install_ir(2, 0b10001110, 0x08,&int_irq2);
+ int_install_ir(3, 0b10001110, 0x08,&int_irq3);
+ int_install_ir(4, 0b10001110, 0x08,&int_irq4);
+ int_install_ir(5, 0b10001110, 0x08,&int_irq5);
+ int_install_ir(6, 0b10001110, 0x08,&int_irq6);
+ int_install_ir(7, 0b10001110, 0x08,&int_irq7);
+ int_install_ir(8, 0b10001110, 0x08,&int_irq8);
+ int_install_ir(9, 0b10001110, 0x08,&int_irq9);
+ int_install_ir(10, 0b10001110, 0x08,&int_irq10);
+ int_install_ir(11, 0b10001110, 0x08,&int_irq11);
+ int_install_ir(12, 0b10001110, 0x08,&int_irq12);
+ int_install_ir(13, 0b10001110, 0x08,&int_irq13);
+ int_install_ir(14, 0b10001110, 0x08,&int_irq14);
+ int_install_ir(15, 0b10001110, 0x08,&int_irq15);
+ int_install_ir(16, 0b10001110, 0x08,&int_irq16);
+ int_install_ir(17, 0b10001110, 0x08,&int_irq17);
+ int_install_ir(18, 0b10001110, 0x08,&int_irq18);
+
}
void int_install()
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 69da50a..35a1321 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -7,56 +7,12 @@
///////
// interrupt handler prototypes
// todo: move somewhere else!?
-void int_def_handler();
void int_clock_handler();
void int_kb_handler();
void int_floppy_handler();
-
uint32_t read_eip();
-void int_irq0(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Divide by 0"); X86_IRQ_END }
-void int_irq1(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Single step (debugger)"); X86_IRQ_END }
-void int_irq2(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Non Maskable Interrupt"); X86_IRQ_END }
-void int_irq3(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Breakpoint (debugger)"); X86_IRQ_END }
-void int_irq4(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Overflow"); X86_IRQ_END }
-void int_irq5(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Bounds check"); X86_IRQ_END }
-void int_irq6(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Undefined OP Code"); X86_IRQ_END }
-void int_irq7(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"No coprocessor"); X86_IRQ_END }
-void int_irq8(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Double Fault"); X86_IRQ_END }
-void int_irq9(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Coprocessor Segment Overrun"); X86_IRQ_END }
-void int_irq10(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Invalid TSS"); X86_IRQ_END }
-void int_irq11(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Segment Not Present"); X86_IRQ_END }
-void int_irq12(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Stack Segment Overrun"); X86_IRQ_END }
-
-void show_error(uint32_t err)
-{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"interrupt error code: 0x%08x",err);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"External Event: %x",err&0b001);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Location: %x",err&0b110);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Selector: %x",err&0b1111111111111000);
-}
-
-void int_irq13()
-{
- X86_IRQ_BEGIN
-
- uint32_t err;
- asm("pop %eax"); // get Error Code
- asm ("mov %%eax, %0":"=r"(err));
- show_error(err);
-
- panic(FOOLOS_MODULE_NAME,"General Protection Fault");
-
- X86_IRQ_END
-}
-
-void int_irq14(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Page Fault"); X86_IRQ_END }
-void int_irq15(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Unassigned"); X86_IRQ_END }
-void int_irq16(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Coprocessor error"); X86_IRQ_END }
-void int_irq17(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Alignment Check"); X86_IRQ_END }
-void int_irq18(){ X86_IRQ_BEGIN panic(FOOLOS_MODULE_NAME,"Machine Check"); X86_IRQ_END }
-
/*
void test_a20()
{
@@ -137,26 +93,6 @@ void kernel_main(uint32_t initial_stack)
// install floppy interrupt handler
int_install_ir(38, 0b10001110, 0x08,&int_floppy_handler);
- // exceptions
- int_install_ir(0, 0b10001110, 0x08,&int_irq0);
- int_install_ir(1, 0b10001110, 0x08,&int_irq1);
- int_install_ir(2, 0b10001110, 0x08,&int_irq2);
- int_install_ir(3, 0b10001110, 0x08,&int_irq3);
- int_install_ir(4, 0b10001110, 0x08,&int_irq4);
- int_install_ir(5, 0b10001110, 0x08,&int_irq5);
- int_install_ir(6, 0b10001110, 0x08,&int_irq6);
- int_install_ir(7, 0b10001110, 0x08,&int_irq7);
- int_install_ir(8, 0b10001110, 0x08,&int_irq8);
- int_install_ir(9, 0b10001110, 0x08,&int_irq9);
- int_install_ir(10, 0b10001110, 0x08,&int_irq10);
- int_install_ir(11, 0b10001110, 0x08,&int_irq11);
- int_install_ir(12, 0b10001110, 0x08,&int_irq12);
- int_install_ir(13, 0b10001110, 0x08,&int_irq13);
- int_install_ir(14, 0b10001110, 0x08,&int_irq14);
- int_install_ir(15, 0b10001110, 0x08,&int_irq15);
- int_install_ir(16, 0b10001110, 0x08,&int_irq16);
- int_install_ir(17, 0b10001110, 0x08,&int_irq17);
- int_install_ir(18, 0b10001110, 0x08,&int_irq18);
// now we can enable interrupts back again
int_enable();