aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-02-14 10:55:22 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-02-14 10:55:22 -0500
commitef4cc242dc8ad04320d19af22931fcbdbf670c13 (patch)
tree50af19ff8e207870e2fdbad6d2a9ea669c901da8 /kernel
parentca1c4f58224404d4361e8ca16837e48c88c0ee38 (diff)
downloadkappa-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.h1
-rw-r--r--kernel/include/timer.h1
-rw-r--r--kernel/irq-as.S7
-rw-r--r--kernel/irq.c2
-rw-r--r--kernel/main.c25
-rw-r--r--kernel/timer.c3
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");
+ }
}