summaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/interrupts/apic.rs8
-rw-r--r--kernel/src/interrupts/exception_handlers.rs2
-rw-r--r--kernel/src/interrupts/idt.rs2
-rw-r--r--kernel/src/io/qemu.rs3
-rw-r--r--kernel/src/main.rs6
5 files changed, 9 insertions, 12 deletions
diff --git a/kernel/src/interrupts/apic.rs b/kernel/src/interrupts/apic.rs
index 93fba8b..2761fb9 100644
--- a/kernel/src/interrupts/apic.rs
+++ b/kernel/src/interrupts/apic.rs
@@ -11,17 +11,13 @@ const APIC_SW_ENABLE: u32 = 0x0000_0100;
pub fn is_x2apic() -> bool {
let info: u32;
- unsafe {
- asm!("cpuid" : "={ecx}" (info) : "{eax}" (1) : "memory");
- }
+ unsafe { asm!("cpuid", inout("eax") 1 => _, out("ecx") info) }
info & (1 << 21) != 0
}
pub fn is_apic() -> bool {
let info: u32;
- unsafe {
- asm!("cpuid" : "={edx}" (info) : "{eax}" (1) : "memory");
- }
+ unsafe { asm!("cpuid", inout("eax") 1 => _, out("edx") info) }
info & (1 << 9) != 0
}
diff --git a/kernel/src/interrupts/exception_handlers.rs b/kernel/src/interrupts/exception_handlers.rs
index ef67eff..c689501 100644
--- a/kernel/src/interrupts/exception_handlers.rs
+++ b/kernel/src/interrupts/exception_handlers.rs
@@ -94,7 +94,7 @@ pub extern "x86-interrupt" fn segment_not_present_handler(
pub extern "x86-interrupt" fn double_fault_handler(
stack_frame: &mut InterruptStackFrame,
_error_code: u64, // code is always zero
-) {
+) -> ! {
match get_expected_fault() {
InterruptType::DoubleFault => qemu::exit_qemu(qemu::QemuExitCode::Success),
_ => panic!(
diff --git a/kernel/src/interrupts/idt.rs b/kernel/src/interrupts/idt.rs
index c901916..641e44e 100644
--- a/kernel/src/interrupts/idt.rs
+++ b/kernel/src/interrupts/idt.rs
@@ -11,7 +11,7 @@ lazy_static! {
idt.breakpoint
.set_handler_fn(exception_handlers::breakpoint_handler);
- idt.divide_by_zero
+ idt.divide_error
.set_handler_fn(exception_handlers::div_zero_handler);
idt.segment_not_present
.set_handler_fn(exception_handlers::segment_not_present_handler);
diff --git a/kernel/src/io/qemu.rs b/kernel/src/io/qemu.rs
index 8b01885..cf673da 100644
--- a/kernel/src/io/qemu.rs
+++ b/kernel/src/io/qemu.rs
@@ -5,11 +5,12 @@ pub enum QemuExitCode {
Failed = 0x11,
}
-pub fn exit_qemu(exit_code: QemuExitCode) {
+pub fn exit_qemu(exit_code: QemuExitCode) -> ! {
use x86_64::instructions::port::Port;
unsafe {
let mut port = Port::new(0xf4);
port.write(exit_code as u32);
+ unreachable!("qemu should have quitted")
}
}
diff --git a/kernel/src/main.rs b/kernel/src/main.rs
index 8b21eef..50b281f 100644
--- a/kernel/src/main.rs
+++ b/kernel/src/main.rs
@@ -10,17 +10,17 @@ pub mod interrupts;
pub mod io;
pub mod testing;
-use core::fmt::Write;
pub use io::qemu::{exit_qemu, QemuExitCode};
pub use io::vga_text::OStream;
pub use io::{qemu, serial, vga_text};
#[no_mangle]
extern "C" fn _start() -> ! {
- kernel::init();
+ interrupts::gdt::init();
+ interrupts::idt::init();
let apic = interrupts::apic::Apic::new().expect("no APIC support");
- let mut apic = unsafe { interrupts::apic::set_local_apic(apic) };
+ let apic = unsafe { interrupts::apic::set_local_apic(apic) };
apic.set_timer_interrupt_handler(
interrupts::apic::TimerDivideConfig::Div16,