diff --git a/Makefile b/Makefile index d1486b6..a867c9a 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ bochs: build/harddrive.bin bochs -f bochs.$(ARCH) qemu: build/harddrive.bin - qemu-system-$(ARCH) -enable-kvm -cpu host -smp 2 -machine q35 \ + qemu-system-$(ARCH) -enable-kvm -cpu host -smp 4 -machine q35 \ -serial mon:stdio -drive file=$<,format=raw,index=0,media=disk \ -nographic -d guest_errors,int,pcall #-device intel-iommu diff --git a/arch/x86_64/src/acpi/mod.rs b/arch/x86_64/src/acpi/mod.rs index 5929aa7..ebb5191 100644 --- a/arch/x86_64/src/acpi/mod.rs +++ b/arch/x86_64/src/acpi/mod.rs @@ -3,7 +3,7 @@ use core::intrinsics::{atomic_load, atomic_store}; -use memory::Frame; +use memory::{allocate_frame, Frame}; use paging::{entry, ActivePageTable, Page, PhysicalAddress, VirtualAddress}; use start::kstart_ap; @@ -50,19 +50,9 @@ pub fn init_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { } } - // Map a stack - /* - let stack_start = HEAP_START + HEAP_SIZE + 4096 + (asp_local_apic.id as usize * (1024 * 1024 + 4096)); - let stack_end = stack_start + 1024 * 1024; - { - let start_page = Page::containing_address(VirtualAddress::new(stack_start)); - let end_page = Page::containing_address(VirtualAddress::new(stack_end - 1)); - - for page in Page::range_inclusive(start_page, end_page) { - active_table.map(page, entry::WRITABLE | entry::NO_EXECUTE); - } - } - */ + // Allocate a stack + let stack_start = allocate_frame().expect("no more frames").start_address().get(); + let stack_end = stack_start + 4096; let ap_ready = TRAMPOLINE as *mut u64; let ap_stack_start = unsafe { ap_ready.offset(1) }; @@ -71,8 +61,8 @@ pub fn init_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { // Set the ap_ready to 0, volatile unsafe { atomic_store(ap_ready, 0) }; - unsafe { atomic_store(ap_stack_start, 0x1000) }; - unsafe { atomic_store(ap_stack_end, 0x7000) }; + unsafe { atomic_store(ap_stack_start, stack_start as u64) }; + unsafe { atomic_store(ap_stack_end, stack_end as u64) }; unsafe { atomic_store(ap_code, kstart_ap as u64) }; // Send INIT IPI diff --git a/arch/x86_64/src/lib.rs b/arch/x86_64/src/lib.rs index d9b5b3e..e360614 100644 --- a/arch/x86_64/src/lib.rs +++ b/arch/x86_64/src/lib.rs @@ -83,7 +83,7 @@ macro_rules! interrupt_error { $func } - // Push scratch registers, grab stack pointer + // Push scratch registers asm!("push rax push rcx push rdx diff --git a/arch/x86_64/src/start.rs b/arch/x86_64/src/start.rs index a6d44f8..3a93902 100644 --- a/arch/x86_64/src/start.rs +++ b/arch/x86_64/src/start.rs @@ -3,6 +3,8 @@ /// It must create the IDT with the correct entries, those entries are /// defined in other files inside of the `arch` module +use core::sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT, Ordering}; + use acpi; use allocator::{HEAP_START, HEAP_SIZE}; use externs::memset; @@ -16,6 +18,8 @@ static BSS_TEST_ZERO: usize = 0; /// Test of non-zero values in BSS. static BSS_TEST_NONZERO: usize = 0xFFFFFFFFFFFFFFFF; +static BSP_READY: AtomicBool = ATOMIC_BOOL_INIT; + extern { /// Kernel main function fn kmain() -> !; @@ -46,6 +50,8 @@ pub unsafe extern fn kstart() -> ! { debug_assert_eq!(BSS_TEST_NONZERO, 0xFFFFFFFFFFFFFFFF); } + BSP_READY.store(false, Ordering::SeqCst); + // Set up GDT gdt::init(); @@ -72,6 +78,13 @@ pub unsafe extern fn kstart() -> ! { for page in Page::range_inclusive(heap_start_page, heap_end_page) { active_table.map(page, entry::WRITABLE | entry::NO_EXECUTE); } + + BSP_READY.store(true, Ordering::SeqCst); + } + + + for _i in 0..10 { + print!("BSP\n"); } kmain(); @@ -98,6 +111,14 @@ pub unsafe extern fn kstart_ap(stack_start: usize, stack_end: usize) -> ! { } } + while ! BSP_READY.load(Ordering::SeqCst) { + asm!("pause" : : : : "intel", "volatile"); + } + + for _i in 0..10 { + print!("AP\n"); + } + loop { asm!("hlt"); }