PIT
This commit is contained in:
@@ -21,8 +21,6 @@ stack_top:
|
|||||||
.type _start, @function
|
.type _start, @function
|
||||||
_start:
|
_start:
|
||||||
mov $stack_top, %esp
|
mov $stack_top, %esp
|
||||||
call kernel_main
|
call kmain
|
||||||
|
1:
|
||||||
cli
|
|
||||||
1: hlt
|
|
||||||
jmp 1b
|
jmp 1b
|
||||||
6
kernel/common_stubs.S
Normal file
6
kernel/common_stubs.S
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
.code32
|
||||||
|
|
||||||
|
.global enable_interrupts
|
||||||
|
enable_interrupts:
|
||||||
|
sti
|
||||||
|
ret
|
||||||
0
kernel/drivers/pic/pic.c
Normal file
0
kernel/drivers/pic/pic.c
Normal file
7
kernel/drivers/pic/pic.h
Normal file
7
kernel/drivers/pic/pic.h
Normal file
@@ -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
|
||||||
51
kernel/drivers/pic/pic_stubs.S
Normal file
51
kernel/drivers/pic/pic_stubs.S
Normal file
@@ -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
|
||||||
0
kernel/drivers/pit/pit.h
Normal file
0
kernel/drivers/pit/pit.h
Normal file
16
kernel/drivers/pit/pit_stubs.S
Normal file
16
kernel/drivers/pit/pit_stubs.S
Normal file
@@ -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
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
#include "lib/print.h"
|
#include "lib/print.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
extern void master_eoi(void);
|
extern void send_eoi_master(void);
|
||||||
|
extern void send_eoi_slave(void);
|
||||||
|
|
||||||
struct registers {
|
struct registers {
|
||||||
uint32_t edi, esi, ebp, esp_dummy, ebx, edx, ecx, eax;
|
uint32_t edi, esi, ebp, esp_dummy, ebx, edx, ecx, eax;
|
||||||
@@ -32,12 +33,12 @@ void common_interrupt_handler(struct registers *regs) {
|
|||||||
kprint("\n");
|
kprint("\n");
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
// wake the PIC timer driver
|
// wake the PIT timer driver
|
||||||
master_eoi();
|
send_eoi_master();
|
||||||
break;
|
break;
|
||||||
case 33:
|
case 33:
|
||||||
// wake the keyboard driver
|
kprint("keypress detected\n");
|
||||||
master_eoi();
|
send_eoi_master();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
kprint("Received unhandled interrupt\n");
|
kprint("Received unhandled interrupt\n");
|
||||||
|
|||||||
@@ -7,8 +7,11 @@
|
|||||||
|
|
||||||
extern void init_idt();
|
extern void init_idt();
|
||||||
extern void init_gdt();
|
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 vga_print_stream;
|
||||||
extern print_stream_t* kout;
|
extern print_stream_t* kout;
|
||||||
@@ -22,4 +25,15 @@ void kernel_main(void)
|
|||||||
|
|
||||||
init_idt();
|
init_idt();
|
||||||
kprint("IDT set\n");
|
kprint("IDT set\n");
|
||||||
|
|
||||||
|
init_pic();
|
||||||
|
kprint("PIC initialized\n");
|
||||||
|
|
||||||
|
init_pit();
|
||||||
|
kprint("PIT initialized\n");
|
||||||
|
|
||||||
|
enable_interrupts();
|
||||||
|
kprint("Interrupts enabled\n");
|
||||||
|
|
||||||
|
while(1);
|
||||||
}
|
}
|
||||||
|
|||||||
7
makefile
7
makefile
@@ -4,10 +4,10 @@ LD = i686-elf-ld
|
|||||||
OSNAME := rockos
|
OSNAME := rockos
|
||||||
|
|
||||||
C_SOURCES := $(shell find kernel -type f -name '*.c')
|
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
|
# 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
|
CFLAGS := -ffreestanding -O2 -Wall -Wextra -Ikernel
|
||||||
LDFLAGS := -T kernel/linker.ld
|
LDFLAGS := -T kernel/linker.ld
|
||||||
@@ -25,12 +25,11 @@ $(OSNAME).iso: $(OSNAME).bin grub.cfg
|
|||||||
cp grub.cfg isodir/boot/grub/grub.cfg
|
cp grub.cfg isodir/boot/grub/grub.cfg
|
||||||
grub-mkrescue -o $(OSNAME).iso isodir
|
grub-mkrescue -o $(OSNAME).iso isodir
|
||||||
|
|
||||||
# FIX: Pattern rules now explicitly expect the 'kernel' directory layout
|
|
||||||
obj/kernel/%.o: kernel/%.c
|
obj/kernel/%.o: kernel/%.c
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
$(CC) -c $< -o $@ $(CFLAGS)
|
$(CC) -c $< -o $@ $(CFLAGS)
|
||||||
|
|
||||||
obj/kernel/%.o: kernel/%.s
|
obj/kernel/%.o: kernel/%.S
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
$(CC) -c $< -o $@ $(CFLAGS)
|
$(CC) -c $< -o $@ $(CFLAGS)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user