feat(storage): full file protocol over per-client shared region (badged clients, owned handles, clamped lengths, ReadOnly on unwritable disk); init loads via libkos::fs; drop boot shared buffer
This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
// What boot still sets up for userspace, all through the kernel's mapping
|
||||
// API: a buffer init and storage share, the display's page quota, and the
|
||||
// BootInfo page that tells init where its device capabilities are. Drivers
|
||||
// set up their own devices with the capabilities init hands them.
|
||||
// API: the display's page quota and the BootInfo page that tells init
|
||||
// where its device capabilities are. Drivers set up their own devices
|
||||
// with the capabilities init hands them; processes share memory through
|
||||
// regions they create.
|
||||
|
||||
use crate::hw::uart::Uart;
|
||||
use types::address::VirtualAddress;
|
||||
use types::bootinfo::{BOOT_INFO_VA, BootDevice, BootInfo, MAGIC, MAX_BOOT_DEVICES, NO_SLOT};
|
||||
use types::bounded::{CapSlot, PageCount};
|
||||
use types::bounded::CapSlot;
|
||||
use types::id::ProcessId;
|
||||
use types::mapping::PagePerms;
|
||||
|
||||
@@ -17,25 +18,6 @@ fn kern() -> &'static mut kernel::Kernel<crate::platform::RiscVPlatform> {
|
||||
unsafe { &mut *crate::kernel_ptr() }
|
||||
}
|
||||
|
||||
fn pages(uart: &Uart, n: usize) -> PageCount {
|
||||
u16::try_from(n)
|
||||
.ok()
|
||||
.and_then(PageCount::new)
|
||||
.unwrap_or_else(|| crate::halt(uart, "bad page count"))
|
||||
}
|
||||
|
||||
/// Shares a fresh region between `owner` and `other` at the same `va`.
|
||||
pub(crate) fn shared_buffer(uart: &Uart, owner: ProcessId, other: ProcessId, va: usize, n: usize) {
|
||||
let id = kern()
|
||||
.create_pool_region(owner, pages(uart, n))
|
||||
.unwrap_or_else(|_| crate::halt(uart, "shared region failed"));
|
||||
for pid in [owner, other] {
|
||||
kern()
|
||||
.map_region(id, pid, VirtualAddress::from_raw(va), PagePerms::ReadWrite)
|
||||
.unwrap_or_else(|_| crate::halt(uart, "shared map failed"));
|
||||
}
|
||||
}
|
||||
|
||||
/// Lets the display server hold a framebuffer.
|
||||
pub(crate) fn display_quota(uart: &Uart, display: ProcessId) {
|
||||
kern()
|
||||
|
||||
@@ -106,9 +106,6 @@ boot_page_table:
|
||||
"#
|
||||
);
|
||||
|
||||
const SHARED_BUF_VA: usize = 0x30000;
|
||||
const SHARED_BUF_PAGES: usize = 16;
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
extern "C" fn kmain(hart: usize) -> ! {
|
||||
let uart = Uart::new();
|
||||
@@ -121,10 +118,7 @@ extern "C" fn kmain(hart: usize) -> ! {
|
||||
let mut blk =
|
||||
boot::hardware::probe_block_device(&uart).unwrap_or_else(|| halt(&uart, "no block device"));
|
||||
|
||||
let (init, init_thread) = boot::loader::load_init(&uart, &mut blk);
|
||||
if let Some(ctx) = kern_mut().thread_context_mut(init_thread) {
|
||||
ctx.registers_mut()[10] = SHARED_BUF_VA;
|
||||
}
|
||||
let (init, _) = boot::loader::load_init(&uart, &mut blk);
|
||||
let storage = boot::loader::load_server(&uart, &mut blk, b"storage.elf", "storage");
|
||||
let display = boot::loader::load_server(&uart, &mut blk, b"display.elf", "display");
|
||||
let input = boot::loader::load_server(&uart, &mut blk, b"input.elf", "input");
|
||||
@@ -133,13 +127,6 @@ extern "C" fn kmain(hart: usize) -> ! {
|
||||
kern_mut()
|
||||
.register_board(init.pid, &board)
|
||||
.unwrap_or_else(|_| halt(&uart, "board registration failed"));
|
||||
devices::shared_buffer(
|
||||
&uart,
|
||||
init.pid,
|
||||
storage.pid,
|
||||
SHARED_BUF_VA,
|
||||
SHARED_BUF_PAGES,
|
||||
);
|
||||
devices::display_quota(&uart, display.pid);
|
||||
boot::caps::grant_all(&uart, init.pid, storage.pid, display.pid, input.pid);
|
||||
// After grant_all, so the slots init already relies on stay put.
|
||||
|
||||
Reference in New Issue
Block a user