0.3.0: converge kernel onto upstream master
- Rebase all Red Bear kernel changes onto upstream master (4d5d36d4).
- Update version to 0.5.12+rb0.3.0 and add Red Bear author attribution.
- Switch redox_syscall direct dependency to local fork path (../syscall).
- Bump rust-toolchain.toml to nightly-2026-05-24.
- Regenerate Cargo.lock for +rb0.3.0 suffixes and path deps.
This commit is contained in:
+25
-28
@@ -20,8 +20,7 @@ use crate::{
|
||||
context::{self, context::FdTbl},
|
||||
memory::{Page, VirtualAddress, PAGE_SIZE},
|
||||
scheme::{
|
||||
FileHandle, KernelScheme, SchemeExt, SchemeId, SchemeList, ALL_KERNEL_SCHEMES,
|
||||
KERNEL_SCHEMES_COUNT,
|
||||
KernelScheme, SchemeExt, SchemeId, SchemeList, ALL_KERNEL_SCHEMES, KERNEL_SCHEMES_COUNT,
|
||||
},
|
||||
startup::Bootstrap,
|
||||
syscall::{error::*, flag::MapFlags},
|
||||
@@ -31,30 +30,33 @@ use crate::{
|
||||
use super::usercopy::UserSliceWo;
|
||||
|
||||
pub fn exit_this_context(excp: Option<syscall::Exception>, token: &mut CleanLockToken) -> ! {
|
||||
let mut close_files;
|
||||
let addrspace_opt;
|
||||
|
||||
let context_lock = context::current();
|
||||
let (addrspace_opt, mut close_files) = {
|
||||
{
|
||||
let mut context = context_lock.write(token.token());
|
||||
let (context, token) = context.token_split();
|
||||
let close_files = Arc::try_unwrap(mem::take(&mut context.files))
|
||||
// let (context, mut token) = context.token_split();
|
||||
close_files = Arc::try_unwrap(mem::take(&mut context.files))
|
||||
.map_or_else(|_| FdTbl::new(), RwLock::into_inner);
|
||||
let addrspace_opt = context.set_addr_space(None, token);
|
||||
// TODO: Lock ordering violation
|
||||
let mut token = unsafe { CleanLockToken::new() };
|
||||
addrspace_opt = context
|
||||
.set_addr_space(None, token.downgrade())
|
||||
.and_then(|a| Arc::try_unwrap(a).ok());
|
||||
drop(mem::replace(&mut context.syscall_head, SyscallFrame::Dummy));
|
||||
drop(mem::replace(&mut context.syscall_tail, SyscallFrame::Dummy));
|
||||
(addrspace_opt, close_files)
|
||||
};
|
||||
}
|
||||
|
||||
// Files must be closed while context is valid so that messages can be passed
|
||||
close_files.force_close_all(token);
|
||||
if let Some(addrspace) = addrspace_opt {
|
||||
if let Ok(addrspace) = Arc::try_unwrap(addrspace) {
|
||||
addrspace.into_drop(token);
|
||||
}
|
||||
addrspace.into_drop(token);
|
||||
}
|
||||
// TODO: Should status == Status::HardBlocked be handled differently?
|
||||
let owner = {
|
||||
let mut guard = context_lock.write(token.token());
|
||||
guard.status = context::Status::Dead { excp };
|
||||
|
||||
guard.owner_proc_id
|
||||
};
|
||||
if let Some(owner) = owner {
|
||||
@@ -73,7 +75,6 @@ pub fn exit_this_context(excp: Option<syscall::Exception>, token: &mut CleanLock
|
||||
}
|
||||
}
|
||||
}
|
||||
drop(close_files);
|
||||
context::switch(token);
|
||||
unreachable!();
|
||||
}
|
||||
@@ -157,7 +158,12 @@ pub unsafe fn usermode_bootstrap(bootstrap: &Bootstrap, token: &mut CleanLockTok
|
||||
Ok(fd) => fd,
|
||||
Err(_) => usize::MAX,
|
||||
};
|
||||
insert_fd(scheme.scheme_id(), cap_fd, token)
|
||||
insert_fd(
|
||||
scheme.scheme_id(),
|
||||
cap_fd,
|
||||
matches!(scheme, GlobalSchemes::Proc),
|
||||
token,
|
||||
)
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -170,7 +176,7 @@ pub unsafe fn usermode_bootstrap(bootstrap: &Bootstrap, token: &mut CleanLockTok
|
||||
};
|
||||
// Second, retrieve the scheme ID.
|
||||
let scheme_id = &SchemeList.id();
|
||||
insert_fd(*scheme_id, cap_fd, token)
|
||||
insert_fd(*scheme_id, cap_fd, false, token)
|
||||
};
|
||||
|
||||
let mut lock_token = token.token();
|
||||
@@ -264,23 +270,12 @@ unsafe fn bootstrap_mem(bootstrap: &crate::startup::Bootstrap) -> &'static [u8]
|
||||
}
|
||||
}
|
||||
|
||||
fn insert_fd(scheme: SchemeId, number: usize, token: &mut CleanLockToken) -> usize {
|
||||
fn insert_fd(scheme: SchemeId, number: usize, cloexec: bool, token: &mut CleanLockToken) -> usize {
|
||||
let current_lock = context::current();
|
||||
let mut current = current_lock.read(token.token());
|
||||
let (context, mut token) = current.token_split();
|
||||
context
|
||||
.files
|
||||
.write(token.token())
|
||||
.resize(0, 64)
|
||||
.expect("failed to resize lower fdtbl");
|
||||
context
|
||||
.files
|
||||
.write(token.token())
|
||||
.resize(syscall::flag::UPPER_FDTBL_TAG, 64)
|
||||
.expect("failed to resize upper fdtbl");
|
||||
context
|
||||
.insert_file(
|
||||
FileHandle::from(syscall::flag::UPPER_FDTBL_TAG | scheme.get()),
|
||||
.add_file_min(
|
||||
FileDescriptor {
|
||||
description: Arc::new(RwLock::new(FileDescription {
|
||||
scheme,
|
||||
@@ -289,7 +284,9 @@ fn insert_fd(scheme: SchemeId, number: usize, token: &mut CleanLockToken) -> usi
|
||||
flags: (O_CREAT | O_RDWR) as u32,
|
||||
internal_flags: InternalFlags::empty(),
|
||||
})),
|
||||
cloexec,
|
||||
},
|
||||
syscall::flag::UPPER_FDTBL_TAG + scheme.get(),
|
||||
&mut token,
|
||||
)
|
||||
.expect("failed to insert fd to current context")
|
||||
|
||||
Reference in New Issue
Block a user