11496ba7bSLoGin use core::arch::asm;
21496ba7bSLoGin
31496ba7bSLoGin use alloc::sync::Arc;
491e9d4abSLoGin use system_error::SystemError;
51496ba7bSLoGin
61496ba7bSLoGin use crate::{
71496ba7bSLoGin arch::{
81496ba7bSLoGin interrupt::TrapFrame,
91496ba7bSLoGin process::table::{KERNEL_CS, KERNEL_DS},
101496ba7bSLoGin },
111496ba7bSLoGin process::{
121496ba7bSLoGin fork::CloneFlags,
131496ba7bSLoGin kthread::{kernel_thread_bootstrap_stage2, KernelThreadCreateInfo, KernelThreadMechanism},
141496ba7bSLoGin Pid, ProcessManager,
151496ba7bSLoGin },
161496ba7bSLoGin };
171496ba7bSLoGin
181496ba7bSLoGin impl KernelThreadMechanism {
191496ba7bSLoGin /// 伪造trapframe,创建内核线程
201496ba7bSLoGin ///
211496ba7bSLoGin /// ## 返回值
221496ba7bSLoGin ///
231496ba7bSLoGin /// 返回创建的内核线程的pid
__inner_create( info: &Arc<KernelThreadCreateInfo>, clone_flags: CloneFlags, ) -> Result<Pid, SystemError>241496ba7bSLoGin pub fn __inner_create(
251496ba7bSLoGin info: &Arc<KernelThreadCreateInfo>,
261496ba7bSLoGin clone_flags: CloneFlags,
271496ba7bSLoGin ) -> Result<Pid, SystemError> {
281496ba7bSLoGin // WARNING: If create failed, we must drop the info manually or it will cause memory leak. (refcount will not decrease when create failed)
291496ba7bSLoGin let create_info: *const KernelThreadCreateInfo =
301496ba7bSLoGin KernelThreadCreateInfo::generate_unsafe_arc_ptr(info.clone());
311496ba7bSLoGin
321496ba7bSLoGin let mut frame = TrapFrame::new();
331496ba7bSLoGin frame.rbx = create_info as usize as u64;
341496ba7bSLoGin frame.ds = KERNEL_DS.bits() as u64;
351496ba7bSLoGin frame.es = KERNEL_DS.bits() as u64;
361496ba7bSLoGin frame.cs = KERNEL_CS.bits() as u64;
371496ba7bSLoGin frame.ss = KERNEL_DS.bits() as u64;
381496ba7bSLoGin
391496ba7bSLoGin // 使能中断
401496ba7bSLoGin frame.rflags |= 1 << 9;
411496ba7bSLoGin
421496ba7bSLoGin frame.rip = kernel_thread_bootstrap_stage1 as usize as u64;
431496ba7bSLoGin
441496ba7bSLoGin // fork失败的话,子线程不会执行。否则将导致内存安全问题。
45*bd70d2d1SLoGin let pid = ProcessManager::fork(&frame, clone_flags).inspect_err(|_e| {
461496ba7bSLoGin unsafe { KernelThreadCreateInfo::parse_unsafe_arc_ptr(create_info) };
471496ba7bSLoGin })?;
481496ba7bSLoGin
491496ba7bSLoGin ProcessManager::find(pid)
501496ba7bSLoGin .unwrap()
511496ba7bSLoGin .set_name(info.name().clone());
521496ba7bSLoGin
531496ba7bSLoGin return Ok(pid);
541496ba7bSLoGin }
551496ba7bSLoGin }
561496ba7bSLoGin
571496ba7bSLoGin /// 内核线程引导函数的第一阶段
581496ba7bSLoGin ///
591496ba7bSLoGin /// 当内核线程开始执行时,会先执行这个函数,这个函数会将伪造的trapframe中的数据弹出,然后跳转到第二阶段
601496ba7bSLoGin ///
611496ba7bSLoGin /// 跳转之后,指向Box<KernelThreadClosure>的指针将传入到stage2的函数
621496ba7bSLoGin #[naked]
kernel_thread_bootstrap_stage1()631496ba7bSLoGin pub(super) unsafe extern "sysv64" fn kernel_thread_bootstrap_stage1() {
641496ba7bSLoGin asm!(
651496ba7bSLoGin concat!(
661496ba7bSLoGin "
671496ba7bSLoGin
681496ba7bSLoGin pop r15
691496ba7bSLoGin pop r14
701496ba7bSLoGin pop r13
711496ba7bSLoGin pop r12
721496ba7bSLoGin pop r11
731496ba7bSLoGin pop r10
741496ba7bSLoGin pop r9
751496ba7bSLoGin pop r8
761496ba7bSLoGin pop rbx
771496ba7bSLoGin pop rcx
781496ba7bSLoGin pop rdx
791496ba7bSLoGin pop rsi
801496ba7bSLoGin pop rdi
811496ba7bSLoGin pop rbp
821496ba7bSLoGin pop rax
831496ba7bSLoGin mov ds, ax
841496ba7bSLoGin pop rax
851496ba7bSLoGin mov es, ax
861496ba7bSLoGin pop rax
871496ba7bSLoGin add rsp, 0x20
881496ba7bSLoGin popfq
891496ba7bSLoGin add rsp, 0x10
901496ba7bSLoGin mov rdi, rbx
911496ba7bSLoGin jmp {stage2_func}
921496ba7bSLoGin "
931496ba7bSLoGin ),
941496ba7bSLoGin stage2_func = sym kernel_thread_bootstrap_stage2,
951496ba7bSLoGin options(noreturn)
961496ba7bSLoGin )
971496ba7bSLoGin }
98