diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-11 17:13:26 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-11 17:13:26 -0500 |
| commit | e3305e8f7c119c83fd04f1995e07ff71a1110887 (patch) | |
| tree | f95921215c215a60d80b1be068b2cccd72459ee2 /kernel | |
| parent | 90fda5287e3dae56508a4b31e1bc4e29cd83e377 (diff) | |
| download | kappa-e3305e8f7c119c83fd04f1995e07ff71a1110887.zip kappa-e3305e8f7c119c83fd04f1995e07ff71a1110887.tar.gz kappa-e3305e8f7c119c83fd04f1995e07ff71a1110887.tar.bz2 kappa-e3305e8f7c119c83fd04f1995e07ff71a1110887.tar.xz | |
optimize interrupt performance
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/irq.h | 2 | ||||
| -rw-r--r-- | kernel/include/isr.h | 4 | ||||
| -rw-r--r-- | kernel/irq-as.S | 2 | ||||
| -rw-r--r-- | kernel/irq.c | 11 | ||||
| -rw-r--r-- | kernel/isr.c | 12 | ||||
| -rw-r--r-- | kernel/main.c | 21 | ||||
| -rw-r--r-- | kernel/timer.c | 4 |
7 files changed, 29 insertions, 27 deletions
diff --git a/kernel/include/irq.h b/kernel/include/irq.h index 8fac8e1..de1d545 100644 --- a/kernel/include/irq.h +++ b/kernel/include/irq.h @@ -15,6 +15,4 @@ extern void _irq13(void); extern void _irq14(void); extern void _irq15(void); -struct regs_t; - void irq_init(void); diff --git a/kernel/include/isr.h b/kernel/include/isr.h index de81cd2..4cc7f1b 100644 --- a/kernel/include/isr.h +++ b/kernel/include/isr.h @@ -41,11 +41,11 @@ void isr_init(void); struct regs_t { uint32_t gs, fs, es, ds; /* pushed the segs last */ uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; /* pushed by 'pusha' */ - uint32_t err_code; /* exceptions push this */ uint32_t int_no; /* interrupt stubs do this */ + uint32_t err_code; /* exceptions push this */ uint32_t eip, cs, eflags, useresp, ss; /* pushed by the processor automatically */ } __attribute__((packed)); #define IRQ(x) (32+x) -void set_interrupt_handler(uint8_t interrupt, void (*func)(struct regs_t)); +void set_interrupt_handler(uint8_t interrupt, void (*func)(struct regs_t*)); diff --git a/kernel/irq-as.S b/kernel/irq-as.S index 8840299..b2c0004 100644 --- a/kernel/irq-as.S +++ b/kernel/irq-as.S @@ -12,7 +12,7 @@ irq_stub: mov %ax, %es mov %ax, %fs mov %ax, %gs - mov %esp, %eax + mov %esp, %eax # push the stack push %eax mov $irq_handler, %eax call *%eax diff --git a/kernel/irq.c b/kernel/irq.c index aa726d9..c6652e9 100644 --- a/kernel/irq.c +++ b/kernel/irq.c @@ -5,6 +5,7 @@ #include "io.h" #include "irq.h" #include "isr.h" +#include "panic.h" /* in isr.c */ extern void *int_callbacks[256]; @@ -44,11 +45,11 @@ void irq_init(void) idt_set_gate(47, (uint32_t)_irq15, 0x08, 0x8E); } -void irq_handler(struct regs_t regs) +void irq_handler(struct regs_t *regs) { - void (*handler)(struct regs_t r); + void (*handler)(struct regs_t *r); - handler = int_callbacks[regs.int_no]; + handler = int_callbacks[regs->int_no]; if(handler) { @@ -56,13 +57,13 @@ void irq_handler(struct regs_t regs) } else { - printf("WARNING: Unhandled IRQ: 0x%x!\n", regs.int_no); + printf("WARNING: Unhandled IRQ: 0x%x!\n", regs->int_no); } /* If the IDT entry that was invoked was greater than 40 * (meaning IRQ8 - 15), then we need to send an EOI to * the slave controller */ - if (regs.int_no >= 40) + if (regs->int_no >= 40) { outb(0xA0, 0x20); } diff --git a/kernel/isr.c b/kernel/isr.c index 569ecd0..e6887c6 100644 --- a/kernel/isr.c +++ b/kernel/isr.c @@ -4,22 +4,22 @@ #include "idt.h" #include "panic.h" -void (*int_callbacks[256])(struct regs_t) = { NULL }; +void (*int_callbacks[256])(struct regs_t*) = { NULL }; -void set_interrupt_handler(uint8_t n, void (*callback)(struct regs_t)) +void set_interrupt_handler(uint8_t n, void (*callback)(struct regs_t*)) { int_callbacks[n] = callback; } -void isr_handler(struct regs_t regs) +void isr_handler(struct regs_t *regs) { - if(int_callbacks[regs.int_no]) + if(int_callbacks[regs->int_no]) { - int_callbacks[regs.int_no](regs); + int_callbacks[regs->int_no](regs); } else { - printf("WARNING: unhandled ISR 0x%x!\n", regs.int_no); + printf("WARNING: unhandled ISR 0x%x!\n", regs->int_no); } } diff --git a/kernel/main.c b/kernel/main.c index 2ec6c46..fc62a10 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -17,12 +17,12 @@ #include "timer.h" #include "tty.h" -void gpf(struct regs_t regs) +void gpf(struct regs_t *regs) { gfx_reset(); printf("General protection fault!\n"); - printf("EIP before fault: 0x%x\n", regs.eip); - printf("Error code: 0x%x\n", regs.err_code); + printf("EIP before fault: 0x%x\n", regs->eip); + printf("Error code: 0x%x\n", regs->err_code); panic("GPF!"); } @@ -74,7 +74,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) const int width = *gfx_width; const int height = *gfx_height; - gfx_clear(); + gfx_reset(); int startpix = *current_tick; for(int i=0;i<1000000;++i) @@ -87,7 +87,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) } int endpix = *current_tick; - gfx_clear(); + gfx_reset(); int startfill = *current_tick; for(int i=0;i<1000;++i) @@ -97,7 +97,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) } int endfill = *current_tick; - gfx_clear(); + gfx_reset(); int starttext = *current_tick; for(int i=0;i<1000000;++i) @@ -109,7 +109,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) } int endtext = *current_tick; - gfx_clear(); + gfx_reset(); int starthline = *current_tick; for(int i=0;i<1000000;++i) @@ -119,7 +119,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) } int endhline = *current_tick; - gfx_clear(); + gfx_reset(); int startvline = *current_tick; for(int i=0;i<1000000;++i) @@ -129,7 +129,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) } int endvline = *current_tick; - gfx_clear(); + gfx_reset(); int startrect = *current_tick; for(int i=0;i<10000;++i) @@ -143,7 +143,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) } int endrect = *current_tick; - gfx_clear(); + gfx_reset(); int startline = *current_tick; for(int i=0;i<1000000;++i) @@ -158,6 +158,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) int endline = *current_tick; gfx_reset(); + printf("--- Graphics benchmark results ---\n"); printf("Ticks for 1,000,000 random pixels: %d\n", endpix-startpix); printf("Ticks for 1,000 random fills: %d\n", endfill-startfill); diff --git a/kernel/timer.c b/kernel/timer.c index 7bdc1f9..bdf48eb 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -1,4 +1,5 @@ #include <stdint.h> +#include <stdio.h> #include "io.h" #include "isr.h" #include "timer.h" @@ -7,7 +8,7 @@ volatile uint64_t current_tick_data = 0; volatile const uint64_t *current_tick = ¤t_tick_data; -static void timer_callback(struct regs_t regs) +static void timer_callback(struct regs_t *regs) { (void) regs; ++current_tick_data; @@ -15,6 +16,7 @@ static void timer_callback(struct regs_t regs) void timer_init(uint32_t freq) { + printf("Timer init"); set_interrupt_handler(IRQ(0), timer_callback); current_tick_data = 0; |