Skip to content

Commit 7d97932

Browse files
committed
Upgrade to latext x86_64 crate (with our LockedIdt changes intact)
1 parent 36fbc55 commit 7d97932

File tree

24 files changed

+3399
-211
lines changed

24 files changed

+3399
-211
lines changed

Cargo.lock

Lines changed: 27 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kernel/apic/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ git = "https://github.com/theseus-os/irq_safety"
2828
[dependencies.atomic_linked_list]
2929
path = "../../libs/atomic_linked_list"
3030

31+
[dependencies.msr]
32+
path = "../../libs/msr"
33+
3134
[dependencies.pit_clock]
3235
path = "../pit_clock"
3336

kernel/apic/src/lib.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ extern crate x86_64;
1919
extern crate pit_clock;
2020
extern crate crossbeam_utils;
2121
extern crate bit_field;
22+
extern crate msr;
2223

2324
use volatile::{Volatile, ReadOnly, WriteOnly};
2425
use zerocopy::FromBytes;
2526
use alloc::boxed::Box;
2627
use owning_ref::BoxRefMut;
2728
use spin::Once;
2829
use raw_cpuid::CpuId;
29-
use x86_64::registers::msr::*;
30+
use msr::*;
3031
use irq_safety::RwLockIrqSafe;
3132
use memory::{PageTable, PhysicalAddress, EntryFlags, MappedPages, allocate_pages, allocate_frames_at};
3233
use kernel_config::time::CONFIG_TIMESLICE_PERIOD_MICROSECONDS;
@@ -707,3 +708,13 @@ impl LocalApic {
707708
}
708709
}
709710
}
711+
712+
// Below: temporary functions for reading MSRs that aren't yet in the `x86_64` crate.
713+
714+
fn rdmsr(msr: u32) -> u64 {
715+
unsafe { x86_64::registers::model_specific::Msr::new(msr).read() }
716+
}
717+
718+
unsafe fn wrmsr(msr: u32, value: u64) {
719+
x86_64::registers::model_specific::Msr::new(msr).write(value)
720+
}

kernel/e1000/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ use memory::{PhysicalAddress, MappedPages};
3939
use pci::{PciDevice, PCI_INTERRUPT_LINE, PciConfigSpaceAccessMechanism};
4040
use kernel_config::memory::PAGE_SIZE;
4141
use owning_ref::BoxRefMut;
42-
use interrupts::{eoi,register_interrupt};
43-
use x86_64::structures::idt::{ExceptionStackFrame};
42+
use interrupts::{eoi, register_interrupt};
43+
use x86_64::structures::idt::InterruptStackFrame;
4444
use network_interface_card:: NetworkInterfaceCard;
4545
use nic_initialization::{allocate_memory, init_rx_buf_pool, init_rx_queue, init_tx_queue};
4646
use intel_ethernet::descriptors::{LegacyRxDescriptor, LegacyTxDescriptor};
@@ -422,7 +422,7 @@ impl E1000Nic {
422422
}
423423
}
424424

