Jump from interrupt into rust code
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user