Skip to content
Snippets Groups Projects
Commit 12d58300 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Merge branch 'pin_kmain_contexts' into 'master'

Pin kmain contexts

Closes #111

See merge request !200
parents 87e1689b b73922bc
No related branches found
No related tags found
1 merge request!200Pin kmain contexts
...@@ -50,10 +50,23 @@ impl ContextList { ...@@ -50,10 +50,23 @@ impl ContextList {
self.map.range(range) self.map.range(range)
} }
pub(crate) fn insert_context_raw(&mut self, id: ContextId) -> Result<&Arc<RwLock<Context>>> {
assert!(self.map.insert(id, Arc::new(RwLock::new(Context::new(id)?))).is_none());
Ok(self.map.get(&id).expect("Failed to insert new context. ID is out of bounds."))
}
/// Create a new context. /// Create a new context.
pub fn new_context(&mut self) -> Result<&Arc<RwLock<Context>>> { pub fn new_context(&mut self) -> Result<&Arc<RwLock<Context>>> {
// Zero is not a valid context ID, therefore add 1.
//
// FIXME: Ensure the number of CPUs can't switch between new_context calls.
let min = crate::cpu_count() + 1;
self.next_id = core::cmp::max(self.next_id, min);
if self.next_id >= super::CONTEXT_MAX_CONTEXTS { if self.next_id >= super::CONTEXT_MAX_CONTEXTS {
self.next_id = 1; self.next_id = min;
} }
while self.map.contains_key(&ContextId::from(self.next_id)) { while self.map.contains_key(&ContextId::from(self.next_id)) {
...@@ -67,9 +80,7 @@ impl ContextList { ...@@ -67,9 +80,7 @@ impl ContextList {
let id = ContextId::from(self.next_id); let id = ContextId::from(self.next_id);
self.next_id += 1; self.next_id += 1;
assert!(self.map.insert(id, Arc::new(RwLock::new(Context::new(id)?))).is_none()); self.insert_context_raw(id)
Ok(self.map.get(&id).expect("Failed to insert new context. ID is out of bounds."))
} }
/// Spawn a context from a function. /// Spawn a context from a function.
......
...@@ -65,8 +65,10 @@ pub use self::arch::empty_cr3; ...@@ -65,8 +65,10 @@ pub use self::arch::empty_cr3;
pub fn init() { pub fn init() {
let mut contexts = contexts_mut(); let mut contexts = contexts_mut();
let context_lock = contexts.new_context().expect("could not initialize first context"); let id = ContextId::from(crate::cpu_id() + 1);
let context_lock = contexts.insert_context_raw(id).expect("could not initialize first context");
let mut context = context_lock.write(); let mut context = context_lock.write();
context.sched_affinity = Some(crate::cpu_id());
self::arch::EMPTY_CR3.call_once(|| unsafe { RmmA::table(TableKind::User) }); self::arch::EMPTY_CR3.call_once(|| unsafe { RmmA::table(TableKind::User) });
......
...@@ -48,11 +48,8 @@ ...@@ -48,11 +48,8 @@
#![feature(allocator_api)] #![feature(allocator_api)]
#![feature(arbitrary_self_types)] #![feature(arbitrary_self_types)]
#![feature(array_chunks)] #![feature(array_chunks)]
#![feature(asm_const, asm_sym)] // TODO: Relax requirements of most asm invocations #![feature(asm_const)] // TODO: Relax requirements of most asm invocations
#![feature(bool_to_option)]
#![feature(concat_idents)] #![feature(concat_idents)]
#![feature(const_btree_new)]
#![feature(const_ptr_offset_from)]
#![feature(core_intrinsics)] #![feature(core_intrinsics)]
#![feature(integer_atomics)] #![feature(integer_atomics)]
#![feature(lang_items)] #![feature(lang_items)]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment