feat(storage): scoped grants (subtree, ro/rw), narrow-only, release revokes all holders; IPC KEEP_DELEGATE opt-in; shell cd/pwd, programs get ro cwd
This commit is contained in:
@@ -26,8 +26,12 @@ pub fn run() -> ! {
|
||||
|
||||
// Storage waits for its disk before serving, so this comes first.
|
||||
let found = devices::discover();
|
||||
let disk = libkos::device::give_device(STORAGE_EP, found.disk).is_ok() && found.disk.mmio.is_some();
|
||||
libkos::println!("init: disk: {}", if disk { "handed to its driver" } else { "none" });
|
||||
let disk =
|
||||
libkos::device::give_device(STORAGE_EP, found.disk).is_ok() && found.disk.mmio.is_some();
|
||||
libkos::println!(
|
||||
"init: disk: {}",
|
||||
if disk { "handed to its driver" } else { "none" }
|
||||
);
|
||||
|
||||
let Ok(mut storage) = Storage::attach(STORAGE_EP, STORAGE_BUF_VA) else {
|
||||
libkos::println!("init: cannot reach storage, nothing to load");
|
||||
@@ -53,7 +57,10 @@ pub fn run() -> ! {
|
||||
// The test image carries the SMP self-test; it and the tests run
|
||||
// instead of the desktop, and the last one halts the machine.
|
||||
let (storage, scratch) = launcher.storage();
|
||||
if storage.open(b"smptest.elf").is_ok_and(|h| storage.close(h).is_ok()) {
|
||||
if storage
|
||||
.open(b"smptest.elf")
|
||||
.is_ok_and(|h| storage.close(h).is_ok())
|
||||
{
|
||||
libkos::println!("init: running the SMP self-test");
|
||||
selftest::run(storage, scratch);
|
||||
launch_all(&mut launcher, manifest::TESTS);
|
||||
@@ -83,9 +90,15 @@ fn give_storage_the_log() {
|
||||
let Some(log) = libkos::start::log() else {
|
||||
return;
|
||||
};
|
||||
let call_only = PermissionSet::empty().with(Permission::Execute).with(Permission::Delegate);
|
||||
let call_only = PermissionSet::empty()
|
||||
.with(Permission::Execute)
|
||||
.with(Permission::Delegate);
|
||||
if let Ok(copy) = syscall::mint(log, Badge::NONE, call_only) {
|
||||
let _ = syscall::call(STORAGE_EP, [types::storage::op::SET_LOG, 0, 0, 0], Some(copy));
|
||||
let _ = syscall::call(
|
||||
STORAGE_EP,
|
||||
[types::storage::op::SET_LOG, 0, 0, 0],
|
||||
Some(copy.into()),
|
||||
);
|
||||
syscall::drop_cap(copy);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user