diff --git a/arch/x86_64/src/acpi/local_apic.rs b/arch/x86_64/src/acpi/local_apic.rs index 5c61e88..8c2d760 100644 --- a/arch/x86_64/src/acpi/local_apic.rs +++ b/arch/x86_64/src/acpi/local_apic.rs @@ -5,33 +5,9 @@ use x86::msr::*; use memory::Frame; use paging::{entry, ActivePageTable, PhysicalAddress}; -bitflags! { - pub flags LocalApicIcr: u64 { - const ICR_VECTOR = 0xFF, - - const ICR_FIXED = 0b000 << 8, - const ICR_SMI = 0b010 << 8, - const ICR_NMI = 0b100 << 8, - const ICR_INIT = 0b101 << 8, - const ICR_START = 0b110 << 8, - - const ICR_PHYSICAL = 0 << 11, - const ICR_LOGICAL = 1 << 11, - - const ICR_DEASSERT = 0 << 14, - const ICR_ASSERT = 1 << 14, - - const ICR_EDGE = 0 << 15, - const ICR_LEVEL = 1 << 15, - - const ICR_DESTINATION = 0b1111 << 56, - } -} - /// Local APIC -#[repr(packed)] pub struct LocalApic { - address: u32, + pub address: u32, pub x2: bool } @@ -42,8 +18,6 @@ impl LocalApic { x2: false }; - println!("APIC BASE: {:>08X}", apic.address); - unsafe { wrmsr(IA32_APIC_BASE, rdmsr(IA32_APIC_BASE) & !(1 << 11 | 1 << 10)) }; unsafe { wrmsr(IA32_APIC_BASE, rdmsr(IA32_APIC_BASE) | 1 << 11) }; @@ -51,11 +25,8 @@ impl LocalApic { if CpuId::new().get_feature_info().unwrap().has_x2apic() { unsafe { wrmsr(IA32_APIC_BASE, rdmsr(IA32_APIC_BASE) | 1 << 10) }; apic.x2 = true; - println!("X2APIC {:X}", unsafe { rdmsr(IA32_APIC_BASE) }); } else { active_table.identity_map(Frame::containing_address(PhysicalAddress::new(apic.address as usize)), entry::PRESENT | entry::WRITABLE | entry::NO_EXECUTE); - - println!("XAPIC {:X}", unsafe { rdmsr(IA32_APIC_BASE) }); } apic diff --git a/arch/x86_64/src/acpi/mod.rs b/arch/x86_64/src/acpi/mod.rs index dfe963e..e96ca40 100644 --- a/arch/x86_64/src/acpi/mod.rs +++ b/arch/x86_64/src/acpi/mod.rs @@ -9,7 +9,7 @@ use memory::{allocate_frame, Frame}; use paging::{entry, ActivePageTable, Page, PhysicalAddress, VirtualAddress}; use start::{kstart_ap, AP_READY}; -use self::local_apic::{LocalApic, LocalApicIcr}; +use self::local_apic::LocalApic; use self::madt::{Madt, MadtEntry}; use self::rsdt::Rsdt; use self::sdt::Sdt; @@ -29,15 +29,20 @@ pub fn init_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { for &c in sdt.signature.iter() { print!("{}", c as char); } - println!(":"); if let Some(madt) = Madt::new(sdt) { - println!(" {:>016X}: {}", madt.local_address, madt.flags); + println!(": {:>08X}: {}", madt.local_address, madt.flags); let mut local_apic = LocalApic::new(active_table); let me = local_apic.id() as u8; + if local_apic.x2 { + println!(" X2APIC {}", me); + } else { + println!(" XAPIC {}: {:>08X}", me, local_apic.address); + } + for madt_entry in madt.iter() { println!(" {:?}", madt_entry); match madt_entry { @@ -72,6 +77,8 @@ pub fn init_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { unsafe { atomic_store(ap_code, kstart_ap as u64) }; AP_READY.store(false, Ordering::SeqCst); + print!(" AP {}:", ap_local_apic.id); + // Send INIT IPI { let mut icr = 0x4500; @@ -80,7 +87,7 @@ pub fn init_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { } else { icr |= (ap_local_apic.id as u64) << 56; } - println!(" Sending IPI to {}: {:>016X} {:?}", ap_local_apic.id, icr, LocalApicIcr::from_bits(icr)); + print!(" IPI..."); local_apic.set_icr(icr); } @@ -95,21 +102,21 @@ pub fn init_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { } else { icr |= (ap_local_apic.id as u64) << 56; } - - println!(" Sending SIPI to {}: {:>016X} {:?}", ap_local_apic.id, icr, LocalApicIcr::from_bits(icr)); + + print!(" SIPI..."); local_apic.set_icr(icr); } // Wait for trampoline ready - println!(" Waiting for AP {}", ap_local_apic.id); + print!(" Wait..."); while unsafe { atomic_load(ap_ready) } == 0 { interrupt::pause(); } - println!(" AP {} is trampolined!", ap_local_apic.id); + print!(" Trampoline..."); while ! AP_READY.load(Ordering::SeqCst) { interrupt::pause(); } - println!(" AP {} is ready!", ap_local_apic.id); + println!(" Ready"); } else { println!(" CPU Disabled"); } @@ -117,8 +124,8 @@ pub fn init_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { _ => () } } - }else { - println!(" {:?}", sdt); + } else { + println!(": Unknown"); } } @@ -140,8 +147,6 @@ pub unsafe fn init(active_table: &mut ActivePageTable) -> Option { // Search for RSDP if let Some(rsdp) = RSDP::search(start_addr, end_addr) { - println!("{:?}", rsdp); - let get_sdt = |sdt_address: usize, active_table: &mut ActivePageTable| -> &'static Sdt { if active_table.translate_page(Page::containing_address(VirtualAddress::new(sdt_address))).is_none() { let sdt_frame = Frame::containing_address(PhysicalAddress::new(sdt_address));