This commit is contained in:
parent
c8eea7d45b
commit
40696ce142
7 changed files with 32 additions and 37 deletions
|
@ -13,7 +13,7 @@ use crate::{
|
||||||
madt::INTERRUPTS_SETUP,
|
madt::INTERRUPTS_SETUP,
|
||||||
scheduler::scheduler,
|
scheduler::scheduler,
|
||||||
sync::{IN_ISR_HANDLER, LOCKS_HELD},
|
sync::{IN_ISR_HANDLER, LOCKS_HELD},
|
||||||
task::{TaskState, CURRENT_TASKS},
|
task::{with_current_task, TaskState},
|
||||||
},
|
},
|
||||||
BROADCASTED_PANIC,
|
BROADCASTED_PANIC,
|
||||||
};
|
};
|
||||||
|
@ -118,7 +118,7 @@ extern "C" fn isr_handler(state: &mut ISRState) {
|
||||||
if state.isr < 32 {
|
if state.isr < 32 {
|
||||||
if state.cs == 0x23 && state.isr != 2 && state.isr != 8 && state.isr != 18 {
|
if state.cs == 0x23 && state.isr != 2 && state.isr != 8 && state.isr != 18 {
|
||||||
debug!("Exception in usermode: {}", EXCEPTIONS[state.isr as usize]);
|
debug!("Exception in usermode: {}", EXCEPTIONS[state.isr as usize]);
|
||||||
CURRENT_TASKS.lock()[get_current_lapic_id()].as_mut().unwrap().task_state = TaskState::Terminated;
|
with_current_task(|current_task| current_task.task_state = TaskState::Terminated);
|
||||||
IN_ISR_HANDLER[lapic_id].store(false, Ordering::SeqCst);
|
IN_ISR_HANDLER[lapic_id].store(false, Ordering::SeqCst);
|
||||||
unsafe {
|
unsafe {
|
||||||
asm!("int $254");
|
asm!("int $254");
|
||||||
|
|
|
@ -8,7 +8,7 @@ use crate::{
|
||||||
instructions::{disable_user_memory_access, enable_user_memory_access},
|
instructions::{disable_user_memory_access, enable_user_memory_access},
|
||||||
paging::USER_END,
|
paging::USER_END,
|
||||||
},
|
},
|
||||||
sys::{lapic::get_current_lapic_id, task::CURRENT_TASKS},
|
sys::task::with_current_task,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -19,13 +19,12 @@ extern "C" {
|
||||||
pub fn load_binary() {
|
pub fn load_binary() {
|
||||||
let entry;
|
let entry;
|
||||||
{
|
{
|
||||||
let process;
|
let mut process = None;
|
||||||
{
|
with_current_task(|current_task| {
|
||||||
let mut current_tasks = CURRENT_TASKS.lock();
|
process = Some(current_task.process.clone());
|
||||||
let task = current_tasks[get_current_lapic_id()].as_mut().unwrap();
|
});
|
||||||
process = task.process.clone();
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
|
let process = process.unwrap();
|
||||||
let mut process = process.lock();
|
let mut process = process.lock();
|
||||||
let binary = process.binary.unwrap();
|
let binary = process.binary.unwrap();
|
||||||
let file: ElfBytes<LittleEndian> = ElfBytes::minimal_parse(binary).unwrap();
|
let file: ElfBytes<LittleEndian> = ElfBytes::minimal_parse(binary).unwrap();
|
||||||
|
|
|
@ -23,11 +23,10 @@ static SCI_CONTEXT: AtomicPtr<c_void> = AtomicPtr::new(null_mut());
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
hpet::get_current_time,
|
hpet::get_current_time,
|
||||||
lapic::get_current_lapic_id,
|
|
||||||
locks::Spinlock,
|
locks::Spinlock,
|
||||||
process::get_kernel_process,
|
process::get_kernel_process,
|
||||||
sync::{create_semaphore, lock_semaphore, unlock_semaphore, RawSemaphore, RawSpinlock},
|
sync::{create_semaphore, lock_semaphore, unlock_semaphore, RawSemaphore, RawSpinlock},
|
||||||
task::{CURRENT_TASKS, MULTITASKING_ENABLED},
|
task::{with_current_task, MULTITASKING_ENABLED},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const AE_OK: ACPI_STATUS = 0;
|
pub const AE_OK: ACPI_STATUS = 0;
|
||||||
|
@ -91,7 +90,11 @@ extern "C" fn AcpiOsGetThreadId() -> UINT64 {
|
||||||
if !MULTITASKING_ENABLED.load(Ordering::SeqCst) {
|
if !MULTITASKING_ENABLED.load(Ordering::SeqCst) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
CURRENT_TASKS.lock()[get_current_lapic_id()].as_ref().unwrap().id as UINT64
|
let mut id = 0;
|
||||||
|
with_current_task(|current_task| {
|
||||||
|
id = current_task.id as UINT64;
|
||||||
|
});
|
||||||
|
id
|
||||||
}
|
}
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
extern "C" fn AcpiOsGetTimer() -> UINT64 {
|
extern "C" fn AcpiOsGetTimer() -> UINT64 {
|
||||||
|
|
|
@ -10,11 +10,10 @@ use kernel_common::instructions::pause;
|
||||||
use super::{
|
use super::{
|
||||||
early_acpi::EarlyACPIHandler,
|
early_acpi::EarlyACPIHandler,
|
||||||
ioapic::register_irq_handler,
|
ioapic::register_irq_handler,
|
||||||
lapic::get_current_lapic_id,
|
|
||||||
locks::Spinlock,
|
locks::Spinlock,
|
||||||
process::get_kernel_process,
|
process::get_kernel_process,
|
||||||
scheduler::{yield_task, SCHEDULER},
|
scheduler::{yield_task, SCHEDULER},
|
||||||
task::{Task, TaskState, CURRENT_TASKS, MULTITASKING_ENABLED},
|
task::{with_current_task, Task, TaskState, MULTITASKING_ENABLED},
|
||||||
};
|
};
|
||||||
|
|
||||||
const REGISTER_CAPABILITIES: usize = 0;
|
const REGISTER_CAPABILITIES: usize = 0;
|
||||||
|
@ -88,12 +87,10 @@ pub fn get_current_time() -> usize {
|
||||||
}
|
}
|
||||||
pub fn sleep(us: usize) {
|
pub fn sleep(us: usize) {
|
||||||
if MULTITASKING_ENABLED.load(Ordering::SeqCst) {
|
if MULTITASKING_ENABLED.load(Ordering::SeqCst) {
|
||||||
{
|
with_current_task(|current_task| {
|
||||||
let mut current_tasks = CURRENT_TASKS.lock();
|
|
||||||
let current_task = current_tasks[get_current_lapic_id()].as_mut().unwrap();
|
|
||||||
current_task.sleep_until_us = get_current_time() + us;
|
current_task.sleep_until_us = get_current_time() + us;
|
||||||
current_task.task_state = TaskState::Sleeping;
|
current_task.task_state = TaskState::Sleeping;
|
||||||
}
|
});
|
||||||
yield_task();
|
yield_task();
|
||||||
} else {
|
} else {
|
||||||
EARLY_SLEEP.store(true, Ordering::SeqCst);
|
EARLY_SLEEP.store(true, Ordering::SeqCst);
|
||||||
|
|
|
@ -9,7 +9,7 @@ use super::{
|
||||||
lapic::get_current_lapic_id,
|
lapic::get_current_lapic_id,
|
||||||
locks::Spinlock,
|
locks::Spinlock,
|
||||||
scheduler::{yield_task, SCHEDULER},
|
scheduler::{yield_task, SCHEDULER},
|
||||||
task::{Task, TaskState, CURRENT_TASKS},
|
task::{with_current_task, Task, TaskState},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub static IN_ISR_HANDLER: [AtomicBool; 256] = [const { AtomicBool::new(false) }; 256];
|
pub static IN_ISR_HANDLER: [AtomicBool; 256] = [const { AtomicBool::new(false) }; 256];
|
||||||
|
@ -88,13 +88,11 @@ pub fn lock_semaphore(semaphore: Arc<RawSemaphore>, count: usize) {
|
||||||
if success {
|
if success {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
{
|
with_current_task(|current_task| {
|
||||||
let mut current_task = CURRENT_TASKS.lock();
|
|
||||||
let current_task = current_task[get_current_lapic_id()].as_mut().unwrap();
|
|
||||||
current_task.task_state = TaskState::SemaphoreBlocked;
|
current_task.task_state = TaskState::SemaphoreBlocked;
|
||||||
current_task.block_on_semaphore = Some(semaphore.clone());
|
current_task.block_on_semaphore = Some(semaphore.clone());
|
||||||
current_task.semaphore_requested_count = count;
|
current_task.semaphore_requested_count = count;
|
||||||
}
|
});
|
||||||
yield_task();
|
yield_task();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,10 +8,7 @@ use crate::cpu::{
|
||||||
paging::USER_END,
|
paging::USER_END,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::task::{terminate_current_task, with_current_task};
|
||||||
lapic::get_current_lapic_id,
|
|
||||||
task::{terminate_current_task, CURRENT_TASKS},
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SyscallArgs {
|
struct SyscallArgs {
|
||||||
arg1: usize,
|
arg1: usize,
|
||||||
|
@ -46,11 +43,9 @@ fn copy_from_user(start: u64, size: usize) -> Result<Vec<u8>, Box<dyn Error>> {
|
||||||
if end > USER_END {
|
if end > USER_END {
|
||||||
return Err("Invalid copy requested".into());
|
return Err("Invalid copy requested".into());
|
||||||
}
|
}
|
||||||
let process;
|
let mut process = None;
|
||||||
{
|
with_current_task(|current_task| process = Some(current_task.process.clone()));
|
||||||
let tasks = CURRENT_TASKS.lock();
|
let process = process.unwrap();
|
||||||
process = tasks[get_current_lapic_id()].as_ref().unwrap().process.clone();
|
|
||||||
}
|
|
||||||
let mut process = process.lock();
|
let mut process = process.lock();
|
||||||
for i in start / 0x1000..(end + 0xfff) / 0x1000 {
|
for i in start / 0x1000..(end + 0xfff) / 0x1000 {
|
||||||
let page = process.address_space.get_page(i * 0x1000);
|
let page = process.address_space.get_page(i * 0x1000);
|
||||||
|
@ -80,8 +75,8 @@ fn syscall_debug_print(args: SyscallArgs) -> Result<usize, Box<dyn Error>> {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
fn syscall_get_pid(_args: SyscallArgs) -> Result<usize, Box<dyn Error>> {
|
fn syscall_get_pid(_args: SyscallArgs) -> Result<usize, Box<dyn Error>> {
|
||||||
let tasks = CURRENT_TASKS.lock();
|
let mut pid = 0;
|
||||||
let pid = tasks[get_current_lapic_id()].as_ref().unwrap().process.lock().pid;
|
with_current_task(|current_task| pid = current_task.process.lock().pid);
|
||||||
Ok(pid)
|
Ok(pid)
|
||||||
}
|
}
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
|
|
@ -191,9 +191,7 @@ fn create_idle_task() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn terminate_current_task() -> ! {
|
pub fn terminate_current_task() -> ! {
|
||||||
{
|
with_current_task(|current_task| current_task.task_state = TaskState::Terminated);
|
||||||
CURRENT_TASKS.lock()[get_current_lapic_id()].as_mut().unwrap().task_state = TaskState::Terminated;
|
|
||||||
}
|
|
||||||
yield_task();
|
yield_task();
|
||||||
panic!("Failed to terminate task");
|
panic!("Failed to terminate task");
|
||||||
}
|
}
|
||||||
|
@ -221,6 +219,11 @@ fn idle_main() {
|
||||||
hlt();
|
hlt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn with_current_task<F: FnOnce(&mut Task)>(func: F) {
|
||||||
|
let mut current_tasks = CURRENT_TASKS.lock();
|
||||||
|
let lapic_id = get_current_lapic_id();
|
||||||
|
func(current_tasks[lapic_id].as_mut().unwrap());
|
||||||
|
}
|
||||||
pub fn setup_multitasking() -> ! {
|
pub fn setup_multitasking() -> ! {
|
||||||
let task;
|
let task;
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue