compiler/
kernel/
lib/
scripts/
seed/
sublime/
test/
acceptance/
boot/
bootstrap/
kernel/
machine.ras
683 B
root.rad
1.8 KiB
run
1.5 KiB
service.rad
155 B
cycles/
dispatch/
loader/
mmio/
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/bootstrap/root.rad
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 | } |