Timer interrupt seems to work

Default settings on PIT, but maybe will want to mess with them later
This commit is contained in:
greg
2015-11-15 14:41:49 -08:00
parent b5022ff286
commit 730c2c7d71
2 changed files with 56 additions and 3 deletions

View File

@@ -24,6 +24,16 @@ pub extern fn rust_handle_keyboard() {
checkerboard(vga_buffer::Color::Green); checkerboard(vga_buffer::Color::Green);
} }
#[no_mangle]
pub extern fn rust_handle_timer() {
let color_code = vga_buffer::ColorCode::new(vga_buffer::Color::Black,
vga_buffer::Color::White);
vga_buffer::write_to_coord(40, 1, b'X', color_code);
}
#[no_mangle] #[no_mangle]
pub extern fn rust_main() { pub extern fn rust_main() {
clear(); clear();

View File

@@ -4,6 +4,7 @@ global get_rdtsc
global call_interrupt global call_interrupt
extern rust_interrupt_handler extern rust_interrupt_handler
extern rust_handle_keyboard extern rust_handle_keyboard
extern rust_handle_timer
section .text section .text
bits 64 bits 64
@@ -12,6 +13,7 @@ long_mode_start:
; print "OKAY" ; print "OKAY"
call setup_SSE call setup_SSE
call setup_IDT call setup_IDT
call setup_PIT
call setup_PIC call setup_PIC
extern rust_main extern rust_main
call rust_main call rust_main
@@ -113,9 +115,46 @@ handle_keyboard:
iretq iretq
%define int_num 9 handle_timer:
push rax
push rcx
push rdx
push r8
push r9
push r10
push r11
pushfq
call rust_handle_timer
mov al, END_OF_INTERRUPT
out PIC1_COMMAND, al
out PIC2_COMMAND, al
popfq
pop r11
pop r10
pop r9
pop r8
pop rdx
pop rcx
pop rax
iretq
setup_IDT: setup_IDT:
lidt [idt64.pointer] lidt [idt64.pointer]
%define timer_int 8
mov rax, handle_timer
mov [idt64 + timer_int*16], ax
mov word [idt64 + timer_int*16 + 2], cs
mov word [idt64 + timer_int*16 + 4], 0x8e00
shr rax, 16
mov [idt64 + timer_int*16 + 6], ax
shr rax, 16
mov [idt64 + timer_int*16 + 8], eax
%define int_num 9
mov rax, handle_keyboard mov rax, handle_keyboard
mov [idt64 + int_num*16], ax mov [idt64 + int_num*16], ax
mov word [idt64 + int_num*16 +2], cs mov word [idt64 + int_num*16 +2], cs
@@ -123,17 +162,21 @@ setup_IDT:
shr rax, 16 shr rax, 16
mov [idt64 + int_num*16 + 6], ax mov [idt64 + int_num*16 + 6], ax
shr rax, 16 shr rax, 16
mov [idt64 + int_num*16 + 8], ax mov [idt64 + int_num*16 + 8], eax
ret ret
setup_PIC: setup_PIC:
mov al, 0xfd mov al, 0xfc
out byte 0x21, al out byte 0x21, al
mov al, 0xff mov al, 0xff
out byte 0xa1, al out byte 0xa1, al
sti sti
ret ret
setup_PIT:
ret
idt64: idt64:
resb 50*16 resb 50*16
.pointer: .pointer: