mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-13 23:36:48 +00:00
Move CPU context implementations to a specific module
This commit is contained in:
parent
fc67adb1f0
commit
f1c7564184
@ -7,7 +7,7 @@ use alloc::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use ostd::{
|
use ostd::{
|
||||||
cpu::{cpuid, CpuException, CpuExceptionInfo, RawGeneralRegs, UserContext},
|
cpu::context::{cpuid, CpuException, CpuExceptionInfo, RawGeneralRegs, UserContext},
|
||||||
Pod,
|
Pod,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use ostd::cpu::{CpuException, CpuExceptionInfo, UserContext};
|
use ostd::cpu::context::{CpuException, CpuExceptionInfo, UserContext};
|
||||||
|
|
||||||
use crate::process::signal::{
|
use crate::process::signal::{
|
||||||
constants::*, sig_num::SigNum, signals::fault::FaultSignal, SignalContext,
|
constants::*, sig_num::SigNum, signals::fault::FaultSignal, SignalContext,
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use core::{num::NonZeroU64, sync::atomic::Ordering};
|
use core::{num::NonZeroU64, sync::atomic::Ordering};
|
||||||
|
|
||||||
use ostd::{cpu::UserContext, sync::RwArc, task::Task, user::UserContextApi};
|
use ostd::{cpu::context::UserContext, sync::RwArc, task::Task, user::UserContextApi};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
posix_thread::{AsPosixThread, PosixThreadBuilder, ThreadName},
|
posix_thread::{AsPosixThread, PosixThreadBuilder, ThreadName},
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#![expect(dead_code)]
|
#![expect(dead_code)]
|
||||||
|
|
||||||
use ostd::{
|
use ostd::{
|
||||||
cpu::{CpuSet, UserContext},
|
cpu::{context::UserContext, CpuSet},
|
||||||
sync::RwArc,
|
sync::RwArc,
|
||||||
task::Task,
|
task::Task,
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use ostd::{cpu::UserContext, task::Task, user::UserContextApi};
|
use ostd::{cpu::context::UserContext, task::Task, user::UserContextApi};
|
||||||
|
|
||||||
use super::{builder::PosixThreadBuilder, name::ThreadName, PosixThread};
|
use super::{builder::PosixThreadBuilder, name::ThreadName, PosixThread};
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -19,7 +19,7 @@ use align_ext::AlignExt;
|
|||||||
use c_types::{siginfo_t, ucontext_t};
|
use c_types::{siginfo_t, ucontext_t};
|
||||||
use constants::SIGSEGV;
|
use constants::SIGSEGV;
|
||||||
pub use events::{SigEvents, SigEventsFilter};
|
pub use events::{SigEvents, SigEventsFilter};
|
||||||
use ostd::{cpu::UserContext, user::UserContextApi};
|
use ostd::{cpu::context::UserContext, user::UserContextApi};
|
||||||
pub use pause::{with_signal_blocked, Pause};
|
pub use pause::{with_signal_blocked, Pause};
|
||||||
pub use poll::{PollAdaptor, PollHandle, Pollable, Pollee, Poller};
|
pub use poll::{PollAdaptor, PollHandle, Pollable, Pollee, Poller};
|
||||||
use sig_action::{SigAction, SigActionFlags, SigDefaultAction};
|
use sig_action::{SigAction, SigActionFlags, SigDefaultAction};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use ostd::cpu::UserContext;
|
use ostd::cpu::context::UserContext;
|
||||||
|
|
||||||
use super::SyscallReturn;
|
use super::SyscallReturn;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use core::num::NonZeroU64;
|
use core::num::NonZeroU64;
|
||||||
|
|
||||||
use ostd::cpu::UserContext;
|
use ostd::cpu::context::UserContext;
|
||||||
|
|
||||||
use super::SyscallReturn;
|
use super::SyscallReturn;
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use aster_rights::WriteOp;
|
use aster_rights::WriteOp;
|
||||||
use ostd::{
|
use ostd::{
|
||||||
cpu::{FpuState, RawGeneralRegs, UserContext},
|
cpu::context::{FpuState, RawGeneralRegs, UserContext},
|
||||||
user::UserContextApi,
|
user::UserContextApi,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use ostd::cpu::UserContext;
|
use ostd::cpu::context::UserContext;
|
||||||
|
|
||||||
use super::SyscallReturn;
|
use super::SyscallReturn;
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
//! Read the Cpu ctx content then dispatch syscall to corresponding handler
|
//! Read the Cpu ctx content then dispatch syscall to corresponding handler
|
||||||
//! The each sub module contains functions that handle real syscall logic.
|
//! The each sub module contains functions that handle real syscall logic.
|
||||||
pub use clock_gettime::ClockId;
|
pub use clock_gettime::ClockId;
|
||||||
use ostd::cpu::UserContext;
|
use ostd::cpu::context::UserContext;
|
||||||
|
|
||||||
use crate::{context::Context, cpu::LinuxAbi, prelude::*};
|
use crate::{context::Context, cpu::LinuxAbi, prelude::*};
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ macro_rules! impl_syscall_nums_and_dispatch_fn {
|
|||||||
syscall_number: u64,
|
syscall_number: u64,
|
||||||
args: [u64; 6],
|
args: [u64; 6],
|
||||||
ctx: &crate::context::Context,
|
ctx: &crate::context::Context,
|
||||||
user_ctx: &mut ostd::cpu::UserContext,
|
user_ctx: &mut ostd::cpu::context::UserContext,
|
||||||
) -> $crate::prelude::Result<$crate::syscall::SyscallReturn> {
|
) -> $crate::prelude::Result<$crate::syscall::SyscallReturn> {
|
||||||
match syscall_number {
|
match syscall_number {
|
||||||
$(
|
$(
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use core::sync::atomic::Ordering;
|
use core::sync::atomic::Ordering;
|
||||||
|
|
||||||
use ostd::{cpu::UserContext, user::UserContextApi};
|
use ostd::{cpu::context::UserContext, user::UserContextApi};
|
||||||
|
|
||||||
use super::SyscallReturn;
|
use super::SyscallReturn;
|
||||||
use crate::{prelude::*, process::signal::c_types::ucontext_t};
|
use crate::{prelude::*, process::signal::c_types::ucontext_t};
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#![expect(unused_variables)]
|
#![expect(unused_variables)]
|
||||||
|
|
||||||
use aster_rights::Full;
|
use aster_rights::Full;
|
||||||
use ostd::cpu::*;
|
use ostd::cpu::context::{CpuExceptionInfo, UserContext};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
current_userspace,
|
current_userspace,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
use ostd::{
|
use ostd::{
|
||||||
cpu::UserContext,
|
cpu::context::UserContext,
|
||||||
task::{Task, TaskOptions},
|
task::{Task, TaskOptions},
|
||||||
user::{ReturnReason, UserContextApi, UserMode},
|
user::{ReturnReason, UserContextApi, UserMode},
|
||||||
};
|
};
|
||||||
|
@ -12,7 +12,7 @@ use alloc::sync::Arc;
|
|||||||
use alloc::vec;
|
use alloc::vec;
|
||||||
|
|
||||||
use ostd::arch::qemu::{exit_qemu, QemuExitCode};
|
use ostd::arch::qemu::{exit_qemu, QemuExitCode};
|
||||||
use ostd::cpu::UserContext;
|
use ostd::cpu::context::UserContext;
|
||||||
use ostd::mm::{
|
use ostd::mm::{
|
||||||
CachePolicy, FallibleVmRead, FrameAllocOptions, PageFlags, PageProperty, Vaddr, VmIo, VmSpace,
|
CachePolicy, FallibleVmRead, FrameAllocOptions, PageFlags, PageProperty, Vaddr, VmIo, VmSpace,
|
||||||
VmWriter, PAGE_SIZE,
|
VmWriter, PAGE_SIZE,
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
//! CPU
|
//! CPU execution context control.
|
||||||
|
|
||||||
pub mod local;
|
|
||||||
|
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
|
|
||||||
use riscv::register::scause::{Exception, Trap};
|
use riscv::register::scause::{Exception, Trap};
|
||||||
|
|
||||||
pub use super::trap::GeneralRegs as RawGeneralRegs;
|
pub use crate::arch::riscv::trap::GeneralRegs as RawGeneralRegs;
|
||||||
use super::trap::{TrapFrame, UserContext as RawUserContext};
|
use crate::{
|
||||||
use crate::user::{ReturnReason, UserContextApi, UserContextApiInternal};
|
arch::riscv::trap::{TrapFrame, UserContext as RawUserContext},
|
||||||
|
user::{ReturnReason, UserContextApi, UserContextApiInternal},
|
||||||
|
};
|
||||||
|
|
||||||
/// Cpu context, including both general-purpose registers and FPU state.
|
/// Cpu context, including both general-purpose registers and FPU state.
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
6
ostd/src/arch/riscv/cpu/mod.rs
Normal file
6
ostd/src/arch/riscv/cpu/mod.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
//! CPU context & state control and CPU local memory.
|
||||||
|
|
||||||
|
pub mod context;
|
||||||
|
pub mod local;
|
@ -1,8 +1,6 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
//! CPU.
|
//! CPU execution context control.
|
||||||
|
|
||||||
pub mod local;
|
|
||||||
|
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
use core::{
|
use core::{
|
||||||
@ -18,19 +16,14 @@ use num_derive::FromPrimitive;
|
|||||||
use num_traits::FromPrimitive;
|
use num_traits::FromPrimitive;
|
||||||
use spin::Once;
|
use spin::Once;
|
||||||
use x86::bits64::segmentation::wrfsbase;
|
use x86::bits64::segmentation::wrfsbase;
|
||||||
pub use x86::cpuid;
|
|
||||||
use x86_64::registers::{
|
use x86_64::registers::{
|
||||||
control::{Cr0, Cr0Flags},
|
control::{Cr0, Cr0Flags},
|
||||||
rflags::RFlags,
|
rflags::RFlags,
|
||||||
xcontrol::XCr0,
|
xcontrol::XCr0,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use super::trap::GeneralRegs as RawGeneralRegs;
|
|
||||||
use super::{
|
|
||||||
trap::{TrapFrame, UserContext as RawUserContext},
|
|
||||||
CPU_FEATURES,
|
|
||||||
};
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
arch::x86::CPU_FEATURES,
|
||||||
task::scheduler,
|
task::scheduler,
|
||||||
trap::call_irq_callback_functions,
|
trap::call_irq_callback_functions,
|
||||||
user::{ReturnReason, UserContextApi, UserContextApiInternal},
|
user::{ReturnReason, UserContextApi, UserContextApiInternal},
|
||||||
@ -44,6 +37,12 @@ cfg_if! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub use x86::cpuid;
|
||||||
|
|
||||||
|
pub use crate::arch::trap::{
|
||||||
|
GeneralRegs as RawGeneralRegs, TrapFrame, UserContext as RawUserContext,
|
||||||
|
};
|
||||||
|
|
||||||
/// Cpu context, including both general-purpose registers and FPU state.
|
/// Cpu context, including both general-purpose registers and FPU state.
|
||||||
#[derive(Clone, Default, Debug)]
|
#[derive(Clone, Default, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
@ -588,7 +587,7 @@ static XSAVE_AREA_SIZE: Once<usize> = Once::new();
|
|||||||
/// The max size in bytes of the XSAVE area.
|
/// The max size in bytes of the XSAVE area.
|
||||||
const MAX_XSAVE_AREA_SIZE: usize = 4096;
|
const MAX_XSAVE_AREA_SIZE: usize = 4096;
|
||||||
|
|
||||||
pub(super) fn enable_essential_features() {
|
pub(in crate::arch::x86) fn enable_essential_features() {
|
||||||
XSTATE_MAX_FEATURES.call_once(|| {
|
XSTATE_MAX_FEATURES.call_once(|| {
|
||||||
const XSTATE_CPUID: u32 = 0x0000000d;
|
const XSTATE_CPUID: u32 = 0x0000000d;
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ use tdx_guest::{
|
|||||||
handle_virtual_exception as do_handle_virtual_exception, tdcall, TdgVeInfo, TdxTrapFrame,
|
handle_virtual_exception as do_handle_virtual_exception, tdcall, TdgVeInfo, TdxTrapFrame,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::cpu::{RawGeneralRegs, UserContext};
|
use crate::cpu::context::{RawGeneralRegs, UserContext};
|
||||||
|
|
||||||
pub(crate) struct VirtualizationExceptionHandler {
|
pub(crate) struct VirtualizationExceptionHandler {
|
||||||
ve_info: TdgVeInfo,
|
ve_info: TdgVeInfo,
|
||||||
|
6
ostd/src/arch/x86/cpu/mod.rs
Normal file
6
ostd/src/arch/x86/cpu/mod.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
//! CPU context & state control and CPU local memory.
|
||||||
|
|
||||||
|
pub mod context;
|
||||||
|
pub mod local;
|
@ -119,7 +119,7 @@ pub(crate) unsafe fn init_on_ap() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn interrupts_ack(irq_number: usize) {
|
pub(crate) fn interrupts_ack(irq_number: usize) {
|
||||||
if !cpu::CpuException::is_cpu_exception(irq_number as u16) {
|
if !cpu::context::CpuException::is_cpu_exception(irq_number as u16) {
|
||||||
kernel::apic::with_borrow(|apic| {
|
kernel::apic::with_borrow(|apic| {
|
||||||
apic.eoi();
|
apic.eoi();
|
||||||
});
|
});
|
||||||
@ -178,7 +178,7 @@ pub(crate) fn enable_cpu_features() {
|
|||||||
cpuid.get_feature_info().unwrap()
|
cpuid.get_feature_info().unwrap()
|
||||||
});
|
});
|
||||||
|
|
||||||
cpu::enable_essential_features();
|
cpu::context::enable_essential_features();
|
||||||
|
|
||||||
let mut cr4 = x86_64::registers::control::Cr4::read();
|
let mut cr4 = x86_64::registers::control::Cr4::read();
|
||||||
cr4 |= Cr4Flags::FSGSBASE
|
cr4 |= Cr4Flags::FSGSBASE
|
||||||
|
@ -28,7 +28,7 @@ use spin::Once;
|
|||||||
use super::ex_table::ExTable;
|
use super::ex_table::ExTable;
|
||||||
use crate::{
|
use crate::{
|
||||||
arch::irq::{disable_local, enable_local},
|
arch::irq::{disable_local, enable_local},
|
||||||
cpu::{CpuException, CpuExceptionInfo, PageFaultErrorCode},
|
cpu::context::{CpuException, CpuExceptionInfo, PageFaultErrorCode},
|
||||||
cpu_local_cell, if_tdx_enabled,
|
cpu_local_cell, if_tdx_enabled,
|
||||||
mm::{
|
mm::{
|
||||||
kspace::{KERNEL_PAGE_TABLE, LINEAR_MAPPING_BASE_VADDR, LINEAR_MAPPING_VADDR_RANGE},
|
kspace::{KERNEL_PAGE_TABLE, LINEAR_MAPPING_BASE_VADDR, LINEAR_MAPPING_VADDR_RANGE},
|
||||||
|
@ -27,7 +27,7 @@ pub use self::{
|
|||||||
scheduler::info::{AtomicCpuId, TaskScheduleInfo},
|
scheduler::info::{AtomicCpuId, TaskScheduleInfo},
|
||||||
};
|
};
|
||||||
pub(crate) use crate::arch::task::{context_switch, TaskContext};
|
pub(crate) use crate::arch::task::{context_switch, TaskContext};
|
||||||
use crate::{cpu::UserContext, prelude::*, trap::in_interrupt_context};
|
use crate::{cpu::context::UserContext, prelude::*, trap::in_interrupt_context};
|
||||||
|
|
||||||
static POST_SCHEDULE_HANDLER: Once<fn()> = Once::new();
|
static POST_SCHEDULE_HANDLER: Once<fn()> = Once::new();
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
//! User mode.
|
//! User mode.
|
||||||
|
|
||||||
use crate::{cpu::UserContext, trap::TrapFrame};
|
use crate::{cpu::context::UserContext, trap::TrapFrame};
|
||||||
|
|
||||||
/// Specific architectures need to implement this trait. This should only used in [`UserMode`]
|
/// Specific architectures need to implement this trait. This should only used in [`UserMode`]
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user