diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-01 16:50:55 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-01 16:50:55 -0500 |
| commit | 483754ab27f2a58011f723efa52163a83c63e56e (patch) | |
| tree | fa50d2afc84b0403db26d92f38226d75adb7f281 /kernel | |
| parent | 726684887d414fbefe28d0d210abea8e842ecd21 (diff) | |
| download | kappa-483754ab27f2a58011f723efa52163a83c63e56e.zip kappa-483754ab27f2a58011f723efa52163a83c63e56e.tar.gz kappa-483754ab27f2a58011f723efa52163a83c63e56e.tar.bz2 kappa-483754ab27f2a58011f723efa52163a83c63e56e.tar.xz | |
lots of stuff
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/gdt-as.S | 6 | ||||
| -rw-r--r-- | kernel/gdt.c | 3 | ||||
| -rw-r--r-- | kernel/idt.c | 1 | ||||
| -rw-r--r-- | kernel/irq.c | 4 | ||||
| -rw-r--r-- | kernel/isr-as.S | 1 | ||||
| -rw-r--r-- | kernel/isr.c | 3 | ||||
| -rw-r--r-- | kernel/main.c | 29 | ||||
| -rw-r--r-- | kernel/panic.c | 13 |
8 files changed, 41 insertions, 19 deletions
diff --git a/kernel/gdt-as.S b/kernel/gdt-as.S index 7283dc8..7c8d630 100644 --- a/kernel/gdt-as.S +++ b/kernel/gdt-as.S @@ -1,8 +1,7 @@ .global gdt_flush .type gdt_flush, @function -gdt_flush: # prototype: void gdt_flush(uint32_t addr) - cli - movl 4(%esp), %eax # load the address off the stack (first param) +gdt_flush: # prototype: void gdt_flush(uint32) + movl 4(%esp), %eax lgdt (%eax) mov $0x10, %ax mov %ax, %ds @@ -10,7 +9,6 @@ gdt_flush: # prototype: void gdt_flush(uint32_t addr) mov %ax, %fs mov %ax, %gs mov %ax, %ss - sti jmp .flush .flush: ret diff --git a/kernel/gdt.c b/kernel/gdt.c index f9b2d86..36a0cda 100644 --- a/kernel/gdt.c +++ b/kernel/gdt.c @@ -18,9 +18,10 @@ static void gdt_set_gate(int idx, uint32_t base, uint32_t limit, uint8_t access, void gdt_init(void) { - gp.limit = (sizeof(struct gdt_entry) * sizeof(gdt)/sizeof(gdt[0])) - 1; + gp.limit = sizeof(gdt) - 1; gp.base = (uint32_t)&gdt; + /* null segment */ gdt_set_gate(0, 0, 0, 0, 0); /* code segment */ diff --git a/kernel/idt.c b/kernel/idt.c index e1ff72f..9eda0ce 100644 --- a/kernel/idt.c +++ b/kernel/idt.c @@ -13,7 +13,6 @@ void idt_set_gate(uint8_t idx, uint32_t base, uint16_t sel, uint8_t flags) void idt_init(void) { - printf("idt_init()"); idt_pt.limit = sizeof(idt) - 1; idt_pt.base = (uint32_t)&idt; diff --git a/kernel/irq.c b/kernel/irq.c index 5f0a3f5..2498055 100644 --- a/kernel/irq.c +++ b/kernel/irq.c @@ -38,8 +38,6 @@ void irq_init(void) { irq_remap(); - printf("irq_init()"); - idt_set_gate(32, (uint32_t)_irq0, 0x08, 0x8E); idt_set_gate(33, (uint32_t)_irq1, 0x08, 0x8E); idt_set_gate(34, (uint32_t)_irq2, 0x08, 0x8E); @@ -64,8 +62,6 @@ void irq_handler(struct regs_t *regs) handler = irq_callbacks[regs->int_no - 32]; - printf("IRQ called\n"); - if(handler) { handler(regs); diff --git a/kernel/isr-as.S b/kernel/isr-as.S index 53e15b4..2bc77f3 100644 --- a/kernel/isr-as.S +++ b/kernel/isr-as.S @@ -20,6 +20,7 @@ isr_handler: pop %ds popa add $8, %esp + sti iret # stub ISR's: diff --git a/kernel/isr.c b/kernel/isr.c index fabbf80..424bd22 100644 --- a/kernel/isr.c +++ b/kernel/isr.c @@ -6,13 +6,12 @@ void isr_handle(struct regs_t *regs) { if(regs->int_no < 32) { - printf("received exception!\n"); + panic("received exception!\n"); } } void isr_init(void) { - printf("ISR init"); idt_set_gate(0, (uint32_t)_isr0, 0x08, 0x8E); idt_set_gate(1, (uint32_t)_isr1, 0x08, 0x8E); idt_set_gate(2, (uint32_t)_isr2, 0x08, 0x8E); diff --git a/kernel/main.c b/kernel/main.c index 219e3ee..fd56fb0 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -1,14 +1,31 @@ -#include "string.h" +#include "gdt.h" +#include "idt.h" +#include "isr.h" +#include "irq.h" #include "tty.h" -#include "vga.h" +#include <stdio.h> -void main(void) +void irq1(struct regs_t *regs) +{ + printf("Keypress\n"); +} + +void main(struct multiboot_header *hdr, uint32_t magic) { tty_init(); + gdt_init(); - tty_puts("GDT initialized\n"); - tty_set_color(VGA_MAKE_COLOR(VGA_LIGHT_GRAY, VGA_BLACK)); - tty_puts("Hello, world!\n"); + printf("GDT initialized.\n"); + + idt_init(); + printf("IDT initialized.\n"); + + isr_init(); + irq_init(); + + irq_set_handler(1, irq1); + + printf("Hello, world!\n"); while(1) ; } diff --git a/kernel/panic.c b/kernel/panic.c index 106141b..3a2ddf1 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -1,2 +1,13 @@ #include "panic.h" -#include " +#include <stdio.h> + +__attribute__((noreturn)) void panic(const char *str, ...) +{ + /* no printf formatting for now */ + printf("KERNEL PANIC: %s", str); + for(;;) + { + asm("cli"); + asm("hlt"); + } +} |