compiler/
kernel/
lib/
scripts/
seed/
sublime/
test/
acceptance/
boot/
bootstrap/
cycles/
dispatch/
loader/
mmio/
kernel/
machine.ras
683 B
spin.rad
1.9 KiB
modules/
native/
packages/
pages/
runtime/
scheduling/
shared/
slots/
smp/
sync/
termination/
tests/
trap/
run
2.7 KiB
runner.rad
10.3 KiB
vim/
.gitignore
336 B
.gitsigners
112 B
CONTRIBUTING
2.1 KiB
LICENSE
1.1 KiB
Makefile
10.2 KiB
README
2.5 KiB
STYLE
2.5 KiB
std.lib
1.5 KiB
std.lib.test
551 B
test/mmio/spin.rad
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 { mmio::write32(device, 0, 0x5555); } |
| 44 | if scenario == 3 { let value = mmio::read8(device, 0); } |
| 45 | if scenario == 4 { mmio::write32(device, 1, 1); } |
| 46 | if scenario == 5 { let value = mmio::read8(device, 4096); } |
| 47 | if scenario == 6 { try! sys::capabilityDrop(device); mmio::write32(device, 0, 0x5555); } |
| 48 | if scenario == 7 { let value = mmio::read8(device, 0); } |
| 49 | if scenario == 8 { mmio::write64(device, 0xfffffffffffffff8, 1); } |
| 50 | sys::exit(99); |
| 51 | } |