xref: /DragonOS/kernel/src/arch/x86_64/process/kthread.rs (revision bd70d2d1f490aabd570a5301b858bd5eb04149fa)
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