feat(userspace): log server sole console holder; init boots from manifest; adapter loads only init+storage
This commit is contained in:
@@ -23,6 +23,8 @@ pub enum StorageRequest {
|
||||
Create { path_len: usize },
|
||||
Delete { path_len: usize },
|
||||
Mkdir { path_len: usize },
|
||||
/// Carries the endpoint to print to.
|
||||
SetLog,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
@@ -61,6 +63,7 @@ impl Encode for StorageRequest {
|
||||
Create { path_len } => [op::CREATE, path_len, 0, 0],
|
||||
Delete { path_len } => [op::DELETE, path_len, 0, 0],
|
||||
Mkdir { path_len } => [op::MKDIR, path_len, 0, 0],
|
||||
SetLog => [op::SET_LOG, 0, 0, 0],
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -79,6 +82,7 @@ impl Decode for StorageRequest {
|
||||
op::CREATE => Create { path_len: w[1] },
|
||||
op::DELETE => Delete { path_len: w[1] },
|
||||
op::MKDIR => Mkdir { path_len: w[1] },
|
||||
op::SET_LOG => SetLog,
|
||||
_ => return None,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ pub struct StorageServer<F: FileSystem, B: Buffers> {
|
||||
clients: [Option<Client>; MAX_CLIENTS],
|
||||
/// The badge of the client that opened each handle.
|
||||
owners: [Option<usize>; MAX_HANDLES],
|
||||
log: Option<CapSlot>,
|
||||
}
|
||||
|
||||
impl<F: FileSystem, B: Buffers> StorageServer<F, B> {
|
||||
@@ -40,6 +41,26 @@ impl<F: FileSystem, B: Buffers> StorageServer<F, B> {
|
||||
buffers,
|
||||
clients: [const { None }; MAX_CLIENTS],
|
||||
owners: [None; MAX_HANDLES],
|
||||
log: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Where this server prints, once init has said.
|
||||
pub fn log(&self) -> Option<CapSlot> {
|
||||
self.log
|
||||
}
|
||||
|
||||
/// Clients hold badged copies of the endpoint, so the unbadged sender is
|
||||
/// whoever was given the endpoint itself: init.
|
||||
fn set_log(&mut self, badge: usize, cap: Option<CapSlot>) -> StorageResponse {
|
||||
match (badge, cap, self.log) {
|
||||
(0, Some(cap), None) => {
|
||||
self.log = Some(cap);
|
||||
libkos::start::set_log(Some(cap));
|
||||
libkos::println!("storage: printing through the log server");
|
||||
StorageResponse::Ok
|
||||
}
|
||||
_ => StorageResponse::Error,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,7 +138,7 @@ impl<F: FileSystem, B: Buffers> StorageServer<F, B> {
|
||||
None => R::NotFound,
|
||||
};
|
||||
let response = match request {
|
||||
Attach => R::Error,
|
||||
Attach | SetLog => R::Error,
|
||||
Open { path_len } => {
|
||||
let h = fs.open(&buf[path(path_len)]);
|
||||
opened(owners, h)
|
||||
@@ -195,9 +216,10 @@ impl<F: FileSystem, B: Buffers> Server for StorageServer<F, B> {
|
||||
&mut self,
|
||||
badge: usize,
|
||||
words: [usize; 4],
|
||||
_cap: Option<CapSlot>,
|
||||
cap: Option<CapSlot>,
|
||||
) -> ([usize; 4], Option<CapSlot>) {
|
||||
match StorageRequest::decode(words) {
|
||||
Some(StorageRequest::SetLog) => (self.set_log(badge, cap).encode(), None),
|
||||
Some(request) => {
|
||||
let (response, cap) = self.serve(badge, request);
|
||||
(response.encode(), cap)
|
||||
|
||||
@@ -180,3 +180,18 @@ fn garbage_gets_a_malformed_reply() {
|
||||
let (words, cap) = s.handle_call(0, [99, 0, 0, 0], None);
|
||||
assert_eq!((words[0], cap), (MALFORMED, None));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn only_the_unbadged_holder_sets_the_log_and_only_once() {
|
||||
let mut s = server();
|
||||
let log = CapSlot::new(7);
|
||||
let set = |s: &mut Srv, badge| {
|
||||
let (words, _) = s.handle_call(badge, StorageRequest::SetLog.encode(), log);
|
||||
StorageResponse::decode(words).unwrap()
|
||||
};
|
||||
assert_eq!(set(&mut s, 5), StorageResponse::Error);
|
||||
assert_eq!(s.log(), None);
|
||||
assert_eq!(set(&mut s, 0), StorageResponse::Ok);
|
||||
assert_eq!(s.log(), log);
|
||||
assert_eq!(set(&mut s, 0), StorageResponse::Error);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user