From 8540d3844bd6b2f8f2c960a2cfe81230530e3c2a Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 27 May 2016 21:21:08 +0200 Subject: [PATCH] Use new x86::segmentation::cs function and merge `set_handler` and `options` We avoid inline assembly and increase safety (it is no longer possible to set the non-present initilization entries to present). --- Cargo.toml | 2 +- src/interrupts/idt.rs | 14 ++++---------- src/interrupts/mod.rs | 4 +--- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 35c3afea..a5503538 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ git = "https://github.com/phil-opp/multiboot2-elf64" [dependencies.x86] default-features = false -version = "0.6.0" +version = "0.7.0" [lib] crate-type = ["staticlib"] diff --git a/src/interrupts/idt.rs b/src/interrupts/idt.rs index d507293a..f1700919 100644 --- a/src/interrupts/idt.rs +++ b/src/interrupts/idt.rs @@ -1,3 +1,4 @@ +use x86::segmentation::{self, SegmentSelector}; pub struct Idt([Entry; 16]); @@ -6,14 +7,8 @@ impl Idt { Idt([Entry::missing(); 16]) } - pub fn set_handler(&mut self, entry: u8, handler: extern "C" fn() -> !) { - let segment: u16; - unsafe { asm!("mov %cs, $0" : "=r" (segment) ) }; - let code_segment = SegmentSelector::from_raw(segment); - self.0[entry as usize] = Entry::new(code_segment, handler); - } - - pub fn options(&mut self, entry: u8) -> &mut EntryOptions { + pub fn set_handler(&mut self, entry: u8, handler: extern "C" fn() -> !) -> &mut EntryOptions { + self.0[entry as usize] = Entry::new(segmentation::cs(), handler); &mut self.0[entry as usize].options } @@ -31,7 +26,6 @@ impl Idt { } use bit_field::BitField; -use x86::segmentation::SegmentSelector; #[derive(Debug, Clone, Copy)] #[repr(C, packed)] @@ -56,7 +50,7 @@ impl Entry { } } - pub fn new(gdt_selector: SegmentSelector, handler: extern "C" fn() -> !) -> Self { + fn new(gdt_selector: SegmentSelector, handler: extern "C" fn() -> !) -> Self { let pointer = handler as u64; Entry { gdt_selector: gdt_selector, diff --git a/src/interrupts/mod.rs b/src/interrupts/mod.rs index c701d09d..cb8e804d 100644 --- a/src/interrupts/mod.rs +++ b/src/interrupts/mod.rs @@ -9,12 +9,10 @@ lazy_static! { let mut idt = idt::Idt::new(); idt.set_handler(0, divide_by_zero_handler); - idt.set_handler(8, double_fault_handler); + idt.set_handler(8, double_fault_handler).set_stack_index(1); idt.set_handler(13, general_protection_fault_handler); idt.set_handler(14, page_fault_handler); - idt.options(8).set_stack_index(1); - idt };