test/bootstrap/root.rad 1.8 KiB raw
1
//! Validate the root startup bundle from user mode.
2
export mod abi;
3
export mod sys;
4
5
/// Typed startup view used by the boot root package.
6
record Env: Copy {
7
    /// Root-owned resource bundle.
8
    argsPointer: *abi::BootInfo,
9
    /// Byte size of the bundle header.
10
    argsSize: u64,
11
    /// Installed Events capability.
12
    eventsHandle: u64,
13
    /// Shared event-ring address.
14
    eventsPointer: u64,
15
}
16
17
/// Check root identity, resource ordering, and image authority before returning.
18
@default unsafe fn main(env: *Env) {
19
    assert env.argsSize == @sizeOf(abi::BootInfo) as u64;
20
    let info = env.argsPointer;
21
    let handles = info.handles;
22
    let self = sys::queryDomain(abi::Handle(handles[0]));
23
    assert (self.id & 0xffffffff) == 0 and self.creator == self.id;
24
    assert handles[1] == env.eventsHandle and info.timebase > 0;
25
    let mut harts: u64 = 0;
26
    for hart in 0..8 { if (info.harts & (1 << hart as u64)) <> 0 { set harts += 1; } }
27
    assert handles.len as u64 == 2 + info.devices + info.interrupts + harts;
28
    for i in 0..info.devices as u32 {
29
        let device = sys::queryDevice(abi::Handle(handles[2 + i]));
30
        assert device.size > 0;
31
    }
32
    for i in 0..info.interrupts as u32 {
33
        let irq = sys::queryInterrupt(abi::Handle(handles[2 + info.devices as u32 + i]));
34
        assert irq.number == i + 1;
35
    }
36
    assert sys::queryDevice(info.clock).size == 8;
37
    assert sys::queryDevice(info.shutdown).size >= 4;
38
    assert (try! sys::queryImage(info.rootImage)).entry <> 0;
39
    assert (try! sys::queryImage(info.schedulerImage)).entry <> 0;
40
    let current = sys::currentContext();
41
    let first = 2 + info.devices as u32 + info.interrupts as u32;
42
    assert current.hart == 0 and current.budget == handles[first];
43
    assert (try! sys::queryBudget(abi::Handle(handles[first]))).hart == 0;
44
}