Jump from interrupt into rust code

This commit is contained in:
greg
2015-11-15 02:50:38 -08:00
parent 2beb647839
commit 91632e8e99
2 changed files with 36 additions and 7 deletions

View File

@@ -14,6 +14,10 @@ extern {
fn call_interrupt();
}
#[no_mangle]
pub extern fn rust_interrupt_handler() {
checkerboard(vga_buffer::Color::White);
}
#[no_mangle]
pub extern fn rust_main() {

View File

@@ -2,6 +2,7 @@ global long_mode_start
global asm_printchar
global get_rdtsc
global call_interrupt
extern rust_interrupt_handler
section .text
bits 64
@@ -10,6 +11,7 @@ long_mode_start:
; print "OKAY"
call setup_SSE
call setup_IDT
call setup_PIC
extern rust_main
call rust_main
; rust main returned, print `OS returned!`
@@ -69,24 +71,47 @@ get_rdtsc:
ret
call_interrupt:
int 49
int 5
ret
sample_handler:
mov word [0xb8000], 0x4f72
;mov word [0xb8000], 0x4f72
push rax
push rcx
push rdx
push r8
push r9
push r10
push r11
cld
call rust_interrupt_handler
pop r11
pop r10
pop r9
pop r8
pop rdx
pop rcx
pop rax
call spin_loop_64
iretq
%define int_num 5
setup_IDT:
lidt [idt64.pointer]
mov rax, sample_handler
mov [idt64 + 49*16], ax
mov word [idt64 + 49*16 +2], cs
mov word [idt64 + 49*16 + 4], 0x8e00
mov [idt64 + int_num*16], ax
mov word [idt64 + int_num*16 +2], cs
mov word [idt64 + int_num*16 + 4], 0x8e00
shr rax, 16
mov [idt64 + 49*16 + 6], ax
mov [idt64 + int_num*16 + 6], ax
shr rax, 16
mov [idt64 + 49*16 + 8], ax
mov [idt64 + int_num*16 + 8], ax
ret
setup_PIC:
ret
idt64: