Move CPU context implementations to a specific module

This commit is contained in:
Zhang Junyang 2025-03-05 15:17:32 +08:00 committed by Tate, Hongliang Tian
parent fc67adb1f0
commit f1c7564184
24 changed files with 49 additions and 38 deletions

View File

@ -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,
}; };

View File

@ -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,

View File

@ -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},

View File

@ -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,
}; };

View File

@ -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::{

View File

@ -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};

View File

@ -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::*;

View File

@ -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::{

View File

@ -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,
}; };

View File

@ -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::{

View File

@ -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 {
$( $(

View File

@ -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};

View File

@ -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,

View File

@ -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},
}; };

View File

@ -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,

View File

@ -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)]

View 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;

View File

@ -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;

View File

@ -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,

View 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;

View File

@ -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

View File

@ -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},

View File

@ -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();

View File

@ -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`]
/// ///