Optimize syscall fast path without tracing.

This commit is contained in:
4lDO2
2024-03-18 20:38:11 +01:00
parent 33f0fa8709
commit 4862977fa5
10 changed files with 69 additions and 108 deletions
+3 -1
View File
@@ -3,10 +3,12 @@ use core::{
sync::atomic::AtomicBool,
};
use crate::{syscall::FloatRegisters, percpu::PercpuBlock};
use crate::{percpu::PercpuBlock, ptrace, syscall::FloatRegisters};
use core::mem::offset_of;
use alloc::sync::Arc;
use spin::Once;
use syscall::PtraceFlags;
use x86::msr;
/// This must be used by the kernel to ensure that context switches are done atomically
+10 -5
View File
@@ -1,13 +1,11 @@
use core::{cell::Cell, mem, ops::Bound, sync::atomic::Ordering};
use alloc::sync::Arc;
use spinning_top::guard::ArcRwSpinlockWriteGuard;
use syscall::PtraceFlags;
use crate::{
context::{arch, contexts, Context},
cpu_set::LogicalCpuId,
interrupt,
percpu::PercpuBlock,
time,
context::{arch, contexts, Context}, cpu_set::LogicalCpuId, interrupt, percpu::PercpuBlock, ptrace, time
};
use super::{ContextId, Status};
@@ -210,6 +208,13 @@ pub fn switch() -> SwitchResult {
_next_guard: next_context_guard,
}));
let (ptrace_session, ptrace_flags) = if let Some((session, bp)) = ptrace::sessions().get(&next_context.id).map(|s| (Arc::downgrade(s), s.data.lock().breakpoint)) {
(Some(session), bp.map_or(PtraceFlags::empty(), |f| f.flags))
} else { (None, PtraceFlags::empty()) };
*percpu.ptrace_session.borrow_mut() = ptrace_session;
percpu.ptrace_flags.set(ptrace_flags);
unsafe {
arch::switch_to(prev_context, next_context);
}