diff --git a/kernel/boot/boot.s b/kernel/boot/boot.S similarity index 95% rename from kernel/boot/boot.s rename to kernel/boot/boot.S index a4b679e..d7b8f20 100644 --- a/kernel/boot/boot.s +++ b/kernel/boot/boot.S @@ -21,8 +21,6 @@ stack_top: .type _start, @function _start: mov $stack_top, %esp - call kernel_main - - cli -1: hlt + call kmain +1: jmp 1b diff --git a/kernel/common_stubs.S b/kernel/common_stubs.S new file mode 100644 index 0000000..d9b3cfb --- /dev/null +++ b/kernel/common_stubs.S @@ -0,0 +1,6 @@ +.code32 + +.global enable_interrupts +enable_interrupts: + sti + ret \ No newline at end of file diff --git a/kernel/drivers/pic/pic.c b/kernel/drivers/pic/pic.c new file mode 100644 index 0000000..e69de29 diff --git a/kernel/drivers/pic/pic.h b/kernel/drivers/pic/pic.h new file mode 100644 index 0000000..8b4223e --- /dev/null +++ b/kernel/drivers/pic/pic.h @@ -0,0 +1,7 @@ +#define PIC1_ADDR 0x20 +#define PIC2_ADDR 0xA0 +#define PIC1_COMMAND PIC1_ADDR +#define PIC1_DATA (PIC1_ADDR+1) +#define PIC2_COMMAND PIC2_ADDR +#define PIC2_DATA (PIC2_ADDR+1) +#define PIC_EOI 0x20 \ No newline at end of file diff --git a/kernel/drivers/pic/pic_stubs.S b/kernel/drivers/pic/pic_stubs.S new file mode 100644 index 0000000..42332bd --- /dev/null +++ b/kernel/drivers/pic/pic_stubs.S @@ -0,0 +1,51 @@ +#include "drivers/pic/pic.h" + +.code32 +.global init_pic +init_pic: + # init command + mov $0x11, %al + outb %al, $PIC1_COMMAND + outb %al, $PIC2_COMMAND + + # vector offsets + mov $0x20, %al + outb %al, $PIC1_DATA + mov $0x28, %al + outb %al, $PIC2_DATA + + # cascade + mov $0x04, %al + outb %al, $PIC1_DATA + mov $0x02, %al + outb %al, $PIC2_DATA + + # env + mov $0x01, %al + outb %al, $PIC1_DATA + outb %al, $PIC2_DATA + + # mask all + mov $0xFC, %al + outb %al, $PIC1_DATA + mov $0xFF, %al + outb %al, $PIC2_DATA + + ret + +.global io_wait +io_wait: + ret + +.global send_eoi_master +send_eoi_master: + mov $0x20, %al + outb %al, $PIC1_COMMAND + ret + +.global send_eoi_slave +send_eoi_slave: + mov $0x20, %al + outb %al, $PIC2_COMMAND + call send_eoi_master + ret diff --git a/kernel/drivers/pit/pit.h b/kernel/drivers/pit/pit.h new file mode 100644 index 0000000..e69de29 diff --git a/kernel/drivers/pit/pit_stubs.S b/kernel/drivers/pit/pit_stubs.S new file mode 100644 index 0000000..2269868 --- /dev/null +++ b/kernel/drivers/pit/pit_stubs.S @@ -0,0 +1,16 @@ +#include "drivers/pit/pit.h" + +.code32 + +.global init_pit +init_pit: # tickrate: 1193182/1000 = 0x04A9 (1000hz) (1ms) + movb $0x36, %al + outb %al, $0x43 + + movb $0xA9, %al + outb %al, $0x40 + + movb $0x04, %al + outb %al, $0x40 + + ret \ No newline at end of file diff --git a/kernel/drivers/vga_stream_writer.c b/kernel/drivers/vga/vga_stream_writer.c similarity index 100% rename from kernel/drivers/vga_stream_writer.c rename to kernel/drivers/vga/vga_stream_writer.c diff --git a/kernel/gdt_stubs.s b/kernel/gdt_stubs.S similarity index 100% rename from kernel/gdt_stubs.s rename to kernel/gdt_stubs.S diff --git a/kernel/idt_stubs.s b/kernel/idt_stubs.S similarity index 100% rename from kernel/idt_stubs.s rename to kernel/idt_stubs.S diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 5f8ade5..357869f 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -1,7 +1,8 @@ #include "lib/print.h" #include -extern void master_eoi(void); +extern void send_eoi_master(void); +extern void send_eoi_slave(void); struct registers { uint32_t edi, esi, ebp, esp_dummy, ebx, edx, ecx, eax; @@ -32,12 +33,12 @@ void common_interrupt_handler(struct registers *regs) { kprint("\n"); break; case 32: - // wake the PIC timer driver - master_eoi(); + // wake the PIT timer driver + send_eoi_master(); break; case 33: - // wake the keyboard driver - master_eoi(); + kprint("keypress detected\n"); + send_eoi_master(); break; default: kprint("Received unhandled interrupt\n"); diff --git a/kernel/kmain.c b/kernel/kmain.c index 413c142..debc051 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -7,8 +7,11 @@ extern void init_idt(); extern void init_gdt(); +extern void init_pic(); +extern void init_pit(); +extern void enable_interrupts(); -void kernel_main(void) +void kmain(void) { extern print_stream_t vga_print_stream; extern print_stream_t* kout; @@ -22,4 +25,15 @@ void kernel_main(void) init_idt(); kprint("IDT set\n"); + + init_pic(); + kprint("PIC initialized\n"); + + init_pit(); + kprint("PIT initialized\n"); + + enable_interrupts(); + kprint("Interrupts enabled\n"); + + while(1); } diff --git a/makefile b/makefile index 86e475c..ea41bdf 100644 --- a/makefile +++ b/makefile @@ -4,10 +4,10 @@ LD = i686-elf-ld OSNAME := rockos C_SOURCES := $(shell find kernel -type f -name '*.c') -S_SOURCES := $(shell find kernel -type f -name '*.s') +S_SOURCES := $(shell find kernel -type f -name '*.S') # This correctly generates paths like obj/kernel/main.o -OBJECTS := $(patsubst %.c, obj/%.o, $(C_SOURCES)) $(patsubst %.s, obj/%.o, $(S_SOURCES)) +OBJECTS := $(patsubst %.c, obj/%.o, $(C_SOURCES)) $(patsubst %.S, obj/%.o, $(S_SOURCES)) CFLAGS := -ffreestanding -O2 -Wall -Wextra -Ikernel LDFLAGS := -T kernel/linker.ld @@ -25,12 +25,11 @@ $(OSNAME).iso: $(OSNAME).bin grub.cfg cp grub.cfg isodir/boot/grub/grub.cfg grub-mkrescue -o $(OSNAME).iso isodir -# FIX: Pattern rules now explicitly expect the 'kernel' directory layout obj/kernel/%.o: kernel/%.c @mkdir -p $(dir $@) $(CC) -c $< -o $@ $(CFLAGS) -obj/kernel/%.o: kernel/%.s +obj/kernel/%.o: kernel/%.S @mkdir -p $(dir $@) $(CC) -c $< -o $@ $(CFLAGS)