diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-14 10:55:22 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-14 10:55:22 -0500 |
| commit | ef4cc242dc8ad04320d19af22931fcbdbf670c13 (patch) | |
| tree | 50af19ff8e207870e2fdbad6d2a9ea669c901da8 /kernel | |
| parent | ca1c4f58224404d4361e8ca16837e48c88c0ee38 (diff) | |
| download | kappa-ef4cc242dc8ad04320d19af22931fcbdbf670c13.zip kappa-ef4cc242dc8ad04320d19af22931fcbdbf670c13.tar.gz kappa-ef4cc242dc8ad04320d19af22931fcbdbf670c13.tar.bz2 kappa-ef4cc242dc8ad04320d19af22931fcbdbf670c13.tar.xz | |
Stuff
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/irq.h | 1 | ||||
| -rw-r--r-- | kernel/include/timer.h | 1 | ||||
| -rw-r--r-- | kernel/irq-as.S | 7 | ||||
| -rw-r--r-- | kernel/irq.c | 2 | ||||
| -rw-r--r-- | kernel/main.c | 25 | ||||
| -rw-r--r-- | kernel/timer.c | 3 |
6 files changed, 36 insertions, 3 deletions
diff --git a/kernel/include/irq.h b/kernel/include/irq.h index de1d545..13461e9 100644 --- a/kernel/include/irq.h +++ b/kernel/include/irq.h @@ -14,5 +14,6 @@ extern void _irq12(void); extern void _irq13(void); extern void _irq14(void); extern void _irq15(void); +extern void _int0x80(void); void irq_init(void); diff --git a/kernel/include/timer.h b/kernel/include/timer.h index bf2eddd..7a15949 100644 --- a/kernel/include/timer.h +++ b/kernel/include/timer.h @@ -9,4 +9,5 @@ struct regs_t; void timer_init(uint32_t freq); +/* NOTE: enables interrupts by default */ void timer_delay(uint64_t ticks); diff --git a/kernel/irq-as.S b/kernel/irq-as.S index b2c0004..1d16392 100644 --- a/kernel/irq-as.S +++ b/kernel/irq-as.S @@ -41,6 +41,7 @@ irq_stub: .global _irq13 .global _irq14 .global _irq15 + .global _int0x80 _irq0: cli @@ -137,3 +138,9 @@ _irq15: pushl $0 pushl $47 jmp irq_stub + +_int0x80: + cli + pushl $0 + pushl $0x80 + jmp irq_stub diff --git a/kernel/irq.c b/kernel/irq.c index c6652e9..c6dbf4c 100644 --- a/kernel/irq.c +++ b/kernel/irq.c @@ -43,6 +43,7 @@ void irq_init(void) idt_set_gate(45, (uint32_t)_irq13, 0x08, 0x8E); idt_set_gate(46, (uint32_t)_irq14, 0x08, 0x8E); idt_set_gate(47, (uint32_t)_irq15, 0x08, 0x8E); + idt_set_gate(128,(uint32_t)_int0x80, 0x08, 0x8E); } void irq_handler(struct regs_t *regs) @@ -57,7 +58,6 @@ void irq_handler(struct regs_t *regs) } else { - printf("WARNING: Unhandled IRQ: 0x%x!\n", regs->int_no); } /* If the IDT entry that was invoked was greater than 40 diff --git a/kernel/main.c b/kernel/main.c index 0ec03f0..dc0926d 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -27,12 +27,23 @@ void gpf(struct regs_t *regs) panic("GPF!"); } +void int80(struct regs_t *regs) +{ + switch(regs->eax) + { + case 0: + panic((const char*)regs->ebx); + break; + case 1: + puts((const char*)regs->ebx); + break; + } +} + void main(struct multiboot_info_t *hdr, uint32_t magic) { fpu_enable(); - asm("movq %xmm0, %xmm0"); - /* this should go to port e9, which is the Bochs debug port */ printf("Testing early I/O\n"); @@ -64,6 +75,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) ps2_init(); set_interrupt_handler(0xd, gpf); + set_interrupt_handler(0x80, int80); asm("sti"); @@ -71,9 +83,18 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) printf("Kernel version %s: \"%s\"\n", KAPPA_KERNEL_VERSION, KAPPA_KERNEL_CODENAME); + //printf("Starting linked-in application XRacer...\n"); printf("Running graphics benchmark...\n"); srand(42); + gfx_drawcircle(100, 100, 100); + + gfx_fillcircle(50, 30, 20); + + while(1); + + //xracer_main(); + if(gfx_status) { const int width = *gfx_width; diff --git a/kernel/timer.c b/kernel/timer.c index e1f248b..2c05167 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -34,5 +34,8 @@ void timer_delay(uint64_t ticks) { uint64_t end = *current_tick + ticks; while(*current_tick <= end) + { + asm("sti"); asm("hlt"); + } } |