feat(kernel): console cap gates DebugPutchar, no uart fast path; spawn start arg in a0; delegate returns slot
This commit is contained in:
@@ -20,6 +20,13 @@ pub struct BoardDevice {
|
||||
pub irq: Option<IrqId>,
|
||||
}
|
||||
|
||||
/// Where `grant_boot_authority` put init's machine-wide capabilities.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct BootCaps {
|
||||
pub system_control: CapSlot,
|
||||
pub console: CapSlot,
|
||||
}
|
||||
|
||||
/// Where `grant_boot_authority` put one device's capabilities in init.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct BoardCaps {
|
||||
@@ -46,13 +53,14 @@ impl<P: Platform> Kernel<P> {
|
||||
}
|
||||
|
||||
/// Gives `init` (with Delegate) caps to every device region and IRQ, then SystemControl.
|
||||
/// Writes each device's slots into `placed` in order; returns the SystemControl slot.
|
||||
/// Writes each device's slots into `placed` in order; returns the SystemControl
|
||||
/// and Console slots.
|
||||
pub fn grant_boot_authority(
|
||||
&mut self,
|
||||
init: ProcessId,
|
||||
devices: &[BoardDevice],
|
||||
placed: &mut [Option<BoardCaps>],
|
||||
) -> Result<CapSlot, KernelError> {
|
||||
) -> Result<BootCaps, KernelError> {
|
||||
let delegate = PermissionSet::empty().with(Permission::Delegate);
|
||||
let control = delegate.with(Permission::Execute);
|
||||
let mmio = delegate.with(Permission::Read).with(Permission::Write);
|
||||
@@ -70,7 +78,10 @@ impl<P: Platform> Kernel<P> {
|
||||
*slot = Some(BoardCaps { region, irq });
|
||||
}
|
||||
}
|
||||
self.grant_cap(init, Resource::SystemControl, control)
|
||||
Ok(BootCaps {
|
||||
system_control: self.grant_cap(init, Resource::SystemControl, control)?,
|
||||
console: self.grant_cap(init, Resource::Console, delegate.with(Permission::Write))?,
|
||||
})
|
||||
}
|
||||
|
||||
/// The device region that starts at `base`.
|
||||
|
||||
Reference in New Issue
Block a user