Nothing to see here, move along
1use core::sync::atomic::{AtomicBool, Ordering};
2
3pub static BREAKPOINT_HIT: AtomicBool = AtomicBool::new(false);
4
5crate::kernel_test!(
6 fn breakpoint_fires_and_returns() {
7 BREAKPOINT_HIT.store(false, Ordering::SeqCst);
8 x86_64::instructions::interrupts::int3();
9 assert!(
10 BREAKPOINT_HIT.load(Ordering::SeqCst),
11 "breakpoint handler did not set flag"
12 );
13 }
14);
15
16crate::kernel_test!(
17 fn apic_timer_ticks_increment() {
18 let before = crate::arch::apic::tick_count();
19 x86_64::instructions::interrupts::enable();
20 let start = crate::wcet::tsc::read_tsc();
21 let freq = crate::wcet::tsc::freq_hz();
22 let target_cycles = freq / 20;
23 let mut spins: u64 = 0;
24 #[allow(clippy::while_immutable_condition)]
25 while crate::wcet::tsc::read_tsc() - start < target_cycles {
26 x86_64::instructions::hlt();
27 spins += 1;
28 assert!(spins < 1_000_000, "spin bound exceeded waiting for timer");
29 }
30 let after = crate::arch::apic::tick_count();
31 assert!(
32 after > before,
33 "tick count did not increase: before={}, after={}",
34 before,
35 after
36 );
37 }
38);
39
40crate::kernel_test!(
41 fn tsc_calibration_sanity() {
42 let freq = crate::wcet::tsc::freq_hz();
43 let cycles_for_1ms = freq / 1000;
44 let ns = crate::wcet::tsc::cycles_to_ns(cycles_for_1ms);
45 assert!(
46 (900_000..=1_100_000).contains(&ns),
47 "1ms worth of cycles converted to {}ns (expected ~1_000_000)",
48 ns
49 );
50 }
51);
52
53crate::kernel_test!(
54 fn reserved_vector_validation() {
55 use crate::arch::x86_64::idt::IrqVector;
56
57 assert!(
58 crate::syscall::irq::is_reserved_vector(crate::arch::x86_64::idt::TIMER_VECTOR),
59 "TIMER_VECTOR must be reserved"
60 );
61 assert!(
62 crate::syscall::irq::is_reserved_vector(crate::arch::x86_64::idt::ERROR_VECTOR),
63 "ERROR_VECTOR must be reserved"
64 );
65 assert!(
66 crate::syscall::irq::is_reserved_vector(crate::arch::x86_64::idt::COM1_VECTOR),
67 "COM1_VECTOR must be reserved"
68 );
69 assert!(
70 crate::syscall::irq::is_reserved_vector(crate::arch::x86_64::idt::SPURIOUS_VECTOR),
71 "SPURIOUS_VECTOR must be reserved"
72 );
73
74 assert!(
75 !crate::syscall::irq::is_reserved_vector(IrqVector::new(48)),
76 "vector 48 should not be reserved"
77 );
78 assert!(
79 !crate::syscall::irq::is_reserved_vector(IrqVector::new(64)),
80 "vector 64 should not be reserved"
81 );
82 assert!(
83 !crate::syscall::irq::is_reserved_vector(IrqVector::new(128)),
84 "vector 128 should not be reserved"
85 );
86 }
87);