aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-02-11 17:13:26 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-02-11 17:13:26 -0500
commite3305e8f7c119c83fd04f1995e07ff71a1110887 (patch)
treef95921215c215a60d80b1be068b2cccd72459ee2 /kernel
parent90fda5287e3dae56508a4b31e1bc4e29cd83e377 (diff)
downloadkappa-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.h2
-rw-r--r--kernel/include/isr.h4
-rw-r--r--kernel/irq-as.S2
-rw-r--r--kernel/irq.c11
-rw-r--r--kernel/isr.c12
-rw-r--r--kernel/main.c21
-rw-r--r--kernel/timer.c4
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 = &current_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;