From e3305e8f7c119c83fd04f1995e07ff71a1110887 Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Wed, 11 Feb 2015 17:13:26 -0500 Subject: optimize interrupt performance --- bochs.cfg | 2 +- drivers/ps2.c | 4 ++-- kernel/include/irq.h | 2 -- kernel/include/isr.h | 4 ++-- kernel/irq-as.S | 2 +- kernel/irq.c | 11 ++++++----- kernel/isr.c | 12 ++++++------ kernel/main.c | 21 +++++++++++---------- kernel/timer.c | 4 +++- 9 files changed, 32 insertions(+), 30 deletions(-) diff --git a/bochs.cfg b/bochs.cfg index e22e703..2c15a42 100644 --- a/bochs.cfg +++ b/bochs.cfg @@ -1,7 +1,7 @@ # configuration file generated by Bochs plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, iodebug=1 config_interface: textconfig -display_library: x +display_library: x, options="gui_debug" memory: host=32, guest=32 romimage: file="/usr/share/bochs/BIOS-bochs-latest" vgaromimage: file="/usr/share/bochs/VGABIOS-lgpl-latest" diff --git a/drivers/ps2.c b/drivers/ps2.c index f9a48a4..c9ff30e 100644 --- a/drivers/ps2.c +++ b/drivers/ps2.c @@ -19,7 +19,7 @@ void ps2_set_leds(uint8_t status) outb(0x60, status); } -static void key_handler(struct regs_t regs) +static void key_handler(struct regs_t *regs) { (void) regs; uint8_t scancode = inb(0x60); @@ -41,7 +41,7 @@ static void keyboard_init(void) ps2_set_scancode_set(1); } -static void mouse_handler(struct regs_t regs) +static void mouse_handler(struct regs_t *regs) { (void) regs; printf("mouse action!\n"); 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 +#include #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; -- cgit v1.1