diff --git a/Cargo.toml b/Cargo.toml index f3712ee..ac40035 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,6 @@ [lib] +test = false +bench = false crate-type = ["staticlib"] [package] diff --git a/boot.s b/boot.s index bcbdc3a..8faec8f 100644 --- a/boot.s +++ b/boot.s @@ -16,59 +16,63 @@ align 4 dd MBFLAGS dd CHECKSUM -; %macro isr_err_stub 1 -; isr_stub_%+%1: -; call exception_handler -; iret -; %endmacro +%macro isr_err_stub 1 +isr_stub_%+%1: + push %1 ; Передаем номер прерывания как аргумент + call exception_handler + pop eax ; Убираем аргумент из стека (если нужно) + iret +%endmacro -; %macro isr_no_err_stub 1 -; isr_stub_%+%1: -; call exception_handler -; iret -; %endmacro +%macro isr_no_err_stub 1 +isr_stub_%+%1: + push %1 ; Передаем номер прерывания как аргумент + call exception_handler + pop eax ; Убираем аргумент из стека (если нужно) + iret +%endmacro -; extern exception_handler -; isr_no_err_stub 0 -; isr_no_err_stub 1 -; isr_no_err_stub 2 -; isr_no_err_stub 3 -; isr_no_err_stub 4 -; isr_no_err_stub 5 -; isr_no_err_stub 6 -; isr_no_err_stub 7 -; isr_err_stub 8 -; isr_no_err_stub 9 -; isr_err_stub 10 -; isr_err_stub 11 -; isr_err_stub 12 -; isr_err_stub 13 -; isr_err_stub 14 -; isr_no_err_stub 15 -; isr_no_err_stub 16 -; isr_err_stub 17 -; isr_no_err_stub 18 -; isr_no_err_stub 19 -; isr_no_err_stub 20 -; isr_no_err_stub 21 -; isr_no_err_stub 22 -; isr_no_err_stub 23 -; isr_no_err_stub 24 -; isr_no_err_stub 25 -; isr_no_err_stub 26 -; isr_no_err_stub 27 -; isr_no_err_stub 28 -; isr_no_err_stub 29 -; isr_err_stub 30 -; isr_no_err_stub 31 +extern exception_handler +isr_no_err_stub 0 +isr_no_err_stub 1 +isr_no_err_stub 2 +isr_no_err_stub 3 +isr_no_err_stub 4 +isr_no_err_stub 5 +isr_no_err_stub 6 +isr_no_err_stub 7 +isr_err_stub 8 +isr_no_err_stub 9 +isr_err_stub 10 +isr_err_stub 11 +isr_err_stub 12 +isr_err_stub 13 +isr_err_stub 14 +isr_no_err_stub 15 +isr_no_err_stub 16 +isr_err_stub 17 +isr_no_err_stub 18 +isr_no_err_stub 19 +isr_no_err_stub 20 +isr_no_err_stub 21 +isr_no_err_stub 22 +isr_no_err_stub 23 +isr_no_err_stub 24 +isr_no_err_stub 25 +isr_no_err_stub 26 +isr_no_err_stub 27 +isr_no_err_stub 28 +isr_no_err_stub 29 +isr_err_stub 30 +isr_no_err_stub 31 -; global isr_stub_table -; isr_stub_table: -; %assign i 0 -; %rep 32 -; dd isr_stub_%+i ; use DQ instead if targeting 64-bit -; %assign i i+1 -; %endrep +global isr_stub_table +isr_stub_table: +%assign i 0 +%rep 32 + dd isr_stub_%+i ; use DQ instead if targeting 64-bit +%assign i i+1 +%endrep ; The multiboot standard does not define the value of the stack pointer register ; (esp) and it is up to the kernel to provide a stack. This allocates room for a diff --git a/src/kernel/interrupt.rs b/src/kernel/interrupt.rs index 1ed8aaf..f11d4dd 100644 --- a/src/kernel/interrupt.rs +++ b/src/kernel/interrupt.rs @@ -60,12 +60,12 @@ static mut IDT: [IDTEntry; IDT_MAX_DESCRIPTORS] = [IDTEntry { offset_mid: 0, }; IDT_MAX_DESCRIPTORS]; -// static mut VECTORS: [bool; 32] = [false; 32]; +static mut VECTORS: [bool; 32] = [false; 32]; static mut IDTR: IDTDescriptor = IDTDescriptor { limit: 0, base: 0 }; -// extern "C" { -// static ist_stub_table: [u32; 32]; -// } +extern "C" { + static isr_stub_table: [u32; 32]; +} pub unsafe fn idt_set_descriptor(vector: u8, handler: u32, type_attr: u8) { IDT[vector as usize] = IDTEntry { @@ -78,18 +78,27 @@ pub unsafe fn idt_set_descriptor(vector: u8, handler: u32, type_attr: u8) { } pub unsafe fn load_idt() { - IDTR.base = &IDT as *const _ as u32; + IDTR.base = &raw const IDT as *const _ as u32; IDTR.limit = (size_of::() * IDT_MAX_DESCRIPTORS - 1) as u16; - // for vector in 0..32 { - // idt_set_descriptor(vector, ist_stub_table[vector as usize], 0x8E); - // VECTORS[vector as usize] = true; - // } + for vector in 0..32 { + idt_set_descriptor(vector, isr_stub_table[vector as usize], 0x8E); + VECTORS[vector as usize] = true; + } - asm!("lidt [{}]", in(reg) &IDTR); + asm!("lidt [{}]", in(reg) &raw const IDTR); asm!("sti"); } +#[no_mangle] +pub extern "C" fn exception_handler(error_type: u8) { + unsafe { + log_error(&format!("Unknown error 0x{:X}", error_type)); + asm!("cli; hlt"); + loop {} + } +} + unsafe fn is_apic_available() -> bool { if !APIC_ENABLED { return false; @@ -106,12 +115,6 @@ unsafe fn is_apic_available() -> bool { (edx & (1 << 9)) != 0 } -pub unsafe extern "C" fn exception_handler() { - log_error("Unknown error"); - asm!("cli; hlt"); - loop {} -} - unsafe fn send_apic_eoi() { write_volatile(APIC_EOI as *mut u32, 0); } diff --git a/src/kernel/time.rs b/src/kernel/time.rs index f98689c..8393581 100644 --- a/src/kernel/time.rs +++ b/src/kernel/time.rs @@ -44,7 +44,7 @@ pub fn init_pit() { log_info("PIT initialized"); log_info(&format!("{}", pit_handler as u32)); - idt_set_descriptor(0x20, pit_handler as u32, 0x8E); + idt_set_descriptor(0x20, pit_handler as u32, 0); log_info("PIT registered"); load_idt(); diff --git a/src/lib.rs b/src/lib.rs index 621fc08..9af274a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,9 @@ #![no_std] #![no_main] -#![feature(lang_items)] -#![feature(alloc_error_handler)] -#![feature(rustc_private)] -#![feature(abi_x86_interrupt)] +#![allow(internal_features, dead_code, unused)] +#![feature(lang_items, alloc_error_handler, rustc_private, abi_x86_interrupt)] + #[lang = "eh_personality"]