425-
extern "x86-interrupt" fn e1000_handler(_stack_frame: &mut ExceptionStackFrame) {
425+
extern "x86-interrupt" fn e1000_handler(_stack_frame: InterruptStackFrame) {
426426
if let Some(ref e1000_nic_ref) = E1000_NIC.get() {
427427
let mut e1000_nic = e1000_nic_ref.lock();
428428
if let Err(e) = e1000_nic.handle_interrupt() {

kernel/exceptions_early/src/lib.rs

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ extern crate gdt;
1313

1414
use spin::Mutex;
1515
use x86_64::structures::{
16-
idt::{LockedIdt, ExceptionStackFrame, PageFaultErrorCode},
16+
idt::{LockedIdt, InterruptStackFrame, PageFaultErrorCode},
1717
tss::TaskStateSegment,
1818
};
1919
use gdt::{Gdt, create_gdt};
@@ -43,7 +43,7 @@ pub fn init(double_fault_stack_top_unusable: Option<memory::VirtualAddress>) {
4343
if let Some(df_stack_top) = double_fault_stack_top_unusable {
4444
// Create and load an initial TSS and GDT so we can handle early exceptions such as double faults.
4545
let mut tss = TaskStateSegment::new();
46-
tss.interrupt_stack_table[tss::DOUBLE_FAULT_IST_INDEX] = x86_64::VirtualAddress(df_stack_top.value());
46+
tss.interrupt_stack_table[tss::DOUBLE_FAULT_IST_INDEX] = x86_64::VirtAddr::new(df_stack_top.value() as u64);
4747
println_raw!("exceptions_early(): Created TSS: {:?}", tss);
4848
*EARLY_TSS.lock() = tss;
4949

@@ -69,7 +69,7 @@ pub fn init(double_fault_stack_top_unusable: Option<memory::VirtualAddress>) {
6969
let mut idt = EARLY_IDT.lock(); // withholds interrupts
7070

7171
// SET UP FIXED EXCEPTION HANDLERS
72-
idt.divide_by_zero.set_handler_fn(divide_by_zero_handler);
72+
idt.divide_error.set_handler_fn(divide_error_handler);
7373
// missing: 0x01 debug exception
7474
idt.non_maskable_interrupt.set_handler_fn(nmi_handler);
7575
idt.breakpoint.set_handler_fn(breakpoint_handler);
@@ -109,16 +109,16 @@ pub fn init(double_fault_stack_top_unusable: Option<memory::VirtualAddress>) {
109109

110110

111111
/// exception 0x00
112-
pub extern "x86-interrupt" fn divide_by_zero_handler(stack_frame: &mut ExceptionStackFrame) {
113-
println_raw!("\nEXCEPTION (early): DIVIDE BY ZERO\n{:#?}", stack_frame);
112+
pub extern "x86-interrupt" fn divide_error_handler(stack_frame: InterruptStackFrame) {
113+
println_raw!("\nEXCEPTION (early): DIVIDE ERROR\n{:#?}", stack_frame);
114114

115115
loop {}
116116
}
117117

118118

119119

120120
/// exception 0x02
121-
pub extern "x86-interrupt" fn nmi_handler(stack_frame: &mut ExceptionStackFrame) {
121+
pub extern "x86-interrupt" fn nmi_handler(stack_frame: InterruptStackFrame) {
122122
println_raw!("\nEXCEPTION (early): NON-MASKABLE INTERRUPT at {:#x}\n{:#?}",
123123
stack_frame.instruction_pointer,
124124
stack_frame);
@@ -128,7 +128,7 @@ pub extern "x86-interrupt" fn nmi_handler(stack_frame: &mut ExceptionStackFrame)
128128

129129

130130
/// exception 0x03
131-
pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut ExceptionStackFrame) {
131+
pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) {
132132
println_raw!("\nEXCEPTION (early): BREAKPOINT at {:#x}\n{:#?}",
133133
stack_frame.instruction_pointer,
134134
stack_frame);
@@ -137,7 +137,7 @@ pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut ExceptionStac
137137
}
138138

139139
/// exception 0x06
140-
pub extern "x86-interrupt" fn invalid_opcode_handler(stack_frame: &mut ExceptionStackFrame) {
140+
pub extern "x86-interrupt" fn invalid_opcode_handler(stack_frame: InterruptStackFrame) {
141141
println_raw!("\nEXCEPTION (early): INVALID OPCODE at {:#x}\n{:#?}",
142142
stack_frame.instruction_pointer,
143143
stack_frame);
@@ -149,7 +149,7 @@ pub extern "x86-interrupt" fn invalid_opcode_handler(stack_frame: &mut Exception
149149
///
150150
/// For more information about "spurious interrupts",
151151
/// see [here](http://wiki.osdev.org/I_Cant_Get_Interrupts_Working#I_keep_getting_an_IRQ7_for_no_apparent_reason).
152-
pub extern "x86-interrupt" fn device_not_available_handler(stack_frame: &mut ExceptionStackFrame) {
152+
pub extern "x86-interrupt" fn device_not_available_handler(stack_frame: InterruptStackFrame) {
153153
println_raw!("\nEXCEPTION (early): DEVICE_NOT_AVAILABLE at {:#x}\n{:#?}",
154154
stack_frame.instruction_pointer,
155155
stack_frame);
@@ -158,15 +158,15 @@ pub extern "x86-interrupt" fn device_not_available_handler(stack_frame: &mut Exc
158158
}
159159

160160

161-
pub extern "x86-interrupt" fn double_fault_handler(stack_frame: &mut ExceptionStackFrame, _error_code: u64) {
161+
pub extern "x86-interrupt" fn double_fault_handler(stack_frame: InterruptStackFrame, _error_code: u64) -> ! {
162162
println_raw!("\nEXCEPTION (early): DOUBLE FAULT\n{:#?}", stack_frame);
163163
println_raw!("\nNote: this may be caused by stack overflow. Is the size of the initial_bsp_stack is too small?");
164164

165165
loop {}
166166
}
167167

168168

169-
pub extern "x86-interrupt" fn segment_not_present_handler(stack_frame: &mut ExceptionStackFrame, error_code: u64) {
169+
pub extern "x86-interrupt" fn segment_not_present_handler(stack_frame: InterruptStackFrame, error_code: u64) {
170170
println_raw!("\nEXCEPTION (early): SEGMENT_NOT_PRESENT FAULT\nerror code: \
171171
{:#b}\n{:#?}",
172172
error_code,
@@ -176,7 +176,7 @@ pub extern "x86-interrupt" fn segment_not_present_handler(stack_frame: &mut Exce
176176
}
177177

178178

179-
pub extern "x86-interrupt" fn general_protection_fault_handler(stack_frame: &mut ExceptionStackFrame, error_code: u64) {
179+
pub extern "x86-interrupt" fn general_protection_fault_handler(stack_frame: InterruptStackFrame, error_code: u64) {
180180
println_raw!("\nEXCEPTION (early): GENERAL PROTECTION FAULT \nerror code: \
181181
{:#X}\n{:#?}",
182182
error_code,
@@ -186,9 +186,8 @@ pub extern "x86-interrupt" fn general_protection_fault_handler(stack_frame: &mut
186186
}
187187

188188

189-
pub extern "x86-interrupt" fn early_page_fault_handler(stack_frame: &mut ExceptionStackFrame, error_code: PageFaultErrorCode) {
190-
use x86_64::registers::control_regs;
191-
let accessed_address = control_regs::cr2();
189+
pub extern "x86-interrupt" fn early_page_fault_handler(stack_frame: InterruptStackFrame, error_code: PageFaultErrorCode) {
190+
let accessed_address = x86_64::registers::control::Cr2::read_raw();
192191
println_raw!("\nEXCEPTION (early): PAGE FAULT (early handler) while accessing {:#x}\nerror code: \
193192
{:?}\n{:#?}",
194193
accessed_address,
@@ -199,14 +198,14 @@ pub extern "x86-interrupt" fn early_page_fault_handler(stack_frame: &mut Excepti
199198
println_raw!("Exception IP {:#X} is at {:?}",
200199
stack_frame.instruction_pointer,
201200
mod_mgmt::get_initial_kernel_namespace().and_then(|ns| ns.get_section_containing_address(
202-
memory::VirtualAddress::new_canonical(stack_frame.instruction_pointer.0 as usize),
201+
memory::VirtualAddress::new_canonical(stack_frame.instruction_pointer.as_u64() as usize),
203202
false // only look at .text sections, not all other types
204203
)),
205204
);
206205
println_raw!("Faulted access address {:#X} is at {:?}",
207206
accessed_address,
208207
mod_mgmt::get_initial_kernel_namespace().and_then(|ns| ns.get_section_containing_address(
209-
memory::VirtualAddress::new_canonical(accessed_address.0 as usize),
208+
memory::VirtualAddress::new_canonical(accessed_address as usize),
210209
true, // look at all sections (.data/.bss/.rodata), not just .text
211210
)),
212211
);

0 commit comments

Comments
 (0)