WIP: Replace ContextId with direct Arcs.
This commit is contained in:
+12
-2
@@ -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,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
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user