test/mmio/spin.rad 2.0 KiB raw
1
//! User-mode register widths and rejected MMIO authority.
2
export mod abi;
3
export mod sys;
4
export mod mmio;
5
6
/// Device values installed in the calling domain's table.
7
record Arguments: Copy {
8
    /// Register interface under test.
9
    device: abi::Handle,
10
    /// Read-only machine timer.
11
    clock: abi::Handle,
12
}
13
14
/// Case selection and readable arguments supplied by the test parent.
15
record Env: Copy {
16
    /// Installed device handles.
17
    argsPointer: *Arguments,
18
    /// Sixteen plus the test case number.
19
    argsSize: u64,
20
    /// Installed event capability.
21
    eventsHandle: u64,
22
    /// Shared ring address.
23
    eventsPointer: u64,
24
}
25
26
/// Execute each width, or require a kernel fault before an unauthorized access.
27
@default fn main(env: *Env) {
28
    let device = env.argsPointer.device;
29
    let scenario = env.argsSize - 16;
30
    if scenario == 0 {
31
        let before = mmio::read64(env.argsPointer.clock, 0);
32
        mmio::write8(device, 0, 0x81);
33
        mmio::write16(device, 2, 0x8123);
34
        mmio::write32(device, 4, 0x81234567);
35
        mmio::write64(device, 8, 0x8123456789abcdef);
36
        assert mmio::read8(device, 0) == 0x81;
37
        assert mmio::read16(device, 2) == 0x8123;
38
        assert mmio::read32(device, 4) == 0x81234567;
39
        assert mmio::read64(device, 8) == 0x8123456789abcdef;
40
        assert mmio::read32(env.argsPointer.clock, 0) as u64 >= before;
41
        sys::exit(61);
42
    }
43
    if scenario == 1 or scenario == 2 {
44
        mmio::write32(device, 0, 0x5555);
45
    }
46
    if scenario == 3 {
47
        let value = mmio::read8(device, 0);
48
    }
49
    if scenario == 4 {
50
        mmio::write32(device, 1, 1);
51
    }
52
    if scenario == 5 {
53
        let value = mmio::read8(device, 4096);
54
    }
55
    if scenario == 6 {
56
        try! sys::capabilityDrop(device);
57
        mmio::write32(device, 0, 0x5555);
58
    }
59
    if scenario == 7 {
60
        let value = mmio::read8(device, 0);
61
    }
62
    if scenario == 8 {
63
        mmio::write64(device, 0xfffffffffffffff8, 1);
64
    }
65
    sys::exit(99);
66
}