feat(kernel): SystemControl cap for halt, board device table + boot caps to init, RegionAddress syscall, idle loop services irqs
This commit is contained in:
@@ -310,7 +310,7 @@ fn new_round(k: &mut Kernel<MockPlatform>, init: ProcessId, init_thread: ThreadI
|
||||
|
||||
#[test]
|
||||
fn the_kernel_survives_a_syscall_storm() {
|
||||
let mut total = [0usize; 36];
|
||||
let mut total = [0usize; 36 + 1];
|
||||
for seed in [17u64, 0xABCD_EF01, 4242, 0x1357_9BDF, 8] {
|
||||
let (mut k, init) = kernel_with_process();
|
||||
let init_thread = k.current_thread().unwrap();
|
||||
@@ -318,7 +318,7 @@ fn the_kernel_survives_a_syscall_storm() {
|
||||
let mut rng = Rng(seed);
|
||||
let mut executed = 0;
|
||||
let mut rounds = 0;
|
||||
let mut succeeded = [0usize; 36];
|
||||
let mut succeeded = [0usize; 36 + 1];
|
||||
new_round(&mut k, init, init_thread);
|
||||
|
||||
let mut step = 0;
|
||||
@@ -350,9 +350,11 @@ fn the_kernel_survives_a_syscall_storm() {
|
||||
}
|
||||
let tid = runnable[rng.below(runnable.len())];
|
||||
let is_init = k.thread_process(tid) == Some(init);
|
||||
let nr = rng.below(36);
|
||||
// Halting stops the machine and init exiting ends the test.
|
||||
if nr == SYS_HALT || (is_init && (nr == SYS_EXIT || nr == SYS_EXIT_THREAD)) {
|
||||
let nr = rng.below(36 + 1);
|
||||
// init exiting ends the test. Halt stays in: nobody here holds
|
||||
// a SystemControl cap, so a halt that got through would panic
|
||||
// the mock platform and fail the test.
|
||||
if is_init && (nr == SYS_EXIT || nr == SYS_EXIT_THREAD) {
|
||||
continue;
|
||||
}
|
||||
let args: [usize; 6] = core::array::from_fn(|_| rng.arg());
|
||||
@@ -415,6 +417,7 @@ fn the_kernel_survives_a_syscall_storm() {
|
||||
SYS_RELEASE_PAGES,
|
||||
SYS_CREATE_REGION,
|
||||
SYS_MAP_REGION,
|
||||
SYS_REGION_ADDRESS,
|
||||
SYS_KILL,
|
||||
SYS_CREATE_PROCESS,
|
||||
SYS_SPAWN_THREAD,
|
||||
|
||||
Reference in New Issue
Block a user