WIP: Replace ContextId with direct Arcs.

This commit is contained in:
4lDO2
2024-07-12 19:27:11 +02:00
parent 038ff03996
commit 80fe891c6e
30 changed files with 408 additions and 558 deletions
+12 -2
View File
@@ -243,7 +243,12 @@ pub fn debug_start([a, b, c, d, e, f]: [usize; 6]) {
let contexts = crate::context::contexts();
if let Some(context_lock) = contexts.current() {
let context = context_lock.read();
print!("{} ({}/{}): ", context.name, context.pid.get(), context.cid.get());
print!(
"{} ({}/{}): ",
context.name,
context.pid.get(),
context.cid.get()
);
}
// Do format_call outside print! so possible exception handlers cannot reentrantly
@@ -279,7 +284,12 @@ pub fn debug_end([a, b, c, d, e, f]: [usize; 6], result: Result<usize>) {
let contexts = crate::context::contexts();
if let Some(context_lock) = contexts.current() {
let context = context_lock.read();
print!("{} ({}/{}): ", context.name, context.pid.get(), context.cid.get());
print!(
"{} ({}/{}): ",
context.name,
context.pid.get(),
context.cid.get()
);
}
// Do format_call outside print! so possible exception handlers cannot reentrantly
+3 -3
View File
@@ -3,7 +3,7 @@ use alloc::sync::Arc;
use crate::{
context::{self, process},
paging::VirtualAddress,
syscall::error::{Error, Result, EFAULT, EPERM, ESRCH},
syscall::error::{Error, Result, EFAULT, EPERM},
};
fn enforce_root() -> Result<()> {
if process::current()?.read().euid != 0 {
@@ -21,7 +21,7 @@ pub fn iopl(level: usize) -> Result<usize> {
pub fn iopl(level: usize) -> Result<usize> {
enforce_root()?;
context::current()?
context::current()
.write()
.set_userspace_io_allowed(level >= 3);
@@ -31,7 +31,7 @@ pub fn iopl(level: usize) -> Result<usize> {
pub fn virttophys(virtual_address: usize) -> Result<usize> {
enforce_root()?;
let addr_space = Arc::clone(context::current()?.read().addr_space()?);
let addr_space = Arc::clone(context::current().read().addr_space()?);
let addr_space = addr_space.acquire_read();
match addr_space
+13 -16
View File
@@ -27,7 +27,7 @@ pub fn file_op_generic_ext<T>(
fd: FileHandle,
op: impl FnOnce(&dyn KernelScheme, Arc<RwLock<FileDescription>>, FileDescription) -> Result<T>,
) -> Result<T> {
let file = context::current()?
let file = context::current()
.read()
.get_file(fd)
.ok_or(Error::new(EBADF))?;
@@ -101,7 +101,7 @@ pub fn open(raw_path: UserSliceRo, flags: usize) -> Result<FileHandle> {
};
//drop(path_buf);
context::current()?
context::current()
.read()
.add_file(FileDescriptor {
description,
@@ -160,7 +160,7 @@ pub fn unlink(raw_path: UserSliceRo) -> Result<()> {
/// Close syscall
pub fn close(fd: FileHandle) -> Result<()> {
let file = {
let context_lock = context::current()?;
let context_lock = context::current();
let context = context_lock.read();
context.remove_file(fd).ok_or(Error::new(EBADF))?
};
@@ -170,7 +170,7 @@ pub fn close(fd: FileHandle) -> Result<()> {
fn duplicate_file(fd: FileHandle, user_buf: UserSliceRo) -> Result<FileDescriptor> {
let caller_ctx = process::current()?.read().caller_ctx();
let file = context::current()?
let file = context::current()
.read()
.get_file(fd)
.ok_or(Error::new(EBADF))?;
@@ -214,7 +214,7 @@ fn duplicate_file(fd: FileHandle, user_buf: UserSliceRo) -> Result<FileDescripto
pub fn dup(fd: FileHandle, buf: UserSliceRo) -> Result<FileHandle> {
let new_file = duplicate_file(fd, buf)?;
context::current()?
context::current()
.read()
.add_file(new_file)
.ok_or(Error::new(EMFILE))
@@ -228,9 +228,8 @@ pub fn dup2(fd: FileHandle, new_fd: FileHandle, buf: UserSliceRo) -> Result<File
let _ = close(new_fd);
let new_file = duplicate_file(fd, buf)?;
let contexts = context::contexts();
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
let context = context_lock.read();
let context_ref = context::current();
let context = context_ref.read();
context
.insert_file(new_fd, new_file)
@@ -241,7 +240,7 @@ pub fn sendfd(socket: FileHandle, fd: FileHandle, flags_raw: usize, arg: u64) ->
let requested_flags = SendFdFlags::from_bits(flags_raw).ok_or(Error::new(EINVAL))?;
let (scheme, number, desc_to_send) = {
let current_lock = context::current()?;
let current_lock = context::current();
let current = current_lock.read();
// TODO: Ensure deadlocks can't happen
@@ -287,7 +286,7 @@ pub fn sendfd(socket: FileHandle, fd: FileHandle, flags_raw: usize, arg: u64) ->
/// File descriptor controls
pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize) -> Result<usize> {
let file = context::current()?
let file = context::current()
.read()
.get_file(fd)
.ok_or(Error::new(EBADF))?;
@@ -298,8 +297,7 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize) -> Result<usize> {
// Not in match because 'files' cannot be locked
let new_file = duplicate_file(fd, UserSlice::empty())?;
let contexts = context::contexts();
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
let context_lock = context::current();
let context = context_lock.read();
return context
@@ -320,8 +318,7 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize) -> Result<usize> {
// Perform kernel operation if scheme agrees
{
let contexts = context::contexts();
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
let context_lock = context::current();
let context = context_lock.read();
let mut files = context.files.write();
@@ -364,7 +361,7 @@ pub fn frename(fd: FileHandle, raw_path: UserSliceRo) -> Result<()> {
process.ens,
),
};
let file = context::current()?
let file = context::current()
.read()
.get_file(fd)
.ok_or(Error::new(EBADF))?;
@@ -433,7 +430,7 @@ pub fn funmap(virtual_address: usize, length: usize) -> Result<usize> {
);
}
let addr_space = Arc::clone(context::current()?.read().addr_space()?);
let addr_space = Arc::clone(context::current().read().addr_space()?);
let span = PageSpan::validate_nonempty(VirtualAddress::new(virtual_address), length_aligned)
.ok_or(Error::new(EINVAL))?;
let unpin = false;
+2 -2
View File
@@ -89,7 +89,7 @@ pub fn futex(addr: usize, op: usize, val: usize, val2: usize, _addr2: usize) ->
{
let mut futexes = FUTEXES.write();
let context_lock = context::current()?;
let context_lock = context::current();
let (fetched, expected) = if op == FUTEX_WAIT {
// Must be aligned, otherwise it could cross a page boundary and mess up the
@@ -162,7 +162,7 @@ pub fn futex(addr: usize, op: usize, val: usize, val2: usize, _addr2: usize) ->
context::switch();
if timeout_opt.is_some() {
context::current()?.write().wake = None;
context::current().write().wake = None;
Err(Error::new(ETIMEDOUT))
} else {
Ok(0)
+3 -6
View File
@@ -35,7 +35,7 @@ pub fn exit(status: usize) -> ! {
);
{
let context_lock = context::current().expect("exit failed to find context");
let context_lock = context::current();
let close_files;
let addrspace_opt;
@@ -175,7 +175,7 @@ pub fn kill(pid: ProcessId, sig: usize, parent_sigchld: bool) -> Result<usize> {
}
let mut send = |context: &mut context::Context, proc: &ProcessInfo| -> SendResult {
let is_self = context.cid == context::current_cid();
let is_self = context.is_current_context();
// Non-root users cannot kill arbitrarily.
if euid != 0 && euid != proc.ruid && ruid != proc.ruid {
@@ -640,9 +640,7 @@ pub unsafe fn usermode_bootstrap(bootstrap: &Bootstrap) {
{
let addr_space = Arc::clone(
context::contexts()
.current()
.expect("expected a context to exist when executing init")
context::current()
.read()
.addr_space()
.expect("expected bootstrap context to have an address space"),
@@ -689,7 +687,6 @@ pub unsafe fn usermode_bootstrap(bootstrap: &Bootstrap) {
// Start in a minimal environment without any stack.
match context::current()
.expect("bootstrap was not running inside any context")
.write()
.regs_mut()
.expect("bootstrap needs registers to be available")
+1 -1
View File
@@ -30,7 +30,7 @@ pub fn nanosleep(req_buf: UserSliceRo, rem_buf_opt: Option<UserSliceWo>) -> Resu
let start = time::monotonic();
let end = start + (req.tv_sec as u128 * time::NANOS_PER_SEC) + (req.tv_nsec as u128);
let current_context = context::current()?;
let current_context = context::current();
{
let mut context = current_context.write();