diff --git a/kernel/selftest/page_table.c b/kernel/selftest/page_table.c index efdb23d..12248de 100644 --- a/kernel/selftest/page_table.c +++ b/kernel/selftest/page_table.c @@ -1,6 +1,7 @@ #include #include +#include #include #include "arch/x86/mm/page_table.h" @@ -20,10 +21,26 @@ void page_table_selftest(void) page_tables_init(); + if (map_page(TEST_VIRTUAL_PAGE + 1, page, PAGE_WRITABLE) != -EINVAL) { + panic("page table selftest unaligned map errno failed"); + } + + if (virt_to_phys(TEST_VIRTUAL_PAGE, 0) != -EINVAL) { + panic("page table selftest null output errno failed"); + } + + if (virt_to_phys(TEST_VIRTUAL_PAGE, &resolved) != -ENOENT) { + panic("page table selftest missing resolve errno failed"); + } + if (map_page(TEST_VIRTUAL_PAGE, page, PAGE_WRITABLE) != 0) { panic("page table selftest map failed"); } + if (map_page(TEST_VIRTUAL_PAGE, page, PAGE_WRITABLE) != -EEXIST) { + panic("page table selftest duplicate map errno failed"); + } + if (virt_to_phys(TEST_VIRTUAL_PAGE, &resolved) != 0 || resolved != page) { panic("page table selftest resolve failed"); @@ -38,6 +55,10 @@ void page_table_selftest(void) panic("page table selftest unmap failed"); } + if (unmap_page(TEST_VIRTUAL_PAGE) != -ENOENT) { + panic("page table selftest missing unmap errno failed"); + } + free_page(page); early_log_puts("page table selftest ok\n"); } diff --git a/kernel/selftest/sched.c b/kernel/selftest/sched.c index 5b1f1d4..53c88e0 100644 --- a/kernel/selftest/sched.c +++ b/kernel/selftest/sched.c @@ -14,9 +14,16 @@ static void thread_selftest_entry(void *arg) (void)arg; } +static int selftest_condition_false(void *arg) +{ + (void)arg; + return 0; +} + void sched_selftest(void) { struct spinlock test_lock; + struct wait_queue test_wait_queue; struct thread *first = kernel_thread_create("worker-a", thread_selftest_entry, 0); struct thread *second = @@ -47,6 +54,15 @@ void sched_selftest(void) spin_lock_irqsave(&test_lock, &flags); spin_unlock_irqrestore(&test_lock, flags); + wait_queue_init(&test_wait_queue); + if (wait_queue_wait(0, selftest_condition_false, 0) != -EINVAL) { + panic("wait queue selftest null queue errno failed"); + } + + if (wait_queue_wait(&test_wait_queue, 0, 0) != -EINVAL) { + panic("wait queue selftest null condition errno failed"); + } + early_log_puts("kernel thread selftest ok\n"); } @@ -127,6 +143,12 @@ static void timeout_wait_demo_waiter(void *arg) (void)arg; early_log_puts("timeout waiter sleeping\n"); + if (wait_queue_wait_timeout( + &timeout_wait_queue, condition_is_ready, &never_ready, 0) != + -ETIMEDOUT) { + panic("timeout wait zero tick errno failed"); + } + if (wait_queue_wait_timeout( &timeout_wait_queue, condition_is_ready, &never_ready, 3) != -ETIMEDOUT) {