diag: serial canary characters at kernel init checkpoints
This commit is contained in:
@@ -84,6 +84,15 @@ extern "C" fn kstart() {
|
|||||||
/// The entry to Rust, all things must be initialized
|
/// The entry to Rust, all things must be initialized
|
||||||
unsafe extern "C" fn start(args_ptr: *const KernelArgs, stack_end: usize) -> ! {
|
unsafe extern "C" fn start(args_ptr: *const KernelArgs, stack_end: usize) -> ! {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
// EARLY CANARY: write 'R' to COM1 before any kernel init.
|
||||||
|
// This proves the serial hardware works and the kernel reached Rust entry.
|
||||||
|
// If this character appears but "Redox OS starting..." does not,
|
||||||
|
// the hang is in args_ptr.read(), serial::init(), or graphical_debug::init().
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
{
|
||||||
|
core::arch::asm!("out dx, al", in("dx") 0x3F8u16, in("al") b'R', options(nostack, preserves_flags));
|
||||||
|
}
|
||||||
|
|
||||||
let bootstrap = {
|
let bootstrap = {
|
||||||
let args = args_ptr.read();
|
let args = args_ptr.read();
|
||||||
|
|
||||||
@@ -93,15 +102,31 @@ unsafe extern "C" fn start(args_ptr: *const KernelArgs, stack_end: usize) -> ! {
|
|||||||
// Set up graphical debug
|
// Set up graphical debug
|
||||||
graphical_debug::init(args.env());
|
graphical_debug::init(args.env());
|
||||||
|
|
||||||
|
// SECOND CANARY: write 'S' to COM1 after serial init.
|
||||||
|
// If 'R' appears but 'S' does not, the hang is in serial::init() or graphical_debug::init().
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
{
|
||||||
|
core::arch::asm!("out dx, al", in("dx") 0x3F8u16, in("al") b'S', options(nostack, preserves_flags));
|
||||||
|
}
|
||||||
|
|
||||||
info!("Redox OS starting...");
|
info!("Redox OS starting...");
|
||||||
args.print();
|
args.print();
|
||||||
|
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
{ core::arch::asm!("out dx, al", in("dx") 0x3F8u16, in("al") b'1', options(nostack, preserves_flags)); }
|
||||||
|
|
||||||
// Set up GDT
|
// Set up GDT
|
||||||
gdt::init_bsp(stack_end);
|
gdt::init_bsp(stack_end);
|
||||||
|
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
{ core::arch::asm!("out dx, al", in("dx") 0x3F8u16, in("al") b'2', options(nostack, preserves_flags)); }
|
||||||
|
|
||||||
// Set up IDT
|
// Set up IDT
|
||||||
idt::init_bsp();
|
idt::init_bsp();
|
||||||
|
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
{ core::arch::asm!("out dx, al", in("dx") 0x3F8u16, in("al") b'3', options(nostack, preserves_flags)); }
|
||||||
|
|
||||||
// Initialize RMM
|
// Initialize RMM
|
||||||
#[cfg(target_arch = "x86")]
|
#[cfg(target_arch = "x86")]
|
||||||
let mut bump_allocator =
|
let mut bump_allocator =
|
||||||
@@ -109,6 +134,9 @@ unsafe extern "C" fn start(args_ptr: *const KernelArgs, stack_end: usize) -> ! {
|
|||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
let mut bump_allocator = crate::startup::memory::init(&args, Some(0x100000), None);
|
let mut bump_allocator = crate::startup::memory::init(&args, Some(0x100000), None);
|
||||||
|
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
{ core::arch::asm!("out dx, al", in("dx") 0x3F8u16, in("al") b'4', options(nostack, preserves_flags)); }
|
||||||
|
|
||||||
// Initialize paging
|
// Initialize paging
|
||||||
paging::init();
|
paging::init();
|
||||||
|
|
||||||
@@ -135,6 +163,9 @@ unsafe extern "C" fn start(args_ptr: *const KernelArgs, stack_end: usize) -> ! {
|
|||||||
// Activate memory logging
|
// Activate memory logging
|
||||||
crate::log::init();
|
crate::log::init();
|
||||||
|
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
{ core::arch::asm!("out dx, al", in("dx") 0x3F8u16, in("al") b'6', options(nostack, preserves_flags)); }
|
||||||
|
|
||||||
// Initialize miscellaneous processor features
|
// Initialize miscellaneous processor features
|
||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
crate::arch::misc::init(LogicalCpuId::BSP);
|
crate::arch::misc::init(LogicalCpuId::BSP);
|
||||||
@@ -142,6 +173,9 @@ unsafe extern "C" fn start(args_ptr: *const KernelArgs, stack_end: usize) -> ! {
|
|||||||
// Initialize devices
|
// Initialize devices
|
||||||
device::init();
|
device::init();
|
||||||
|
|
||||||
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||||
|
{ core::arch::asm!("out dx, al", in("dx") 0x3F8u16, in("al") b'7', options(nostack, preserves_flags)); }
|
||||||
|
|
||||||
// Read ACPI tables, starts APs
|
// Read ACPI tables, starts APs
|
||||||
if cfg!(feature = "acpi") {
|
if cfg!(feature = "acpi") {
|
||||||
crate::acpi::init_after_mem(args.acpi_rsdp());
|
crate::acpi::init_after_mem(args.acpi_rsdp());
|
||||||
|
|||||||
Reference in New Issue
Block a user