Print out more useful information about AP and BSP, create kmain_ap

This commit is contained in:
Jeremy Soller 2016-08-17 19:38:04 -06:00
parent 0d995bfb5c
commit 8ddddcec9f
4 changed files with 19 additions and 14 deletions

View file

@ -53,7 +53,7 @@ pub fn init_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) {
// Allocate a stack // Allocate a stack
// TODO: Allocate contiguous // TODO: Allocate contiguous
let stack_start = allocate_frame().expect("no more frames").start_address().get(); let stack_start = allocate_frame().expect("no more frames").start_address().get();
for i in 0..62 { for _i in 0..62 {
allocate_frame().expect("no more frames"); allocate_frame().expect("no more frames");
} }
let stack_end = allocate_frame().expect("no more frames").start_address().get() + 4096; let stack_end = allocate_frame().expect("no more frames").start_address().get() + 4096;

View file

@ -36,7 +36,6 @@ pub unsafe fn stack_trace() {
println!("TRACE: {:>016X}", rbp); println!("TRACE: {:>016X}", rbp);
//Maximum 64 frames //Maximum 64 frames
for _frame in 0..64 { for _frame in 0..64 {
unsafe {
let rip = *(rbp as *const usize).offset(1); let rip = *(rbp as *const usize).offset(1);
println!(" {:>016X}: {:>016X}", rbp, rip); println!(" {:>016X}: {:>016X}", rbp, rip);
if rip == 0 { if rip == 0 {
@ -44,7 +43,6 @@ pub unsafe fn stack_trace() {
} }
rbp = *(rbp as *const usize); rbp = *(rbp as *const usize);
} }
}
} }
/// x86 External Interrupts (1-16). /// x86 External Interrupts (1-16).

View file

@ -11,7 +11,6 @@ use allocator::{HEAP_START, HEAP_SIZE};
use externs::memset; use externs::memset;
use gdt; use gdt;
use idt; use idt;
use interrupt;
use memory; use memory;
use paging::{self, entry, Page, VirtualAddress}; use paging::{self, entry, Page, VirtualAddress};
@ -27,6 +26,8 @@ static BSP_PAGE_TABLE: AtomicUsize = ATOMIC_USIZE_INIT;
extern { extern {
/// Kernel main function /// Kernel main function
fn kmain() -> !; fn kmain() -> !;
/// Kernel main for APs
fn kmain_ap() -> !;
} }
/// The entry to Rust, all things must be initialized /// The entry to Rust, all things must be initialized
@ -71,7 +72,7 @@ pub unsafe extern fn kstart() -> ! {
let mut active_table = paging::init(stack_start, stack_end); let mut active_table = paging::init(stack_start, stack_end);
// Reset AP variables // Reset AP variables
AP_COUNT.store(1, Ordering::SeqCst); AP_COUNT.store(0, Ordering::SeqCst);
BSP_READY.store(false, Ordering::SeqCst); BSP_READY.store(false, Ordering::SeqCst);
BSP_PAGE_TABLE.store(controlregs::cr3() as usize, Ordering::SeqCst); BSP_PAGE_TABLE.store(controlregs::cr3() as usize, Ordering::SeqCst);
@ -116,7 +117,5 @@ pub unsafe extern fn kstart_ap(stack_start: usize, stack_end: usize) -> ! {
print!("{}", ::core::str::from_utf8_unchecked(&[b'A', b'P', b' ', ap_number as u8 + b'0', b'\n'])); print!("{}", ::core::str::from_utf8_unchecked(&[b'A', b'P', b' ', ap_number as u8 + b'0', b'\n']));
loop { kmain_ap();
interrupt::enable_and_halt();
}
} }

View file

@ -109,6 +109,14 @@ pub mod tests;
pub extern fn kmain() { pub extern fn kmain() {
loop { loop {
unsafe { interrupt::enable_and_halt(); } unsafe { interrupt::enable_and_halt(); }
print!("HALT\n"); print!("INT BSP\n");
}
}
#[no_mangle]
pub extern fn kmain_ap() {
loop {
unsafe { interrupt::enable_and_halt() }
print!("INT AP\n");
} }
} }