#![no_main] #![feature(custom_test_frameworks)] #![feature(abi_x86_interrupt)] #![feature(panic_info_message)] #![feature(asm)] #![test_runner(crate::testing::test_runner)] #![no_std] pub mod interrupts; pub mod io; pub mod testing; pub use io::qemu::{exit_qemu, QemuExitCode}; pub use io::vga_text::OStream; pub use io::{qemu, serial, vga_text}; #[no_mangle] extern "C" fn _start() -> ! { interrupts::gdt::init(); interrupts::idt::init(); loop {} let apic = unsafe { interrupts::apic::try_initialize_local_apic() .as_mut() .expect("no APIC support") }; apic.set_timer_interrupt_handler( interrupts::apic::TimerDivideConfig::Div16, interrupts::InterruptType::Timer, ); x86_64::instructions::interrupts::enable(); let mut stdout = OStream::new(); stdout.print(b"apic initialisation complete\n"); //x86_64::instructions::interrupts::int3(); stdout.print(b"foolete\n"); if cfg!(test) { qemu::exit_qemu(qemu::QemuExitCode::Success); } #[allow(clippy::empty_loop)] loop {} } #[panic_handler] #[no_mangle] extern "C" fn panic_handler(info: &core::panic::PanicInfo) -> ! { if cfg!(test) { testing::serial_panic(info); } testing::panic(info); }